RECEIPT · DEDUPE STATE + SOURCE LINKS

Research watch loop

A supervised landscape-watch pass read a fixture source, wrote a cited report, saved seen-source state, then reran to prove duplicate suppression.

Task loopTask loop: the checked pass varied actions inside one bounded watch job — fetch, dedupe, report, stop.

Verified: the checked-in log records the first run, duplicate-suppression run, check rule, evidence, state file, skipped actions, and stop outcome.

Goal loop proof: we've run one — read the log. Scheduled and task examples link their own run logs below.

All examplesRun log

LOG NOTES

What the log proves.

Contract / check
First pass must record new source items; second pass with the same state must suppress duplicates; fetch errors must stay at zero.
What varied
Actions inside a single research-watch task: read sources, compare seen state, write report, update duplicate-suppression state.
Stop reason
Done: duplicate-suppression check succeeded and the fixture required no human escalation.
Cost / budget
Budget: one supervised dry run plus one duplicate-suppression check, max five items. Monetary cost: unknown; the log does not record spend.
Underlying log
examples/research-watch/2026-07-09-pass-log.md lines 12–34 record both commands, check evidence, state, skipped actions, and clean stop.
Template
The research-watch template guide and source file define the reusable research-watch loop.
Learn lesson
Loops all the way up: this log is a verified task loop only; the separate K6 log is the bounded goal-loop example.

FILLED PLAN

The one-page loop plan.

Goal
Notice new high-signal research or tooling changes without repeatedly surfacing the same source.
Trigger
Weekly schedule or manual landscape review.
State
A seen-source list plus last report, last run timestamp, new-item count, and fetch errors.
Repeated pass
Fetch configured sources, dedupe against state, write a cited report, update state.
Check
Fetch errors stay at zero, every item has a durable source path or URL, and a duplicate pass returns zero new items.
Stop rule
Stop when no new source items remain; escalate only concrete source-backed changes.
Approvals
Human approval before publishing findings, changing product direction, credentials, or resource entries.
Runner
Python helper first; schedule only after source list and gates are reviewed.

REAL RUN LOG

The evidence this example earned.

The pass log records `NEW_ITEMS=1` then `NEW_ITEMS=0` with the same state file, `FETCH_ERRORS=0`, and `seen: ["docs/research/loop-landscape.md"]`.

Pass log: Research watch loop / 2026-07-09 19:44 UTC

Pass type: supervised dry run plus duplicate-suppression check Operator: Hermes coder agent Harness used for this pass: checked-in Python runner

Plan version or source: checked-in research-watch template source Input used: templates/research-watch/examples/dry-run-sources.json Allowed actions: read repo source file, write report under /tmp, write duplicate-suppression state under /tmp Approval gates active: public publishing, product direction changes, credential changes, merging proposed resource entries

What ran:

  • First command: python3 templates/research-watch/scripts/research_watch.py --sources templates/research-watch/examples/dry-run-sources.json --state /tmp/lm-c5-research-state.json --output-dir /tmp/lm-c5-research --max-items 5
  • First output: RESEARCH_WATCH_REPORT=/tmp/lm-c5-research/2026-07-09-research-watch.md, NEW_ITEMS=1, FETCH_ERRORS=0
  • Second command: same runner, same source, same state file.
  • Second output: RESEARCH_WATCH_REPORT=/tmp/lm-c5-research/2026-07-09-research-watch.md, NEW_ITEMS=0, FETCH_ERRORS=0

Check result:

  • Result: PASS
  • Check rule: a first pass records new source items, a second pass with the same state suppresses duplicates, and fetch errors stay at zero.
  • Evidence: the state file recorded seen: ["docs/research/loop-landscape.md"], and the second report said no new source items since the previous recorded state.

State written:

  • /tmp/lm-c5-research-state.json, with seen, last_report, last_new_items, last_errors, and last_run_at.

Skipped actions:

  • Did not publish research findings publicly.
  • Did not change product direction.
  • Did not merge or propose resource entries.
  • Did not use web-search credentials.
  • Did not schedule an unattended run.

Stop/escalation outcome:

  • Stopped cleanly after the duplicate-suppression check. No human escalation was required for the fixture.

Harness decision after this pass:

  • GitHub Actions, cron, or kanban task remain viable runners; not scheduled by this pass.
  • Reason: the pass proved source fetching, carried state, duplicate suppression, and approval gates.

Next action:

  • Replace the fixture source list with project-specific sources before any live landscape watch run.

WHAT IT TEACHES

The pattern to copy.

Research loops need carried state and source evidence; otherwise a scheduled search becomes a noisy repeated prompt.