feat(skills): reader-side contradiction reports — foresight emits, manager adjudicates (#24) - #25
Conversation
…nager adjudicates Implements the channel proposed in ARA-Labs#24 without touching CONTRACT.md §4b: - research-foresight/references/PREDICT.md: optional `contradiction_report` field on the Answer object + §7 defining when to emit one. Output only — the engine still writes nothing, anywhere; the caller owns transport (a `reader-report` issue on the ARA's repository, or a file handed to the next research-manager run). - research-manager/SKILL.md: Stage 1 harvests reader reports as candidate events; a new Stage 3 subsection routes them through the EXISTING contradiction trigger (flag CONFLICT, append an unresolved decision node, defer to the researcher). Reports are never auto-applied; the single-writer rule is unchanged. - research-manager/templates/reader-report.md: shared report shape for agent- and human-filed reports. - Version bumps: research-manager 2.4.0→2.5.0, research-foresight 1.0.0→1.1.0 (PREDICT.md 1.0.0→1.1.0). Motivating case: ara-ls20 C02 (RESET semantics), where two sessions of contradicting reader-side observations could only be parked in HTML comments pending a researcher pass. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RSRisCyn8iHnBBuHMrWg6f
|
Thanks a lot for this — and especially for actually running the amended contract end-to-end against a real ARA and filing the companion fold-in on Two change requests before merge: 1. Drop the ls20/C02 example from PREDICT.md §7. 2. Let On the open questions:
Thanks again for the careful work here — looking forward to the updated revision. |
…rn adjudication - PREDICT.md §7: concrete ls20/C02 example removed; general rule only - CONTRACT.md §3: PREDICT writes cell names contradiction_report as sanctioned output-for-transport, foreclosing any §4b reading against it - research-manager: reader reports are adjudicated in the turn they arrive — verified against ARA-resolvable evidence, then upheld (Stage 4 fold-in with logic_revisions before/after + resolved decision node) or rejected (verdict + reason recorded); the human is notified after the fact, never left an open ticket. Upholding requires corroboration resolvable inside the ARA; reports resting only on unresolvable reader-side pointers are rejected as unverifiable (repro preserved). Scoped as an explicit exception to the contradiction trigger defer rule. - templates/reader-report.md: comment updated to the adjudicate-and-notify flow Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RSRisCyn8iHnBBuHMrWg6f
|
Revised in cb90efc — all three in:
One design decision in the revision worth your sanity-check: upholding requires corroboration resolvable inside the ARA (trace nodes, evidence files, session records). A report resting only on reader-side pointers the manager cannot resolve is rejected as Also flagging the scoping explicitly: the subsection is written as an exception to the contradiction trigger's defer rule, limited to reader reports — the manager's own mid-research contradictions still defer to the researcher. If removing the human from that loop is also on the roadmap, it feels like its own PR. |
|
lgtm |
…d — falls back to CONFLICT flag + unresolved node A report the ARA can neither corroborate nor refute is possibly true; closing it as rejected (status: resolved) leaves the disputed entry looking clean and buries the dispute in the session record. Unverifiable reports now take the pre-existing defer path instead: CONFLICT flag on the entry + unresolved decision node carrying the repro for a future run. Rejected is reserved for reports the evidence positively shows wrong. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Thanks — verified the revision against the diff and everything checks out. The corroboration gate is the right call, and thanks for flagging it explicitly rather than burying it; the poisoning vector you describe is exactly why it belongs there. The scoping is also right — the manager's own mid-research contradictions staying deferred is its own discussion, not this PR. One refinement, which I've pushed directly to your branch as 5debf2b to save a round-trip: The reasoning: a report the ARA can positively refute deserves a clean close — but a report the ARA can neither corroborate nor refute is possibly true, and closing it as Please take a look at the commit — if it reads right to you, this is mergeable as far as I'm concerned. Thanks again for a genuinely well-built contribution, and for the ara-ls20 companion PR, which we'll take next. |
|
5debf2b reads right — confirmed against the diff. The three-verdict split is the correct resolution of the tension I was trading away: I had collapsed "provably wrong" and "can't check" into one closed verdict to guarantee no open tickets, but an uncheckable-yet-possibly-true dispute closing silently is indeed C02 reintroduced one level up. Reserving |
Implements #24. Ready for review — the three open questions at the bottom are genuinely open, and the diff is kept minimal so any answer to them is a small follow-up rather than a rework.
Design constraints respected
contradiction_reportis part of the Answer output; the caller owns transport (areader-reportissue on the ARA's repository, or a file handed to the nextresearch-managerrun).research-managerremains the ARA's only writer; a report is input to it, never an edit. Reports are adjudicated by the manager in the turn they arrive — verified against ARA-resolvable evidence, then upheld (Stage-4 fold-in, full provenance and before/after recorded) or rejected (verdict + reason) — with an after-the-fact summary to the human, never an open ticket.Changes
research-foresight/references/PREDICT.mdcontradiction_reportfield on the Answer object (§3) + new §7 defining when to emit one (positive conflicting evidence only; thin coverage stays §6); version 1.0.0→1.1.0research-manager/SKILL.mdresearch-manager/templates/reader-report.mdresearch-foresight/SKILL.mdresearch-foresight/references/CONTRACT.mdcontradiction_reportnamed as sanctioned output-for-transportTested with real usage
Executed the amended PREDICT contract against
ARA-Labs/ara-ls20atmain(pre-fix state, where C02 still carried the stale RESET reading). The report it produces:Running the amended
research-managerrules on that report yields exactly the adjudication filed as the companion PR: ARA-Labs/ara-ls20#1 — i.e. the mechanism reproduces, end-to-end, the fold-in that C02's comments had been waiting on since 2026-06-29.Open questions for maintainers
reader-reportlabel), an inbox-file convention, or both?ai-suggested(report ref recorded incontext) to keep the diff minimal — is a dedicatedreader-reportedtag worth the schema touch for trust calibration?🤖 Generated with Claude Code
https://claude.ai/code/session_01RSRisCyn8iHnBBuHMrWg6f