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 examples · Run 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.