122 Commits

Author SHA1 Message Date
Dídac Rios a366e39e2e Add conservative es-ES trigger keywords to the four skills (#856)
* add conservative es-ES trigger keywords to the four skills

* address review: re-pin pipeline content lock, add verificar citas, fix reseñas typo

* address review items 4-6: trim deep-research es subset under 1,024, drop standalone investigación, add es-ES routing fixtures
2026-09-14 11:21:50 +08:00
Edward Cheng-I Wu 88725b8a55 fix(academic-paper): advertise revision-coach rebuttal triggers in the SKILL.md description (#851) (#853)
The revision-coach phrases "I got reviewer comments", "revision roadmap",
"should we push back", "conference rebuttal", "grant panel response" lived
only in the SKILL.md body, which the model reads after deciding to load
the skill. Add them (plus zh-TW/ko equivalents) to the frontmatter
description (699 chars, under the 1,024 Claude Code allowance) and add
the three missing English phrases to the body Trigger Keywords line.

Verification: plugin-evals/03-iclr-rebuttal-en skill-fired 0/2 -> 7/7.
The case's two llm rubrics are rewritten in enumerate-then-quote style;
the earlier claim-list phrasing drew 3-vote FAILs from the runner judge
on outputs a reasoning judge passed. README caveats updated.

Closes #851


Claude-Session: https://claude.ai/code/session_013fbc5qpXkAac1o4HLMGinE

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-12 23:55:20 +08:00
Edward Cheng-I Wu 6b7ee6dcae fix: Astra request compat, no-delegation citation transport, hedge/quota prompt repairs, audit provenance (#823–#826) (#827)
* fix: Astra request compatibility, no-delegation citation transport, hedge/quota prompt repairs, audit provenance (#823 #824 #825 #826)

#823 — OpenAI request builders (smoke entrypoint + documented example) drop
`temperature`, which GPT-6 Astra rejects; the per-model effort vocabulary
lives in scripts/cross_model_verification/openai_effort_guard.sh, sourced by
both, and an unsupported explicit Astra value fails before curl. Hermetic
fake-curl test runs both surfaces.

#824 — the contained Codex citation transport rejects effort=ultra with
REASONING_EFFORT_REQUIRES_DELEGATION before detection/auth/tempdir/launch on
both entry paths (codex-cli 0.153.4 defines ultra as the multiAgentMode
replacement). Model-independent by design.

#825 — hedging can no longer rescue an unsupported claim (writer recovery
tree, CER fallback row, temporal rule 5 in writer + both compiler mirrors,
writer contract D2); universal prose quotas in the writer, compilers,
writing_quality_check.md, academic-paper/SKILL.md, and contract D6 become
diagnostics subordinate to author/venue requirements. Audit inventory
corrected in place; held-out seed evals/heldout/unsupported_claim_recovery
(NOT_RUN) registered.

#826 — run_codex_audit.sh pins gpt-6-astra/xhigh and records both in a new
sidecar `model` block; claim_audit_pipeline binds an unknown judge identity
to a run-local cache key (no cross-run reuse) instead of defaulting to
gpt-5.5-xhigh.

Review: /simplify (4 angles), codex gpt-5.6-sol xhigh 2 rounds (r1: 1 P1 +
1 P2 + 2 P3 fixed; r2: 0 P1/P2), /security-review 0 findings; all 102
spec-consistency steps + pytest manifest replayed locally.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BNKiXpdHx1T5F5RbXT2Ueu

* docs(claude): record the #824 ultra reversal in the v3.21.2 key-additions line

The v3.21.2 bullet still said the contained Codex citation transport accepts
ultra; #824 on this branch rejects it as a delegation request. Add the
reversal so the live instruction surface matches the transport.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K7emV5r2aqZDJzAyYVuuDo

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-06 08:08:30 +09:00
LeslieLi46 37bd060294 docs: fix duplicated word in MLA citation key rules (#805)
Docs-only: academic-paper/references/citation_format_switcher.md MLA key rules line read "No year in in-text"; now "No year in-text", matching the in-text format documented above it. No lint or hash lock pins this file. Contributed by @LeslieLi46.
2026-08-30 23:36:43 +08:00
Edward Cheng-I Wu 7ef93e0cb5 docs: re-derive data_access_level for academic-paper and academic-paper-reviewer (#773) (#793)
* docs: re-derive data_access_level for academic-paper and academic-paper-reviewer under the dirtiest-input rule (#773)

Applying the #756 derivation to the two carried-over pins the lint
docstring flagged as un-derived:

- academic-paper: redacted -> raw. Standalone modes ingest ungated user
  drafts and third-party reviewer comments, and literature_strategist's
  search-fills-gap flow ingests external-index search results inside the
  skill. The former value described only the post-Gate-2.5 pipeline path.
- academic-paper-reviewer: verified_only -> raw. The standalone
  /ars-reviewer entry (Routing Step 1 routes "review my paper" directly)
  legitimately consumes an ungated pasted manuscript; the rule
  quantifies over ALL entry paths. Pipeline positioning unchanged.
- deep-research: raw survives by a ceiling argument (no derivation can
  dirty the dirtiest value); recorded so no pin remains an un-derived
  carryover.

EXPECTED_LEVELS provenance note rewritten per-pin; ARCHITECTURE §4
diagram + rules now separate the per-skill intake annotation from the
per-stage output data level (§3 column, unchanged). Declarative only.

Closes #773

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015NZwcSFBwiJBZEtsSTcCxq

* review: address codex findings on #773 — precise gate-sequencing claims, deep-research derivation

- academic-paper's former 'redacted' is described as the orchestrated
  pipeline path (Stage-1 sanitized inputs), not "post-Gate-2.5" — Stage 2
  precedes Gate 2.5.
- academic-paper-reviewer's former 'verified_only' is stated as at best
  true for the initial Stage 3 dispatch; Stage 3' re-review consumes a
  freshly revised manuscript before Stage 4.5.
- deep-research's raw is re-affirmed on its actual inputs (raw queries +
  unverified search results); the ceiling argument becomes supplementary
  rather than the derivation itself.

Applied consistently across the lint docstring, ARCHITECTURE §4, and the
CHANGELOG entry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015NZwcSFBwiJBZEtsSTcCxq

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-20 13:26:07 +08:00
Edward Cheng-I Wu 6837b4dfea docs(release): prepare v3.20.1 (#748)
Promote all release-worthy changes since v3.20.0, align suite and component versions, refresh all five release summaries, and close merge-provenance coverage for v3.20.1.

[doc-aligned: 2026-08-15]
2026-08-15 16:58:38 +08:00
Edward Cheng-I Wu 54507ece69 fix: harden v3.20 review and integrity contracts (#747)
Closes #734
Closes #735
Closes #736
Closes #737
Closes #738
Closes #739
Closes #740
2026-08-15 15:04:28 +08:00
Edward Cheng-I Wu 3af9f03d5a docs(release): prepare v3.20.0 (#727)
Promote the accumulated Unreleased changes, align the suite and component
versions, refresh all five release summaries, and close merge-provenance
coverage for the v3.20.0 release.

Release gates:
- version and spec consistency
- CHANGELOG merge coverage
- pipeline boundary content locks
- pytest manifest and agents mirror checks
- 197 focused tests

[doc-aligned: 2026-08-14]
2026-08-14 08:57:24 +08:00
Edward Cheng-I Wu b0fd742ed4 Bind review criteria across consumers (#684) (#706) 2026-08-11 15:01:26 +08:00
Edward Cheng-I Wu ece4af0bb8 feat: add cross-document consistency advisory (#672) 2026-08-10 15:27:44 +08:00
Edward Cheng-I Wu 86bf0e5c2c feat: add hermetic tortured-phrase screening (#699)
Refs #660. Measurement and issue closure follow in the separately preregistered post-main mechanical conformance PR.
2026-08-10 12:28:42 +08:00
Edward Cheng-I Wu 917860b0f8 feat: add non-ranking revision roadmap contract (#697)
* feat: add non-ranking revision roadmap contract (#670)

* fix: isolate revision authority prompt budget
2026-08-10 03:42:09 +08:00
Edward Cheng-I Wu 74540f8e9f feat: add deterministic retraction status (#691)
* feat: add deterministic retraction status (#651)

* fix: keep retraction policy within prompt budget (#651)
2026-08-09 07:05:18 +08:00
Edward Cheng-I Wu 033491c1b6 feat: add committee correspondence tracker (#668) (#690) 2026-08-09 00:29:31 +08:00
Edward Cheng-I Wu 20c937aa22 chore(prompts): complete August harness-retirement audit (#617) (#688) 2026-08-09 00:19:43 +08:00
Edward Cheng-I Wu 682b30a200 feat: harden integrity and evaluation contracts (#685)
* feat: harden integrity and evaluation contracts

Refs #657, #664, #665, #671, #674, and #678.

* fix: close integrity review blockers

* fix: support frozen rows in shallow CI
2026-08-08 20:44:37 +08:00
Edward Cheng-I Wu eba1d3842d fix(disclosure): move Frontiers checks to submission actions (#619) (#621) 2026-08-02 00:12:04 +08:00
Ktao 99ceffe93e feat(disclosure): add medical venue policies and fail-closed rendering (#599)
* docs(disclosure): add medical venue entries incl. first Chinese-language venues (#596)

venue_disclosure_policies.md moves to v2, growing from 6 to 15 venues:
the ICMJE umbrella recommendations (referral baseline for its member
journals, mirroring the EMNLP->ACL referral structure), NEJM, The
Lancet, JAMA, BMJ, PLOS, Frontiers, and the database's first two
Chinese-language entries — Chinese Nursing Journals Publishing House
(中华护理杂志社) and International Eye Science (国际眼科杂志), with
verbatim policy language kept in the original Chinese plus English
paraphrase.

Every Source URL is official (never a third-party summary): 6 entries
live-verified 2026-07-27; NEJM / The Lancet / JAMA serve bot-protection
challenges to non-browser clients, so their official URLs are verified
against Internet Archive snapshots of those same URLs (noted per-row).

Venue-count surfaces synced: Scope line, disclosure_mode_protocol
dispatch table + venue input + failure cases + references,
academic-paper/SKILL.md venue list, /ars-disclosure command text,
mode_selection_guide, ARCHITECTURE stage table, and the 5 READMEs
(release-history lines kept intact, amended with a since-expanded
note).

Held back on purpose: the Chinese Medical Association Publishing House
GenAI regulation. Its primary text was verified first-hand on the
publisher's official WeChat channel, but only session-signed URLs
exist and archive capture is captcha-blocked, so there is no durable
official URL to cite. Accuracy over completeness.

No policy-anchor track changes (4-anchor inventory closed), no
format-profile content (#439 boundary), no detection-threshold numbers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(disclosure): address medical venue review feedback (#596)

* fix(disclosure): harden medical venue policy gates (#596)

* docs: credit medical disclosure contribution (#596)

* fix(disclosure): close medical venue review gaps (#596)

---------

Co-authored-by: 直播 <zhibo@zhibodeMacBook-Air.local>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: ktao732084-arch <254419203+ktao732084-arch@users.noreply.github.com>
2026-08-01 20:44:19 +08:00
Edward Cheng-I Wu af11397597 feat(reviewer): harden protocol text consistency (#611) (#618) 2026-08-01 19:18:11 +08:00
Edward Cheng-I Wu 6cd560690e feat(re-review): #576 Spec B PR-B2 — three-gate contract becomes Stage 3' default (protocol + orchestration) (#606)
* feat(re-review): #576 Spec B PR-B2 — three-gate contract becomes Stage 3' default (protocol + orchestration)

Second leg of the B1→B2→B3 chain. §16 delivery-surface map, all rows:

A. reviewer surfaces: re_review_mode_protocol.md rewritten around the
   three-gate orchestration (replaces the read-letter-first Traceability
   Rule; verdict vocabulary +CANNOT_VERIFY; §6 G0-G2/B1-B6/floors with
   mechanized p2_addressed_rate; generic P2 MADE_WORSE discriminator;
   dissent/new-issue/escalation/routing/input-manifest sections; legacy
   flag; Judge Independence REPLACEs — author's claim leaves judge
   inputs, explicit-supersession convention, §9 resolution-state
   derivation, per-emission cross_model_status note; Judge Record gains
   Pre-committed criteria / Routing / Apply-report chain lines; ordered
   chain REPLACES the single-report output_draft_hash rule; input list
   gains the original draft). sprint_contract_protocol §7 row →
   dedicated family; reviewer SKILL 3 spots; contracts README;
   reviewer_re_review removed from the Schema 13 enum + rejection
   regression test (§5.4).

B. pipeline surfaces (seven parallel Stage 4→3' lists in one commit):
   orchestrator § Stage 3' Re-Review Contract Dispatch (manifest before
   Phase 1, three validated gates, three post-2B passes ORDER NORMATIVE,
   MANDATORY checker before any outcome, deferral loop, abort surfacing,
   producer obligations, legacy boundary); Stage 4→3' row + NEW Stage
   3'→4.5 row + extended 4/4'→4.5 row (frozen previously_missed/
   indeterminate records as gate INPUT); integrity agent consumes BOTH
   attributions; state tracker Recommended column; state machine Normal
   Flow row + matrix three changes (sidecar row, Verified Paper Draft
   per-stage qualifier, Apply report(s) ordered-chain pointer); pipeline
   SKILL narrative + Step-4 enumeration; two_stage_review_protocol;
   team_collaboration_protocol; CONTENT_LOCKS re-pinned same commit.

C. schema/template surfaces: Schema 11 sidecar note + status enum
   CANNOT_VERIFY + legacy-scoped authors_claim flag consequence; Schema
   7 consensus_level SINGLE-VERIFIER; Schema 6 judge_record 3 optional
   fields (precommitment_hash / routing_status oneOf / apply_chain_
   witness); R<n>-follows-must_fix-order ordinal contract pinned in the
   letter template + synthesizer (R side only); revision_patch_protocol
   consumer rule → §11 ordered chain.

D. degradation registry 1.1.0 registers all 14 #576 mechanisms (marker
   family + apply-chain not-run states) with fixture tests; §8 routing
   fixtures (Accept-direct + Major-via-4') prove frozen records reach
   AND are ingested at 4.5; CHANGELOG Unreleased entry (no version
   bump).

Spec collision resolved: check_decision_contract's score-threshold
residency scan false-fired on §6's item-proportion quantifiers (50% of
P1, 80% addressed rate — a different decision system, recomputed by the
executable checker); the lint gains a scoped RE_REVIEW_PROTOCOL
exemption and its authority-table re-review row (which anticipated
'until #576 Spec B replaces its contract') is updated in the same
commit.

All spec-consistency lints + the 78-entry CI pytest manifest green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMxWsnnFwkyU7NxknbuM1R

* fix(re-review): close round-1 three-track findings (2 P1 + 3 P2 deduped) + CI line budget

Codex track (gpt-5.6-sol xhigh) P1s:
- check_decision_contract exemption narrowed from file-scoped to
  literal-scoped: the three sanctioned §6 item-proportion literals are
  MASKED before the score-scale scans, which then run on the residue —
  a reintroduced 0-100 score rule in the protocol fails again; reverse
  mutation test + sanctioned-literal presence test added.
- Stage 3' execution roster de-conflicted with §10: Phase 1/2A verify
  each P1/P2 item UNDER its routed seat persona (frozen Round-1 cards;
  routing changes the persona, not the call count), EIC/synthesizer own
  Phase 2B + integration — protocol Execution-shape paragraph, reviewer
  SKILL mode row + reference-consumers row, orchestrator dispatch step 2.

Shared P2s (both tracks):
- Seven parallel Stage 4→3' lists now ALL carry Round-1 review findings
  (Schema 6 reports, the §4 level-3 layer) and the paired revision
  patch/diff files (reports-without-patches = manifest_incomplete);
  protocol § Input Manifest gains the revision_patches[]/apply_reports[]
  co-presence + by-position pairing policy; state-machine matrix Review
  Reports row extends to Stage 3', Apply report(s) row names the pair.
- §8 REV-PM-<n> closed mapping delivered in full on the operative
  protocol surface (description prefix back-reference, reviewer =
  found_by, type/priority/target_section/suggested_action/
  verification_criteria/consensus_level + all four transported fields);
  full-field prose fixture pins every derivation.
- Adjustment table carries the complete basis-discriminated source_ref
  contract (acceptance:<id> REQUIRED on user_accepted_fail_closed,
  reapplication:<id> on cross_model_adjudication, FORBIDDEN elsewhere).

General track (Opus 5 xhigh) P2:
- The three unconditional scoped-2B'-call sentences gain the §6
  dissent-ONLY judge-shortcut exception (divergence rows never shortcut);
  stale Judge Record 'verification-logic sections' reference updated.

CI: test_v3_6_7_phase_6_6 gains the #576 Stage 3' dispatch block measure
(+30-line dedicated budget) subtracted from the v3.6.7 scope, mirroring
the #390/#394/v3.10 precedent. CONTENT_LOCKS re-pinned (4 files, same
commit). Security track round-1: CONVERGED 0/0. All lints + 78-entry
manifest green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMxWsnnFwkyU7NxknbuM1R

* fix(re-review): round-2 convergent P2 — apply-chain witness back-reference re-numbered (Input item 7 → 8)

Both non-security tracks independently converged on the single finding:
round-1 fix #4 inserted Round-1 findings as Input item 6, shifting the
apply reports to item 8, but § Input Manifest's apply-chain sentence
still pointed at item 7 (now the config cards). One-token fix; protocol
bytes untouched elsewhere (re_review_mode_protocol.md is not CONTENT_LOCKS-
pinned, no re-pin needed). Security round-2: 0/0; CI green at 891872d.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMxWsnnFwkyU7NxknbuM1R

* fix(re-review): round-3 codex P1 — normative checker invocation carries its full CLI contract

The § Stage 3' Re-Review Contract Dispatch step 4 command was the bare
script path; the checker's argparse requires --manifest/--precommitment/
--verdict-record/--traceability/--roadmap (+ conditional --letter, one
--apply-report per manifest entry, manifest order), so the normative
command as written exited 2 without a contract abort token. The step now
states the full artifact-path binding and the deferral-loop rule
(--traceability points at the re-persisted revision n+1 emission; all
other paths immutable). CONTENT_LOCKS re-pinned same commit. Security +
general round-3: 0/0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMxWsnnFwkyU7NxknbuM1R

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-29 02:33:22 +08:00
Edward Cheng-I Wu 3939b4cf0d feat(re-review): #576 Spec B PR-B1 — contract schemas + synthesis checker + patch_digest (format 1.2) (#605)
* feat(re-review): #576 Spec B PR-B1 — contract schemas + synthesis checker + patch_digest

First leg of the B1→B2→B3 implementation chain for the three-gate
evidence-before-persuasion re-review contract (design: PR #604):

- shared/contracts/re_review/{precommitment,verdict_record,traceability,
  input_manifest}.schema.json — §5/§11 field-for-field, all record types
  and closed sets; NewStandardRecord gains new_standard_id (spec §5.1
  amended in-place: new_standard_ref needs a stable target)
- scripts/check_re_review_synthesis.py — §13 recomputation checker,
  stdlib-only (#510 architecture class); graded exit codes 0/1/2
- scripts/test_check_re_review_synthesis.py — 148-test mutation suite:
  3 hand-pinned goldens, one violating fixture per invariant, §10 card
  fixtures pinned from both example files (DA synthetic), §6 unit table,
  jsonschema parity
- scripts/ars_apply_revision_patch.py — apply report gains patch_digest,
  REPORT_FORMAT_VERSION 1.1→1.2 (1.0→1.1 precedent; + protocol doc row)
- CI: unified pytest manifest entry (spec-consistency runs it)

No behavior change: nothing emits these artifacts until PR-B2 turns the
contract on as the Stage 3' default.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NWFfSwbbixMNDHXQhQ8nRo

* fix(re-review): close round-1 three-track findings (2+6 P1, 2+4 P2)

General track (Opus 5 xhigh) + codex (gpt-5.6-sol xhigh) round-1 closures:

- §3.4 Direction column enforced in schema + checker: valid_rebuttal
  upgrades to FULLY_ADDRESSED only (the sole letter-anchor basis can no
  longer move a verdict sideways into the p2_addressed_rate numerator);
  author_pointer_located_evidence is a strict upgrade to PARTIALLY/FULLY
- superseded reapplications keep their dispatch-time pre_reapplication
  _verdict — only CURRENT records take the chain-tail fallback (a legal
  successful retry no longer aborts); retry golden + double-current fixture
- G2(d) acceptance backs exactly ONE user_accepted_fail_closed adjustment
  (an orphan acceptance cannot clear the deferral)
- CrossModelResolution must reference a reapplication whose answer_refs
  contains its intent (cross-wiring closed)
- challenged-proposal drafted bodies are NEVER booked (content-equality
  exclusivity) + per-item drafted-body uniqueness
- §11 degradation (iii): escalation exceptions unsubstantiatable without
  the original manuscript
- source_reviewer bound VERBATIM to the Schema 7 reviewer field
- half-transported P1 items (transported markers present, severity absent)
  refuse driving_severity null (B1 suppression closed)
- apply-report grammar strict: JSON object, numeric dotted version (the
  pre-1.2 absence policy needs a VALID version below 1.2), 12-hex hashes
- path: refs are RELATIVE only (no absolute/drive/traversal), schema+checker
- §13 aborted-emission exemption scope: abort precedence over deferral;
  criteria_drift stays bidirectionally recomputed
- letter-present-but-blockless letters get a visible empty-layer NOTE

Security track round 1: CONVERGED 0/0. Suite 148 -> 167 tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NWFfSwbbixMNDHXQhQ8nRo

* fix(re-review): close round-2 findings (codex 2 P1; general 1 P1 + 2 P2, two shared)

- superseded reapplications are now verified, not skipped: supersession is
  defined for FAILED (CANNOT_VERIFY) attempts only, and a failed attempt
  appends nothing, so its dispatch-time pre_reapplication_verdict must
  equal its direct retry's — closes the G2(b) covering-predicate rewrite
  channel through stale user-form resolutions (codex #1 / general P1-1)
- an aborted emission claiming manifest_incomplete / manifest_hash_mismatch
  / synthesis_mismatch as root cause fails: the checker reached
  recomputation, so the §11 manifest layer validated against the same
  hash-bound inputs (codex #2 / general P2-2)
- §5.3 letter-tag condition implemented: letter-tagged anchors on a
  reapplication (and its mechanically-copied cross_model_adjudication
  adjustment) are valid exactly when the re-examined chain carries a
  booked valid_rebuttal record — the §3.4 "assertion in the letter with
  no locatable manuscript evidence changes nothing" machine witness
  (general P2-1)

Security round 2: CONVERGED 0/0 (second consecutive). Suite 167 -> 171.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NWFfSwbbixMNDHXQhQ8nRo

* fix(re-review): close round-3 findings (codex 1 P1, general 1 P2)

- the supersession guard is now UNCONDITIONAL: a verdict-changing
  successful reapplication carrying its derived adjustment can no longer
  be superseded past the failed-only check (§6 — a retry names the FAILED
  attempt it supersedes); the stale-resolution rewrite channel is closed
  on the derived-adjustment path too (codex round-3 P1)
- §7 judge adjudication scope enforced: a cross_model DissentAdjudication
  is valid only for dissents on P1 (must_fix) items — the judge's scope
  EQUALS the §9 pass's P1 coverage, and P2 dissents always take the G2(a)
  user path even on an active setup (general round-3 P2)

Security round 3: CONVERGED 0/0 (third consecutive). Suite 171 -> 173.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NWFfSwbbixMNDHXQhQ8nRo

* fix(re-review): close round-4 findings (codex 2 P1, general 1 P1; one codex half adjudicated against)

- §6 trigger binding: a divergence-only re-application (answer_refs with
  intent refs only) and a system ResolutionIntent both require an
  EVALUATED P1 row (cross_model_verdict present, implying an active
  configuration) — the forged intent→reapplication→resolution chain can
  no longer rewrite a committed P1/P2 verdict on a not_configured run
  (general round-4 P1; closes the §18 "Phase 2B cannot silently relax"
  acceptance surface on the reapplication side)
- a G2dAcceptance referencing a SUPERSEDED reapplication fails — a stale
  acceptance can no longer override the successful current retry
  (codex round-4 #2)
- adjudications below an untripped §7 bound are rejected ("dissents below
  the bound stand unadjudicated by design") (codex round-4 #1b)
- ADJUDICATED AGAINST codex round-4 #1a (reject user adjudicator on
  active-setup P1 dissents): the §6 deferral loop records a
  user-adjudicated DissentAdjudication DIRECTLY with no activity
  qualifier, and the §9 pass can be per-row unavailable — a one-way rule
  would make judge-transport failure unrecoverable. General round-4
  independently reached the same conclusion; pinned by a stays-legal test.

Security round 4: CONVERGED 0/0 (fourth consecutive). Suite 173 -> 178.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NWFfSwbbixMNDHXQhQ8nRo

* fix(re-review): close round-5 findings (codex 1 P1, general 1 P1)

- forged-divergence closure (codex): a divergence-only re-application now
  requires a REAL dispatch-time divergence (cross_model_verdict !=
  pre_reapplication_verdict — §6 identifies diverges BEFORE the system
  intent is emitted) and its chain must carry the ORIGINAL mandating
  system intent; an originally-agree row can no longer manufacture its
  own diverges status after the fact
- ghost-dissent closure (general): every DissentRecord must be APPLIED —
  the item's verdict record carries applied_criterion dissented:<id>
  (§7 reverse witness); an unapplied dissent can no longer trip the §7
  bound and authorize an original_upheld re-application second chance

Both are siblings of the round-4 trigger-binding rule: no committed
verdict moves without its genuine triggering divergence/dissent.
Security round 5: CONVERGED 0/0 (fifth consecutive). Suite 178 -> 181.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NWFfSwbbixMNDHXQhQ8nRo

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 21:17:00 +08:00
Edward Cheng-I Wu 3e90e14f2d fix(reviewer): re-review yardstick continuity + Stage 4→3' handoff completeness + apply-report output hash (#574/#576 pre-work) (#577)
* fix(reviewer): re-review yardstick continuity + Stage 4->3' handoff completeness + apply-report output hash (#574/#576 pre-work)

Three bug-class gaps fixed ahead of the #576 contract design:

1. Yardstick continuity: re-review reuses the Round-1 Reviewer
   Configuration Cards instead of re-running field_analyst over the
   revised manuscript (new § Yardstick Continuity; visible
   [YARDSTICK-REGENERATED] fallback marker on a new Judge Record line).
2. Stage 4 -> 3' handoff: the orchestrator transfer row gains the
   Revision Roadmap + #390 apply report(s) + Round-1 configuration
   cards; the re-review protocol input list gains the same entries.
   #528 orchestrator content lock re-pinned per documented procedure.
3. Apply report format 1.1: new output_draft_hash binds the report to
   the exact revised-draft bytes it describes; consumers instructed to
   check it before relying on untouched-block evidence.

3 new tests (TestReportOutputHash, red-first); full suite 3518 passed /
3 skipped / 1 xfailed; check_390 / check_268 / boundary-semantics /
spec-consistency lints green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bHgbm9bstvmorumtPa65J

* refactor: /simplify pass — terse SKILL.md mode cell, STALE-REPORT vocabulary alignment, trimmed version comment

- SKILL.md re-review agents cell shrunk to sibling shape + section pointer
  (marker literal lives in the protocol authority only)
- revision_patch_protocol.md names the submission verifier's STALE-REPORT
  guard as the sibling freshness pattern (single-source vocabulary)
- REPORT_FORMAT_VERSION comment trimmed to the load-bearing facts

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bHgbm9bstvmorumtPa65J

* fix: close codex round-1 findings — Stage 4->3' lockstep across all six authority surfaces + tiering roster + Schema 6 reviewer_configuration

- P1: the new re-review inputs (Roadmap, apply report, Round-1 cards) now
  appear on every Stage 4->3' authority: academic-pipeline SKILL.md,
  pipeline_state_machine.md (transition row + artifact lineage rows),
  team_collaboration_protocol.md, state_tracker_agent.md,
  academic-paper-reviewer SKILL.md re-review input line, and
  two_stage_review_protocol.md (surface codex round 1 did not name).
  Three #528 content locks re-pinned per documented procedure.
- P1: shared/model_tiering.md prompt-caching roster no longer re-dispatches
  field_analyst at Stage 3' (Round-1 cards passed as data instead).
- P2: Schema 6 judge_record gains optional reviewer_configuration member
  carrying round1_cards_reused / [YARDSTICK-REGENERATED ...] verbatim.

Full suite green; boundary-semantics / model-tiering / check_390 /
check_268 / spec-consistency lints green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bHgbm9bstvmorumtPa65J

* fix: close codex round-2 findings — examples lockstep, any-path regeneration fallback, canonical reviewer_configuration token, #390 spec §0.1 amendment

- P1: three registered examples updated to the new Stage 3' contract
  (full_pipeline + revision_recovery show reused Round-1 cards and
  EIC-only verification; mid_entry gains an explicit note that its
  field_analyst run is legitimate FULL-mode behavior, not re-review)
- P1: the regeneration fallback now covers ANY path where Round-1 cards
  are unavailable (standalone, mid-entry, lost artifacts) — silent
  regeneration is a protocol violation on every path; resolves the
  standalone-only wording that left mid-entry pipeline runs undefined
- P2: model_tiering roster note qualified (normal-path freeze, marked
  fallback preserved as the sole exception)
- P2: Judge Record template emits the Schema 6 canonical token
  round1_cards_reused
- P2: #390 spec gains §0.1 amendment recording apply-report format 1.1
  + output_draft_hash

Full suite green; all five lints green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bHgbm9bstvmorumtPa65J

* fix: close codex round-3 findings — example mode labels + EIC-only synthesis narrative + corrected mid-entry rationale

- P1: full_pipeline_example Stage 3' relabeled re-review mode (was
  declaring full mode around an EIC-only dispatch)
- P1: revision_recovery synthesizer narrative no longer claims a
  five-reviewer concurrence the EIC-only contract never ran
- P2: mid_entry rationale records the true history (ARS quick-mode
  Round 1 + user-requested fresh full review), not an external-human
  round that never happened

Full suite green; spec-consistency + boundary-semantics green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bHgbm9bstvmorumtPa65J

* fix: close codex round-4 findings — mode-gated Roadmap prerequisite + apply-report sidecar path

- P1: state_tracker Stage 3' Roadmap requirement gated on re-review mode
  (a user-requested fresh full review at 3' — mid-entry quick->full path —
  legitimately has no Roadmap)
- P2: orchestrator handoff names the apply report at its real location
  (<output>.apply-report.json beside the revised draft; only the patch
  document lives under phase6_*)

Two #528 content locks re-pinned. Full suite green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bHgbm9bstvmorumtPa65J

* fix: close codex round-5 finding — mode-gate the orchestrator Stage 4->3' transfer row

The authoritative handoff row now states it is the re-review-mode
transfer (the default Stage 3') and defines the fresh-full-review
alternative (mid-entry quick->full path): Revised Draft + available
context only, full-mode dispatch, not marked a verification round —
consistent with the state_tracker exception added in round 4.

#528 orchestrator content lock re-pinned. Full suite green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bHgbm9bstvmorumtPa65J

* fix: close codex round-6 finding — propagate the Stage 3' mode gate to SKILL.md, state machine, and collaboration mirrors

The fresh-full-review branch (mid-entry quick->full path) is now named
on all remaining Stage 4->3' authorities, matching the orchestrator and
state_tracker rows from rounds 4-5. Two #528 content locks re-pinned.
Full suite green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bHgbm9bstvmorumtPa65J

* fix: proactively close the remaining mode-gate class — two_stage protocol, ARCHITECTURE row, lineage cards row

Same class as codex rounds 4-6 (unconditional Stage 3' surfaces vs the
fresh-full-review branch); swept the remaining mirrors in one pass
instead of one per review round. State-machine lock re-pinned. Full
suite green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bHgbm9bstvmorumtPa65J

* fix: close codex round-7 findings — mode-gate the adjacent Mode/Output/dependency/checklist declarations

- P1 x4: two_stage Mode+Output bullets, ARCHITECTURE mode+artifact cells,
  state-machine Roadmap lineage row, team-collaboration handoff checklist
  all now carry the re-review-default / fresh-full-review split
- P2: state_tracker cards marked re-review-only (no spurious warning on
  the quick->full path); full_pipeline_example Stage 4 deliverables list
  the apply-report sidecar it later transfers

Two #528 content locks re-pinned. Full suite green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bHgbm9bstvmorumtPa65J

* docs(changelog): record the 8-round dual-track review trajectory and full lockstep scope

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017bHgbm9bstvmorumtPa65J

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 12:03:35 +08:00
Edward Cheng-I Wu 7b28147695 feat(integrity): #569/#570 revision-round claim-drift guards (claim-strength ladder + token conservation) (#571)
* feat(integrity): #569/#570 revision-round claim-drift guards (claim-strength ladder + token conservation)

Closes the epistemic and token halves of the #390 honest-claim residual: the
block-anchored patch confines silent-distortion exposure to touched blocks but
never checks a touched block's interior (DELEGATE-52, arXiv:2604.15597 — the
round-trip subtle-modification finding #390 already anchors).

Two complementary advisory layers, mechanism shape borrowed from
Yila-AI/sci-ssci-skills (@MissOrangePeel — its sci-ssci-polishing claim-strength
ladder + check_invariants.py):

- #569 Claim-strength ladder (shared/references/claim_strength_ladder.md): an
  ordered epistemic scale whose invariant is "no silent move, either direction,
  without an authorizing roadmap item". Wired into draft_writer_agent revision
  mode (a patch op changing a claim's rung must name the item authorizing the
  strength change) and a new advisory Phase E6 in claim_verification_protocol.md
  + its integrity_verification_agent executor mirror (STRENGTH-DRIFTED ->
  ADV-E6-<n>, mirroring ADV-E4/E5, never gating). The orchestrator's
  advisory-checkpoint template generalized to every ADV-*-<n> family to end
  per-feature enumeration churn (content lock re-pinned).

- #570 Deterministic token conservation (scripts/check_revision_token_
  conservation.py): stdlib checker over numeric tokens, <!--ref:-->/<!--anchor:-->
  markers (canonical grammar keyed on slug so bare<->resolved churn is not a
  spurious delta and a dropped resolved marker still surfaces), bracketed/
  author-year citations, and protected terms; pair mode or per-op against a #390
  patch with roadmap_item_ids attribution and Unicode fold-before-split (#524
  ordering). Necessary-but-not-sufficient, mirroring the v3.11 deterministic/
  LLM-semantic split. Wired as orchestrator revision step 3a next to E6.

Rather than cite an earlier-generation-model study as motivation (#569
precondition), a held-out set (evals/heldout/revision_claim_drift/,
codex-generated scenarios, cross-model + maintainer-adjudicated judging)
measured the CURRENT frontier model's baseline first: 2/8 = 25% claim-strength/
hedge drift under hedge-drop and null-reframe pressure, 0/8 unauthorized
numeric/citation drift (the one authorized change correctly isolated), 2/2
controls clean — the evidence the ladder earns its place rather than closing as
documented-negative-scope. 27 mutation tests, registered in the CI pytest
manifest. /simplify pass applied (ref-marker grammar reuse from the canonical
verify_submission_package form; small tightenings).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VAVMz9dLBjNgCo1re74Tyq

* fix(integrity): #569/#570 close dual-track pre-ship review (6 codex findings)

/security-review: 0 findings (read-only stdlib lint, empty attack surface).
/codex review xhigh: 6 findings (4 P1 + 2 P2), all closed:

- [P1] Number regex kept no sign inside brackets / after commas and truncated
  scientific exponents: CI [-0.45,..] read as 0.45 and 6.02e23 as 6.02, so
  [-0.45]->[0.45] and 6.02e23->6.02e24 both false-reported conserved. Sign now
  attaches after [ and , ; exponent (e/E[+-]NN) is part of the token.
- [P1] Narrative author-year citations captured only the parenthesized year, so
  Smith (2020) -> Jones (2020) on the same <!--ref:--> slug false-reported
  conserved. The token now includes the narrative author phrase.
- [P1] E6 declared inputs (prior draft, roadmap, patch) the Stage 4->4.5 handoff
  never transferred. Rewired E6 to consume the durable per-round revision-patch
  sidecars via a new declared Revision-Evidence Bundle (orchestrator handoff +
  section), satisfying context hygiene without a prior-draft diff.
- [P1] E6 audited only the last pair; on a 3->4->3'->4' path it missed drift
  introduced in an earlier round and retained. Now consumes every round's patch
  in the bundle.
- [P2] step 3a misstated attribution: the checker emits ADV-REV for every
  token-moving op and copies its IDs; it does NOT judge authorization (E6 does).
  Corrected, and --protected-terms guidance added.
- [P2] E6/ADV-REV had no report table or checkpoint option defined. Added both to
  the Integrity Report Output Format and the advisory-checkpoint template.

Re-ran the baseline eval under the stricter checker: 8 revisions score
identically (7 conserved, rp-07 still isolates only the authorized 0.17->0.21) —
no false-positives introduced; the measurement stays valid. 31 tests (was 27).
Orchestrator content lock re-pinned.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VAVMz9dLBjNgCo1re74Tyq

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 11:32:24 +08:00
Edward Cheng-I Wu f5402b114d feat(provenance): #513 read_scope attestation + anchor-aware finalizer promotion (#568)
* feat(provenance): #513 read_scope attestation + anchor-aware finalizer promotion

- /ars-mark-read: optional --scope {full_text,sections,abstract_only,
  toc_only,unknown} + --locator (repeatable, requires sections) + --note;
  declaration-only, absent = unknown, contradictory attestations refused,
  attestation args rejected with --unmark, batch all-or-nothing preserved
- new sidecar schema shared/contracts/passport/human_read_log.schema.json
  (version_records precedent; test-time validation, CLI dependency-light)
- Cite-Time Provenance Finalizer: read-scope-aware LOW-WARN->ok promotion
  (legacy/unknown/full_text promote; abstract_only/toc_only keep LOW-WARN
  + coverage note; sections promote only on unambiguous locator
  containment; quote anchors need full coverage); degradation is always
  retained LOW-WARN + note, never a new WARN class or hard gate
- commands/ars-mark-read.md + formatter LOW-WARN remediation in lockstep;
  #528 orchestrator content lock re-pinned
- tests: +10 attestation cases incl. sidecar-schema validation

Closes #513

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EA3EvegVqKrkM62u7k9PHF

* fix(provenance): #513 round-1 cross-model review closures (5 P1)

- presence checks use 'is not None' (--note '' no longer bypasses the
  requires-scope rule or the unmark rejection)
- locator/note length bounds enforced at write time in lockstep with the
  sidecar schema (CLI can never produce a schema-rejected ledger)
- governing attestation rides the settled latest-timestamped-event-wins
  precedence (a latest rescind wins; no resurrection of older marks)
- idempotency evidence enumeration names the attestation explicitly
- partial acknowledgment resolves to draft-visible
  LOW-WARN-PARTIAL-COVERAGE (formatter passes it as acknowledged with
  the coverage note surfaced; same severity tier, suffixes unchanged)
- tests 10→14 attestation cases; #528 lock re-pinned

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EA3EvegVqKrkM62u7k9PHF

* fix(provenance): #513 round-2 cross-model review closures (3 P1)

- LOW-WARN-PARTIAL-COVERAGE added to every base-status enumeration:
  check_v3_10_policy _BASE_STATUS, hard-gate handoff, contamination /
  policy-stamp sections (suffixes + policy_hash apply as LOW-WARN;
  freshness gate never refuses partial markers)
- citation anchor joins the idempotency/revision-loop evidence
  enumeration (anchor edits under partial coverage re-resolve markers)
- sidecar schema mirrors locators-require-sections via if/then so
  audit-time validation matches the writer contract; +1 schema test
- #528 lock re-pinned

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EA3EvegVqKrkM62u7k9PHF

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 09:48:02 +08:00
Edward Cheng-I Wu 7f878f7ad2 feat(integrity): #512 PDF read-integrity preflight for locally-extracted page anchors (#566)
* feat(integrity): #512 PDF read-integrity preflight for locally-extracted page anchors

Closes the local-extraction-channel gap between v3.7.3 locator presence
and the #182 existence gate: a page anchor derived from a silently
truncated/mispaginated PDF read passes every existing gate.

- scripts/pdf_read_preflight.py: three independent page-count signals
  (raw root /Count, own cycle-guarded /Kids walk, pypdf page list) ->
  PASS/FAIL/UNAVAILABLE JSON sidecar with file sha256 + parser warnings.
  pypdf-backed with the verify_submission_package ImportError precedent.
- R-L3-1-D firm rule in the three v3.7.3 emitters (+ agents/ mirrors):
  local-PDF page anchors require a PASS sidecar in context, else
  anchor:none or an independently-visible locator + explicit warning.
- claim_ref_alignment_audit_agent Step 4: precondition bound to
  ref_retrieval_method == manual_pdf, sidecars joined on ref_slug
  (sha256 confirmatory until #513), [pdf_read_integrity_unverified]
  advisory tag - never UNSUPPORTED on this basis alone.
- pipeline_orchestrator_agent §3.6: preflight once per locally-read
  corpus PDF, upstream of the writers; #528 content lock re-pinned.
- 15-test synthetic-PDF suite (in-test assembly, no binary fixtures).

Closes #512

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EA3EvegVqKrkM62u7k9PHF

* fix(integrity): #512 round-1 cross-model review closures (3 P1 + 2 P2)

- preflight: trailing-data-after-final-%%EOF veto (truncated incremental
  update otherwise PASSes on the older revision's agreeing counts);
  parser warnings survive early exits (appended in capture finally)
- orchestrator: preflight moved to Stage 1 corpus intake, independent of
  the opt-in audit mode (audit-gated preflight left default runs
  sidecar-less at R-L3-1-D, gate-refusing valid citations); #528 content
  lock re-pinned
- executable path: run_audit_pipeline(pdf_preflight_sidecars=...) tags
  manual_pdf page-anchor rows at the Step-6 emission point after cache
  resolution (cache hits cannot bypass; tag never enters cache body)
- finalizer: [LOW-WARN-PDF-READ-INTEGRITY-UNVERIFIED] advisory on
  SUPPORTED rows carrying the tag (content-based-fallback support no
  longer renders the advisory invisible)
- tests: preflight 15→18, +8 pipeline, +3 finalizer

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EA3EvegVqKrkM62u7k9PHF

* fix(integrity): #512 round-2 cross-model review closures (7 P1)

- preflight: xref-coverage cross-check (stale startxref pointing at a
  previous revision's xref with its own %%EOF now vetoes PASS); /Count
  must be a real integer object (float/string coercion rejected)
- R-L3-1-D: FAIL vs UNAVAILABLE split - positive truncation evidence
  refuses the page anchor; absence of verification (standalone dispatch,
  no-Python installs, unpreflighted files) is an explicit-warning
  advisory, never a manufactured refusal (mirrors detection-vs-
  terminality precedent)
- pipeline: retrieve_fn receives pdf_preflight_verdict on page-anchor
  citations so passage selection can go content-based BEFORE the judge
  reads a page-scoped passage; freshness (sha256 re-check) documented as
  the orchestrator's contract
- orchestrator: sha256 re-check before dispatch; cross-runtime coverage
  (standalone deep-research/academic-paper dispatch, skipped Stage 1);
  tagged-SUPPORTED row added to the operational finalizer matrix;
  content lock re-pinned
- tests: preflight 18→20, pipeline +1 (verdict-passing contract)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EA3EvegVqKrkM62u7k9PHF

* fix(integrity): #512 round-3 cross-model review closures (2 P1)

- xref-coverage: redefined-object variant caught - the newest raw copy
  of every directly-stored object must be the copy the active xref
  chain references (calibration guard skips offset-shifted files
  rather than mass-flagging)
- trailing-data predicate uses ISO 32000 PDF whitespace: NUL padding
  after %%EOF passes, vertical tab is data
- tests: preflight 20→23

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EA3EvegVqKrkM62u7k9PHF

* fix(integrity): #512 round-4 cross-model review closure (1 P1)

Object-header scan recognizes bare-CR line boundaries (ISO 32000 permits
CR-only line endings; Python's (?m)^ does not treat CR as a line start,
blinding both xref-coverage checks on CR-only files). Tests 23→25.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EA3EvegVqKrkM62u7k9PHF

* fix(integrity): #512 round-5 cross-model review closures (2 P1)

- header scan boundary/separator class extended to full ISO 32000
  whitespace (NUL-preceded replacement headers are seen)
- compressed-object variant: a direct raw replacement of an object whose
  active copy lives in an object stream, appended after its container
  with a stale startxref, vetoes PASS; a raw copy before the container
  (legitimate superseded-into-objstm update) stays clean
- new ObjStm + cross-reference-stream fixture; tests 25→28

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EA3EvegVqKrkM62u7k9PHF

* fix(integrity): #512 round-6 cross-model review closure (1 P1)

Header scan accepts ten-digit object numbers (\d{1,9} blinded the
coverage checks to replacements with object IDs >= 1e9). Tests 28→29.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EA3EvegVqKrkM62u7k9PHF

* fix(integrity): #512 round-7 cross-model review closure (1 P1)

Header-scan separators implement the full ISO 32000 lexer model:
%-comments-to-EOL are token separators, so comment-obfuscated headers
(e.g. '2 0%note\nobj') no longer hide from the coverage checks. This
closes the lexical-variant family structurally rather than per-case.
Tests 29→30.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EA3EvegVqKrkM62u7k9PHF

* fix(integrity): #512 round-8 cross-model review closure (1 P1)

Header-scan numeric tokens implement the full ISO 32000 integer form:
optional sign and leading-zero padding (pypdf coerces via int(), so
'+2 0 obj' / '00000000002 0 obj' are valid headers). Together with r7's
separator model, both halves of the lexer are now structurally complete.
Tests 30→31.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EA3EvegVqKrkM62u7k9PHF

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 06:50:06 +08:00
Edward Cheng-I Wu 7a7b8d6e07 feat(reviewer): #539 re-review judge independence + judge record (#559)
* feat(reviewer): #539 re-review judge independence + judge record

Stage 3' Priority-1 addressed-ness verdicts get an independent cross-model
pass when ARS_CROSS_MODEL is set (dispatching-layer transport per #523;
[CROSS-FAMILY-DIVERGENCE] rows are a review trigger for the EIC, never a
vote); single-provider runs carry a never-omitted §8.1.2 disclosure line.
Judge Record block (verification vs revision-driving judge, rubric version,
evidence seen, judging budget separate from generation) + Schema 6 optional
judge_record field.

External motivation: Ren et al. (2026, arXiv:2607.13104 §8.1.2).

Closes #539

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(reviewer): #539 codex round 1 — dispatchable pass, fillable Judge Record, defined output surfaces, §8.1.2 precision

P1: the per-item pass is integrity-sampling-style direct dispatch by the
dispatching layer (no #527 envelope — no fenced owner hands off); full verdict
set incl. MADE_WORSE; results land in a new R&R matrix Cross-model column
(agree / diverges / unavailable) with diverges as a Phase 2 review trigger.
P1: Judge Record made fillable — Round-1 panel provenance copied seat-level
from the #540 provenance block (singular revision-driving judge undefined for
a mixed-family panel); cross-model status is a three-way enum; prompt/rubric
surfaces recorded. P2: disclosure line verbatim in the output template; Schema
11 optional per-row fields; §8.1.2 attribution tightened + calibration claim
qualified.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(reviewer): #539 codex round 2 — judgment-specific transport, letter carried into Stage 4->3', usable matrix, not_configured status

P1: the per-item pass uses the provider transport with a judgment-specific
request (no grounding gate, closed verdict set, non-conforming -> unavailable,
never coerced) instead of the citation handlers. P1: the Editorial Decision
Letter joins the Stage 4->3' handoff on both locked surfaces (orchestrator +
pipeline SKILL; locks re-hashed) so the Judge Record's Round-1 provenance is
actually fillable post-#540. P1: the R&R matrix template fixed to eight
delimiter/example cells with real Cross-model values. P2: not_configured added
to the cell/status vocabulary (single-family rows have a defined value).
P2: "exact configuration" softened to the analogous family-level correlation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(reviewer): #539 codex round 3 — letter named on all handoff surfaces, status scoped to Priority 1 rows, CHANGELOG synced

P1: the Editorial Decision Letter joins the Stage 4->3' handoff on the
remaining three operative surfaces (state-machine transition + material rows,
lock re-hashed; reviewer SKILL re-review input line; protocol input list).
P1: cross_model_status always-carried requirement scoped to Priority 1 rows
(the pass does not evaluate P2/P3; their tables omit the column). P2:
CHANGELOG entry synced to the softened/consented/diverges-vocabulary text.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(reviewer): #539 codex round 4 — letter on team/state-tracker/example surfaces, neutral provenance fallback

P1: the Editorial Decision Letter joins the Stage 4->3' transfer in the team
collaboration protocol, the state tracker's prerequisite row (lock re-hashed),
and both pipeline examples. P2: the absent-provenance fallback is neutral —
"unknown (provenance block absent)" with an optional recorded reason (guided
Round 1 emits no letter; pre-#540 letters lack the block) instead of falsely
labeling #540-era guided runs as pre-#540.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(reviewer): #539 codex round 5 — letter on the two-stage protocol + recovery example; partial status for mixed runs

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(reviewer): #539 codex round 6 — partial + N/M counts in the Schema 6 enum; shared-doc disclosure scoped to not_configured / all-unavailable

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 14:56:41 +08:00
Edward Cheng-I Wu 65be66507e feat(novelty): #548 search-bounded novelty claims + Phase E novelty-claim classification (#556)
* feat(novelty): #548 search-bounded novelty claims + Phase E novelty-claim classification

draft_writer emits novelty/priority language search-bounded by default (filled
from Schema 2 search_strategy, nearest prior work named, qualifier protected as
an upstream-marked hedge); absolute form only on explicit user confirmation,
recorded for AI disclosure. Phase E gains E5 novelty-claim classification
(SUPPORTED_WITHIN_SEARCH / UNRESOLVED, never "globally verified", advisory-only)
with claim_verification_protocol.md as authority. failure_paths.md Insufficient
Novelty guidance routes through the bounded form instead of bare "strengthen
the novelty claim".

External motivation: Ren et al. (2026, arXiv:2607.13104 §7.4) — discovery
agents cannot easily verify novelty on their own and may exploit weak proxies.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(novelty): #548 codex review round 1 — hedge wiring to abstract path + executable advisory resolution

P1: abstract_bilingual_agent gains § Protected Hedges (consumes the roster incl.
the #548 search-bounded qualifier; dropping it under word pressure = compression
overclaim); draft_writer rule 3 names both consumers. P1: advisory rows gain
stable ADV-E4-<n>/ADV-E5-<n> IDs with an explicit non-gating resolution path —
proceed-open default, or user-requested reword routed through the existing
integrity-correction dispatch (gate stays PASS); draft_writer accepted-ID
grammar extended. P2: citation-density gate gains the absence-claim exception.
P2: Schema 2 search_strategy gains optional last_searched_at; bounded template
standardized to [date_range] (+ as-of); SUPPORTED_WITHIN_SEARCH made testable
(exact database/date match, nearest-prior-work selection rule).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(novelty): #548 codex round 2 — in-body hedge transport + executable advisory contract + D2 consistency + date-required classification

P1: Protected Hedges transported as an in-body closing list of the Draft Body
(draft_writer emits, abstract_bilingual consumes) — no separate payload, no
new output section. P1: advisory reword rides the existing Integrity Report ->
Stage 3 roadmap -> Stage 4 revision; ADV grammar clause reverted from the
integrity-correction path; Stage 4.5 record-only. P2: the #548 citation-density
exception mirrored to all D2 surfaces (Quality Criteria, SKILL Writing Quality,
writer/full.json D2 description). P2: SUPPORTED_WITHIN_SEARCH now requires
last_searched_at (absent -> UNRESOLVED); schema note upgraded to SHOULD-record.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(novelty): #548 codex round 3 — producers emit last_searched_at, comment-based hedge transport, no-adjacent-work D2 case, E5 descoped to executable facts

P1: bibliography_agent + literature_strategist Search Strategy templates emit
last_searched_at (F2 ownership hash re-baselined same-commit per the documented
procedure); ordinary generated inputs now carry the date E5 requires. P1: E5
contract descoped like E4 — decisions live in the checkpoint conversation,
no downstream obligations, rewords are ordinary revision instructions, Stage
4.5 rows remain in the Final Integrity Report deliverable. P2: hedge transport
moved to a <!--protected-hedges: ...--> comment (ref/anchor convention,
invisible in rendered output); formatter checklist marks stripping it as
required-not-content-loss; abstract_bilingual consumes the comment. P2: the
explicit absence-of-adjacent-work statement satisfies D2 across all five
surfaces (no forced inapplicable citation).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(novelty): #548 codex round 4 — search_strategy wired into both consumers + absence-claim exception in active enforcement contracts

P1: Phase 4b declared inputs name the Annotated Bibliography's Search Strategy
(the bound the writer fills); Stage 2->2.5 and 4->4.5 handoff rows carry Schema
2 search_strategy as the E5 comparison basis (orchestrator lock re-hashed).
P1: the Knowledge Isolation Directive rule 2 and evaluator/full.json D3 gain
the #548 exception so a valid no-adjacent-work statement is neither forced
into [MATERIAL GAP] nor penalized downstream.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(novelty): #548 codex round 5 — integrity handoffs carry the Schema 2 bibliography (search_strategy + source relevance metadata) so E5 can ground the nearest-prior-work check

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 13:42:17 +08:00
Edward Cheng-I Wu b286bed610 feat(scope): #547 per-sub-question scope bindings + Phase E scope-conformance advisory (#552)
* feat(scope): #547 per-sub-question scope bindings + Phase E scope-conformance advisory

RQ Brief Schema 1 gains optional sub_question_bindings (inherits + user-approved
deviations, absent = full-scope inheritance); research_question_agent records
bindings per sub-question and never silently broadens; structure_architect
sections name the sub-question they serve and inherit its bindings; Phase E
gains an E4 scope-conformance advisory (SCOPE-BROADENED rows, advisory-only,
never gates) with claim_verification_protocol.md as authority.

External motivation: Ren et al. (2026, arXiv:2607.13104 §5.1) — decomposition
fails when sub-problems stop preserving the original task's constraints.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* docs(changelog): #547 unreleased entry

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(scope): #547 codex review round 1 — E4 inputs on the pipeline path + schema-conformant producer output

P1: Stage 2->2.5 and 4/4'->4.5 handoff rows now carry the #547 scope context
(RQ Brief scope, sub_question_bindings, section->sub-question map) so E4 can
execute at both gates; orchestrator content-lock hash updated same-commit.
E4 gains an explicit inputs contract + [E4-SKIPPED: no scope context] fallback.
P1: research_question_agent emits the separate Schema 1 sub_question_bindings
block instead of inline annotations. P2s: effective-scope resolution defined
(omitted axes inherit parent; approved deviations replace their axis, no
re-flagging), advisory rows declared outside the zero-issues PASS count,
changelog compat claim narrowed, Ren §5.1 "fails" softened to "becomes
vulnerable" + design-inference label.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(scope): #547 codex round 2 — executable advisory contract + fallback-vs-skip precedence

P1: drop the unwireable PASS-time reword dispatch; advisory rows (stable
ADV-E4-<n> IDs) offer proceed-open / accept-with-justification, with rewords
riding the existing Integrity Report -> Stage 3 roadmap -> Stage 4 revision
path; Stage 4.5 record-only into the Process Record. P2: E4 skips only when
the parent scope object itself is unavailable — absent bindings/section map
fall back to whole-scope comparison (the promised pre-#547 behavior), never a
skip. Orchestrator row marks scope as the required input; lock re-hashed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(scope): #547 codex round 3 — advisory contract descoped to fully-executable facts

The E4 contract no longer promises any downstream fold: rows offer proceed-open
/ accept-with-justification only; a requested reword is an ordinary user
revision instruction (rows are visible wherever the Integrity Report travels,
citable by ADV-E4 ID); Stage 4.5 open rows remain recorded in the Final
Integrity Report deliverable (Stage 6 carry claim dropped). CHANGELOG aligned.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

* fix(scope): #547 codex round 4 — MANDATORY integrity checkpoint displays advisory rows and records per-row responses

The checkpoint template gains an advisory-rows line + a per-row prompt/record
instruction (proceed-open default / accept-or-confirm; never blocks). Closes
the last unwired promise: per-row decisions now have a defined display and
recording surface. Orchestrator content-lock re-hashed same-commit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Hi625UBf6GX7aeWJpJpSnE

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 13:17:52 +08:00
Edward Cheng-I Wu 48bde6a0b1 feat(tiering): #517 model tiering — judgment/execution split, two opt-in directions, default untouched (#520)
* feat(tiering): #517 model tiering — judgment/execution split, two opt-in directions, default untouched

One tiering mechanism per the frozen #517 design (Lance Martin, "Cost
effective harnesses with Fable", 2026-07-10):

- Default (ARS_MODEL_TIERING unset): byte-equivalent — every agent stays
  model: inherit. Same opt-in philosophy as terminal_policies.
- economy (frontier session): 13 execution-type agents dispatch one tier
  below the session model, floor Opus-class, never Sonnet; draft_writer
  flagged as the highest-savings / most quality-sensitive downgrade.
- quality-boost (below-frontier session): judgment-type agents at the
  Stage 2.5/4.5 gates + final-review surfaces step up to the frontier
  tier; nothing is ever downgraded.
- Both directions carry explicit no-op announcements; unknown values
  warn once and behave as unset. Tiers are relative positions, never
  hard-pinned model ids (v3.7.0 opus-floor lesson).

Classification: 39 agents (26 judgment / 13 execution; issue header's
25/12 arithmetic corrected, membership unchanged) in
scripts/model_tiering_manifest.json + the canonical table in
shared/model_tiering.md, pinned to each other and to the *_agent.md
files on disk by scripts/check_model_tiering.py (11 mutation tests;
wired into spec-consistency.yml + local pytest manifest, 60 -> 61).

Consumers: compact "## Model Tiering (#517, optional)" block in the four
SKILL.md files; SETUP en/zh-TW env-table rows; prompt-caching guidance
(same-stage calls reuse the same worker) in the canonical doc.

No agent-file edits (sha256-locked bibliography_agent.md untouched),
no schema change, no hook.

Spec: docs/design/2026-07-12-517-model-tiering-spec.md
All CI lints + 61-entry pytest manifest green locally.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FczvB1WJjfumdJTg9YyL3X

* fix(tiering): #517 round-1 codex fixes — dispatch-as-subagent mechanism, exact-set lint, caching scope, wording unification

Addresses the round-1 codex review (2 P1 + 6 P2; 2 no-change with reasons):

- P1 routing reality: canonical doc now states the mechanism honestly —
  a tier is selectable only at subagent dispatch; when a direction
  applies to an inline role, the session dispatches it as a subagent
  pinned to the target tier (that IS the mechanism); impossible-dispatch
  falls open to inline-on-session-model with a one-line announcement.
  PERFORMANCE.md en/zh "no separate model routing layer" reconciled.
- P2 caching-vs-default: same-worker guidance scoped to active
  directions; unset default byte-equivalent incl. dispatch shapes.
- P2 semantics drift: quality-boost = jump TO the frontier (not one
  increment); warn-once wording unified; SETUP rows name the
  final-review surfaces.
- P2 lint subset-only + hardcoded dirs: exact per-(tier,skill)
  token-set comparison (missing/extra/duplicate tokens, per-row counts,
  duplicate rows) + repo-wide stray sweep; tests 11 -> 15.
- P2 stale verification record: 60 -> 61 manifest entries in the spec.
- No-change (documented): the PR-body session link is the repo's
  established harness attribution convention (48 occurrences in recent
  main history); Lance Martin/Anthropic is published-source author
  attribution consistent with the repo's citation norm.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FczvB1WJjfumdJTg9YyL3X

* fix(tiering): #517 round-2 codex fixes — dispatch-time tier resolver, claim-ref audit surface, Stage 3' roster, PERFORMANCE cost qualification

- P1 tier resolver: new "Resolving a tier at dispatch time" section — the
  no-hard-pinning rule governs repo files; the dispatch call resolves the
  relative target from the runtime's own model information (alias or
  current-generation id, ephemeral only); unresolvable -> announced no-op.
- P1 claim_ref_alignment_audit: quality-boost surface corrected to its
  real dispatch slot (opt-in Stage 4->5, ARS_CLAIM_AUDIT=1), removed from
  the 2.5/4.5 gate list; SKILL blocks + SETUP rows updated.
- P2 Stage 3' roster: canonical text now matches ARCHITECTURE (narrow
  re-review team; judgment roles there = eic + editorial_synthesizer);
  caching example rewritten accordingly.
- P2 PERFORMANCE en/zh: plugin-agent cost-unchanged claim qualified with
  the unset condition + economy behavior for plugin-exposed execution
  agents (report_compiler).
- P2 PR body refreshed (dispatch-as-subagent wording, 15 tests).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FczvB1WJjfumdJTg9YyL3X

* fix(tiering): #517 round-3 P2 residuals — caching example covers the full 3' narrow team; PR body audit surface

- Caching example names the authoritative Stage 3' re-review roster
  (field_analyst + eic + editorial_synthesizer) and states the reuse
  rule is tier-independent — field_analyst is the economy-affected role.
- PR body quality-boost bullet gains the opt-in Stage 4→5 claim-ref
  audit surface (was omitted after the round-2 canonical correction).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FczvB1WJjfumdJTg9YyL3X

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-12 03:51:12 +08:00
Edward Cheng-I Wu 8c572ff483 feat(i18n): Korean trigger keywords + routing boundary fixtures (#452 PR 1) (#509)
Closes #452. Adds a Korean trigger-keyword line to all four SKILL.md files
plus a conservative Korean subset in each frontmatter description —
intent-specific compounds only, avoiding the broad standalone terms the
proposal flagged (연구/논문/작성/검토). Keyword design and the six boundary
phrases follow @devCharlotte's issue #452 proposal (the native-reviewed
Korean README half shipped earlier in #469/#471).

Two new routing smoke-test fixtures pin the key disambiguation with the
proposer's native-authored phrases: 수정 (revise) -> academic-paper:revision,
심사 (referee) -> academic-paper-reviewer:full. All six issue boundary cases
pass a routing smoke test on the current primary model (6/6).

No changes to agents, IRON RULEs, integrity protocols, schemas, modes, or
output-language behavior. Version Info Last-Updated synced (spec lint).


Claude-Session: https://claude.ai/code/session_01UMzbXv6Q1NkCaGmaza3p5r

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 16:28:57 +08:00
Edward Cheng-I Wu 773dcfe152 feat(socratic): sharpen WP advisory exemption clause — decorated title-form shells (#505) (#507)
* feat(socratic): sharpen WP advisory exemption — decorated title-form shells (#505)

Closes #505. Narrows the exemption clause in both socratic_mentor_agent.md
files to require a named or operationalized specific (instrument/scale name,
named theory/model/dataset/policy instrument, named site or population,
specified causal pathway, or stated tension), declares domain-flavored
topic-label pairs swappable, and adds the decorated-compound-title rule
(noun-swap the part after the colon on its own).

Measured against the held-out acceptance set per its README protocol
(2 replicates, claude-sonnet-5 judges): overall miss 0.375/0.344 -> 0.094
in both replicates, off-list 0.778 -> 0.222/0.111, false-fire 0/16 held in
both; no shell missed in both replicates; on-list gold set non-regression
(regex detector untouched, sentinel tests 7/7). New in-prompt example
strings substring-checked against every held-out item (zero hits).

Deliverables: measurement-2026-07-11-505.json, README post-#505 section,
judge reasoning excerpts appended, audit report. CHANGELOG also documents
the already-merged #506 (#484 FARS caveat) for the pre-tag coverage gate.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMzbXv6Q1NkCaGmaza3p5r

* feat(socratic): refine #505 exemption per codex P2s + final-wording re-measurement

Round-2 refinements from cross-model review: generic demographic descriptors
excluded from "named population"; decorated-title rule extended to single-topic
subtitles ("X in/among Z"). Audit "5 of 7" corrected to 4 of 7; CHANGELOG
"decorated title shells" corrected to "off-list shells". Measurement re-run
from scratch on the final wording (2 replicates): overall miss 0.094 in both,
false-fire 0/16 in both, no shell missed in both replicates; one judge
prose-verdict inversion recorded faithfully. JSON now carries all four
post-#505 runs (round1 + final).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMzbXv6Q1NkCaGmaza3p5r

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 16:08:03 +08:00
Edward Cheng-I Wu c9728d6d68 feat(socratic): WP advisory illustrative note + noun-swap test (#501 Part 1) (#503)
* feat(socratic): WP advisory illustrative note + noun-swap test, both mentors (#501 Part 1)

Both socratic_mentor_agent.md files gain a paragraph after the WP01-WP20
table: the table is illustrative, not exhaustive; the operative judgment
is the noun-swap test; clearly-failing off-list shells may fire at the
same high-confidence bar; domain-native phrasing must not trigger.
Advisory stays non-blocking, surface-phrasing-only; sentinel contract
strings unchanged.

Direction from the PR #468 review thread (@brycewang-stanford). Part 2
(held-out miss-rate measurement) stays open in #501.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J5H6Y91XDjmnGcQbkZTWuE

* fix: align noun-swap wording with its own definition (codex P1)

Shell-like phrasing survives the swap; domain-native phrasing does not.
The first draft said off-list shells 'fail' the test, inverting the
stated definition. Unified on survive/does-not-survive in both agent
files and the CHANGELOG entry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J5H6Y91XDjmnGcQbkZTWuE

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 11:47:40 +08:00
Edward Cheng-I Wu f417bc63cf feat(academic-paper): intro rhetoric (CARS) + title-crafting reference (#500) (#502)
* feat(academic-paper): intro rhetoric (CARS) + title-crafting reference (#500)

Adds references/intro_title_rhetoric_guide.md: CARS three-move
Introduction guidance (licensed-gap rule, universal-negative trap,
purpose-sentence discipline, common-failures table) plus a
title-crafting section (anatomy, four title types with claim-level
cautions, checklist, worked examples, WP06/WP17/WP18 shell cross-check).

Wiring: draft_writer_agent Step 1 setup checklist item; SKILL.md File
Structure reference list gains the entry (stale count 20 corrected to
the actual 28). CHANGELOG [Unreleased] entry included.

Gap surfaced by PR #485 (@lorenzo392); the new-skill shape there stays
declined, this lands the two uncovered content areas as a reference
file per the maintainer response.

Closes #500

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J5H6Y91XDjmnGcQbkZTWuE

* fix(academic-paper): address codex P2s — enumerate all 28 references, split CARS 1990/2004 provenance, fix scoped-negative example (#500)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMzbXv6Q1NkCaGmaza3p5r

* fix(academic-paper): provenance states 1990 CARS steps are adapted, not followed verbatim (#500)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UMzbXv6Q1NkCaGmaza3p5r

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 11:46:27 +08:00
Edward Cheng-I Wu cf973a8f7f fix(harness): retire expired scaffolds from 17-agent continuation audit (2 P1 + 9 P2) (#490)
* fix(harness): retire expired scaffolds from 17-agent continuation audit (#489)

Apply the 11 user-accepted findings from audits/harness-retirement-2026-07-04.md
(4-batch Fable 5 audit + codex cross-model challenge; 2 P1 + 9 P2):

- B2-F01/B2-F02 (P1): deep-research socratic_mentor — delete stale 10/15-round
  constants contradicting the v3.0 40/60 + exploratory carve-out; merge the
  duplicated Auto-End machinery into one 6-condition authority
- B3-F02 (P1, threshold=30 per user): academic-paper socratic_mentor — Auto-End
  Rules table becomes the single authority; conflicting 15-round bullets removed
- B3-F01: 12-row question-template tables -> 1 canonical example per type
- B3-F03: visualization Steps 2-6 narration -> pointer lines (6.5/6.6 untouched)
- B1-F01/B1-F02: orchestrator — drop happy-path resume example; dispatch
  sub-list -> Checkpoint Confirmation Semantics pointer; add missing
  `view progress` row; fix duplicate step numbering
- B1-F03: state_tracker — compress zero-information stage "2"/"3p" exemplars
- B2-F03: report_compiler — trim basic citation few-shot, keep non-obvious rules
- B4-F01: stale "prompt-level only / hook deferred to #134" enforcement sentence
  rewritten at 23 agents + 4 SKILL.md (guard shipped in #294); mirrors resynced
- B4-F02: SETUP.md + zh-TW — gpt-5.4/Opus-4.8 lineup drift (6 lines each)

User-rejected: B3-F04 (keyword mapping table stays), B4-F03 (field_analyst
examples stay). 2026-06-10 F-007 closed as verified-no-rewrite-needed.

Verification: run_ci_pytest_manifest 58/58 green; phase-boundary, write-scope,
spec-consistency, collaboration-depth, mirror-sync lints green; personal-boundary
scan 991 files / 0 violations.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YBdGUAb184hmuiRiWAm4A9

* fix(harness): carry stop-here/change-settings aliases into semantics table (codex review P2)

The B1-F02 dedup made the Checkpoint Confirmation Semantics table the single
authority but dropped two aliases documented only in the deleted dispatch
sub-list. Table is now a strict superset of the removed copy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YBdGUAb184hmuiRiWAm4A9

* refactor(harness): /simplify pass — tighten enforcement sentence, fix pointer label

- S1/Efficiency: enforcement sentence body 39->35 words across 23 agents
  (+2 mirrors resynced); drops non-semantic slack (~16 tok/dispatch x 24
  surfaces), keeps all five load-bearing facts and spec vocabulary
  (deterministic, rescope). Lint pins only the prefix marker — green.
- S2: visualization Step 4 pointer label aligned to the actual heading
  "Figure Numbering and Captions (APA 7.0)".
- ALT-1 (defrift lock: canonical-string pin in the phase-boundary lint +
  SETUP model-token parity) deliberately NOT done here — tracked as #491.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YBdGUAb184hmuiRiWAm4A9

* chore(lint): bump bibliography_agent F2 baseline hash after B4-F01 sentence rewrite

The v3.9.4 F2 ownership guard pins bibliography_agent.md by sha256 so any
edit forces review. Reviewed: the B4-F01 apply changed only the Phase
Boundary enforcement-status sentence; no M6 citation-provenance / M5
version-family / temporal logic moved, so the invariant holds. Baseline
updated per the lint's documented procedure.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YBdGUAb184hmuiRiWAm4A9

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-04 13:08:39 +08:00
Edward Cheng-I Wu 96e4f98b6e chore(prompts): retire expired writing-harness scaffolds in 4 Bucket A agents (#476 P2) (#478)
Applies the 5 P2 findings from the 2026-07 harness-retirement audit plus one
adjacent duplication found while applying F-004. All reductions; no behavior
added; every domain convention and load-bearing constraint preserved.

- abstract_bilingual (F-001): dedupe the "Common Errors" list against the
  Independence red flags above; keep only the non-overlapping per-language points.
- citation_compliance (F-002): collapse the 3-step format auto-detect ladder to a
  signature table + the one-line "default APA 7th" fallback (fallback preserved).
- research_question (F-003): rewrite the Socratic "What It Does NOT Do" negatives
  as positives; preserve the failure_paths F1 escape-hatch (its only definition).
- draft_writer (F-004): collapse the triple-templated drafting block (step-by-step
  algorithm + duplicate TEEL framework + duplicate register table) to the TEEL
  convention + drafting order; TEEL now single-sourced at Paragraph Structure.
- draft_writer (F-005): 4 basic citation-format examples -> one rule + the
  page-locator direct-quote example.
- draft_writer (adjacent, user-approved): citation-method decision tree deduped to
  the two non-redundant cases (contrastive + secondary citation).

Net -112 lines. Full CI pytest manifest green. Report-scope only; no contract,
no lint-mirrored prose, no Phase Boundary / citation-contract / formatter-gate touched.

Refs #476.


Claude-Session: https://claude.ai/code/session_01N9rzRUcxhpjJsY5zTEPtKQ

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 18:00:51 +08:00
Edward Cheng-I Wu 502e0e2b97 #439: user-declared format_profile (schema + intake + formatter) (#441)
#439: user-declared format_profile (schema + intake + formatter)

A scholar-declared layout/format profile the Phase 7 formatter follows when
rendering — fonts, caption placement, line spacing, margins, table borders.
ARS ships the contract, never any school's or journal's profile content.
Closes the gap surfaced by #436 (a downstream fork had to fork+add a whole
layer because there was no upstream way to declare a layout profile).

Decision B (standalone format_profile, not a venue_profile extension):
verifier-input vs renderer-input is a schema smell, lifecycle + data
semantics differ. Design-first (docs/design/2026-06-15-439-format-profile-design.md),
through codex design review, two /simplify passes, and a dual-track ship gate
(codex review + security-review, 0 P1/P2, 0 vulns).

- Schema: minimal field set (body_font, caption incl. latin_font_family for
  the #436 CJK case, line_spacing fixed_pt biconditional, margins_cm,
  table_border_style), additionalProperties:false, no provenance machinery.
- Intake: Step 5 follow-up (DOCX/PDF/LaTeX) -> YAML by path in a new PCR row;
  a declined follow-up writes nothing (Invariant 7 byte-equivalence).
- Formatter: reads by path, applies declared fields, first-line byte-equivalence
  guard, fail-closed STOP on bad/empty/escaping paths, declared-only no-inference,
  best-effort-per-target, venue-compliance-wins precedence.
- POSITIONING boundary: ships the mechanism, never a specific institution's
  profile content (out-of-tree, user-supplied).

8-invariant lint, 43 tests (mutation discipline), CI green. Fail-closed is
prose-tier this release; the deterministic-reader parity gap vs venue_profile
is recorded in design §10 as a future slice.

Closes #439

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 13:25:29 +08:00
Edward Cheng-I Wu 209c221eb0 Integrate PR #433 as modes: three-way-scan + rebuttal-audit (#437)
* fix(lint): exempt docs/superpowers/ from invariant 6 forward-version check

superpowers skill specs/plans intentionally plan the next release, so a
forward version reference there is their job, not published-doc drift.
Carve-out is scoped to superpowers/ (control test proves other docs/ still
gated). Surfaced by running version-consistency lint on a branch carrying
this PR's own plan doc.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(deep-research): add three-way-scan mode (WHY/HOW/WHAT paper triage)

Rescued from PR #433 (@Yaobin29), fixing its two defects: the Operational
Modes table row was missing and the bottom Version Info contradicted the
frontmatter (2.9.4 vs 2.10.0). Adds trigger keywords, decision-tree branch,
mode-selection-guide entry, the mode table row, and the WHY/HOW/WHAT section.
deep-research 2.9.4 -> 2.10.0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(academic-paper): add rebuttal-audit mode (standalone rebuttal-draft QA)

Rescued from PR #433 (@Yaobin29)'s audit concept. Advisory-only QA of an
existing rebuttal draft against reviewer comments (per-comment coverage +
gaps + risk flags). Explicitly suppresses Schema 11 / Material Passport /
ready_to_submit since a standalone invocation bypasses pipeline integrity
gates — enforced by a new check_rebuttal_audit_guard() lint + mutation tests.
Also extends revision-coach trigger/docs to cover pushback posture and
non-journal scopes (conference / grant-panel / transfer-after-review).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore: sync mode-count across registry/lint/docs/READMEs for 2 new modes (25->27)

Updates MODE_REGISTRY (25->27, deep-research 7->8, academic-paper 10->11,
+ 2 mode rows + summary), tri-lingual check_spec_consistency pins (EN/JP/
Traditional/Simplified), mode_spectrum, .claude/CLAUDE.md skills table +
new Routing Rule 6 (rebuttal-audit input-shape gate), ARCHITECTURE mode
table, and all 4 README mode headings/examples. ja failure-checklist
'7 モード' prose deliberately untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat(commands): add /ars-3w and /ars-rebuttal-audit slash commands

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* release: bump suite 3.12.0 -> 3.12.1 + CHANGELOG + credit @Yaobin29

Version bump across all current-version surfaces (plugin/marketplace manifests,
academic-pipeline SKILL frontmatter+title+table+last_updated, .claude/CLAUDE.md
suite version + skills table, ARCHITECTURE title+graph+component markers,
MODE_REGISTRY last-updated, 4 README badges + skill-detail headings, lint pins).
Historical references preserved: the v3.12.0 (2026-06-08) CHANGELOG entry and
its README mirrors are untouched. CHANGELOG [3.12.1] entry added (inserted after
the nonempty [Unreleased] section). README Contributors credits @Yaobin29.

academic-pipeline last_updated synced to 2026-06-15 to satisfy date-sanity.
All six spec-consistency-workflow lints green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test: sync spec-consistency README fixtures to v3.12.1 + 8/11 mode headings

The lint's own self-tests hardcoded 3.12.0 badges and 7/10 mode headings;
after the suite bump + mode-count change they no longer matched the lint's
expectations. Updated the aligned/stale README fixtures to v3.12.1 and the
deep-research/academic-paper mode headings to 8/11. Full pytest: 2763 passed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix: sync deep-research v2.10.0 + new modes in ARCHITECTURE/READMEs (codex review)

Codex review of the actual version-bump diff caught a lint blind spot the
mechanical checks could not: deep-research was bumped to 2.10.0 in its
frontmatter/table, but the ARCHITECTURE stage table + graph and all 4 README
skill-detail sections still showed v2.9.4 and omitted three-way-scan /
rebuttal-audit — and the lint PINS were stale too, so pin-and-file agreed at
the wrong version and the lint stayed green. Fixed all surfaces + pins +
fixtures; also synced .claude/CLAUDE.md Last Updated to 2026-06-15.

All 6 lints green; full pytest 2763 passed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* docs: backfill mode_selection_guide to detail all 11 academic-paper modes (codex ship-gate P3)

Codex ship-gate review caught that academic-paper/references/mode_selection_guide.md
detailed only 8 of the skill's modes — the flowchart and per-mode sections never
covered revision-coach or disclosure (both pre-existing baseline staleness), and the
new rebuttal-audit mode was absent. Meanwhile SKILL.md's file-inventory note was
bumped to "mode_selection_guide (11 modes)", making the claim-vs-reality gap larger.

Backfills the three missing per-mode sections (revision-coach / disclosure /
rebuttal-audit) plus matching flowchart branches, Quick Decision Table rows, and
trigger examples — including the revision-coach vs rebuttal-audit input-shape gate
and rebuttal-audit's integrity boundary (no Schema 11 / Material Passport /
ready_to_submit). The guide now details exactly 11 modes, matching SKILL.md's
Operational Modes table 1:1, so the "(11 modes)" reference is now true.

Docs-only; no lint asserts this file (which is why it could drift). All 6 lints
green; full pytest green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 11:04:40 +08:00
Edward Cheng-I Wu 5082006e7e fix: route integrity-FAIL correction rounds through patch sequencing (#89 Item 8) (#429)
Route integrity-FAIL correction rounds (Stage 2.5 / 4.5) through the §390 patch-mode revision dispatch instead of unspecified full-mode re-drafting, closing the #89 Item 8 adoption gap. Adds an integrity-correction variant (no Schema 8 response items; applied output returns to the issuing integrity gate for re-verification) and a stable IL-<SEVERITY>-<n> Issue List correction-ID scheme. Records the no-action audit verdict for the remaining three Item 8 loops.

Cross-model review (codex gpt-5.5, xhigh) converged at 0 P1 / 0 P2 over 4 rounds; spec-consistency lint + CI pytest manifest pass. Prose-only (3 agent prompt files).

Refs #89 (Item 8), #390, #423, #426
2026-06-13 10:34:31 +08:00
Edward Cheng-I Wu 893e45ae31 feat: diff/patch revision mode Slice B — revision-mode adoption (#89 Item 7) (#426)
Closes #424

Slice B of #89 Item 7 (spec #390), building on the Slice A deterministic toolchain (#423). `academic-paper` revision mode now runs **anchorize → patch → deterministic apply → finalizer** instead of asking `draft_writer_agent` to re-emit the complete paper — confining the DELEGATE-52 silent-distortion surface to the blocks an operation explicitly touches.

## What landed (the 6 deliverables)

1. **Writer patch-output contract** — `draft_writer_agent.md § Patch-Document Revision Emission`: patch as a `phase6_*/revision_patch_round<N>.json` sidecar (#424 emission decision), hashes copied from the block manifest never computed, `[PATCH-ESCALATION-REQUIRED:]` pre-drafting tag, retry-once, provisional Schema 8 items with mechanical fields left to the orchestrator.
2. **Orchestration sequencing** — `pipeline_orchestrator_agent.md § Revision-Round Patch Sequencing`: five normative steps with a no-rewrite window between manifest generation and apply (a finalizer pass in between would produce spurious hash mismatches).
3. **Escalation gate** — two trigger layers (pre-drafting classification / apply-time `refused_structural`), MANDATORY checkpoint wording, never auto-fallback to full re-emission, escalated rounds re-anchorize under a new ID generation and stamp `mode: full_reemission_escalated`.
4. **Schema 8 delta** — `ResponseItem.change_block_ids` (optional), orchestrator-populated from the apply report (§3.5 role split — inserted block IDs are post-apply facts).
5. **Protocol doc + Mode B commands** — `academic-paper/references/revision_patch_protocol.md`: exact anchorize/apply command sequence, exit codes, apply report as a required re-review input, marker lifecycle.
6. **Lint** — `scripts/check_390_revision_patch_discipline.py` (8 invariants) + 30 mutation tests, wired into `spec-consistency.yml` + the pytest manifest.

## Recorded ship decisions (spec §0 amendment, cross-model concurrence)

- **`touched_ratio` threshold = 0.6** — now the apply-script CLI default, strict `>` comparator, `1.0` disables.
- **`insert_after` heading-anchor exemption** — anchoring on a heading no longer fires the heading trigger when the inserted text carries no headings (routine "insert body text after a section heading"); heading replace/delete and heading-bearing inserted text still flag.

## §10 open items closed (verified, not assumed)

First-party check found that `formatter_agent.md` had no marker-strip rule for ANY marker kind and `word_count_conventions.md` had no comment-exclusion rule — the spec's "expectation" pointed at nothing. Both added: Phase 7 strips all ARS markers (`ref`/`anchor`/`block`) from converted final outputs after the marker-dependent gates run (working drafts + `phase6_*/` keep theirs); word counts strip `<!--...-->` before splitting. Max single-op `new_text` size folded into the existing triggers (no separate cap). `preserved_ratio` surfaces next to the #389 round-trip count.

## Quality

- Full CI pytest manifest green (52 entries; +1 new entry).
- `/simplify` pass extracted the shared `h2_section_body` / `check_section_literals` helpers into `scripts/_skill_lint.py` (check_390 + check_394 now import them) and de-duplicated the protocol-doc marker lifecycle into authoritative pointers.
- Dual-track ship gate: personal-boundary lint PASSED (0 violations); codex `exec` read-only review (gpt-5.5, xhigh); diff carries no `HEEACT`/`Springer`/`hei-platform` strings.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-12 09:02:53 +08:00
Edward Cheng-I Wu c7f42d4b88 feat: submission-package verifier Slice 4 — terminality (#394) (#418)
The fourth and final #394 slice: terminality. terminal_policies.submission_package (closed enum, citation_existence pattern); --policy / --check-freshness CLI with fail-closed VERIFICATION-INCOMPLETE (exit 4), STALE-REPORT (exit 5), tokens-not-exit-codes contract, inputs_fingerprint over external inputs, fresh-report verdict re-emission, and reuse-side roster guard; orchestrator Submission-Package Terminal Gate (Stage 5, post-formatter; advisory path re-dispatches the formatter append-only); formatter Submission Package Advisories section; check_394_submission_policy.py lint (5 invariants incl. the AST single-homed guard) + CI wiring; policy_hash scoped to citation-time keys; spec §5.2/§5.3 amendments per the gate-1 Option B adjudication.

Review trail: gate-1 plan review (1 P0 → Option B + 4 P1 + 2 P2), /simplify, gate-2 diff review (2 P1 + 1 P2), independent context-reviewer pass (2 P1 + 4 P2), final confirmation round (2 P2 + 1 P3), security review (0 findings) — every finding adjudicated and adopted or skipped with recorded reasons. TDD throughout; five killed mutations; full suite 2584 passed.

Closes #394

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 10:44:37 +08:00
Edward Cheng-I Wu 9dca765db5 feat: submission-package verifier Slice 2 — scholar-declared venue profile + Family B limits checks (#394) (#408)
* feat(scripts): slice 2 round 1 — venue_profile schema, Family B roster, NOT-CHECKED without profile (#394)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(scripts): slice 2 round 2 — Family B limits checks B1-B5 + --venue-profile (#394)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(scripts): slice 2 round 3 — partial profile, tolerance boundary, invalid profile, tex detex declaration (#394)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs+feat(intake): slice 2 — intake Step 3 venue-profile follow-up, spec B-ids/§10.4 adjudication, CHANGELOG (#394)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(scripts): adopt codex slice-2 review — schema-strict profile validation, scope-all counts everything, canonical manuscript selection (#394)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(scripts): apply /simplify slice-2 review — registry-bound signal class, schema-derived profile gate, single refs-title source, one bib parse (#394)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 12:37:44 +08:00
Edward Cheng-I Wu ddeea7df73 feat(intake): surface citation-verification level at the configuration interview (#392) (#402)
* feat(intake): surface citation-verification level at the configuration interview (#392)

Adds Step 13 to the intake interview: "mark only (default) / strict",
one sentence of field guidance. A strict answer seeds
terminal_policies.citation_existence: strict on the Material Passport
at materialization (finalizer stays the sole policy evaluator); a
mark-only or absent answer records the PCR row and writes nothing —
per-key absence already means advisory (Invariant 7), so unprompted
runs stay byte-identical. Plan mode exempt (mirrors Step 12). No
default changes anywhere.

New lint check_392_citation_verification_intake.py (4 invariants,
mutation-verified), incl. the anti-orphan guard: the no-handoff
directive must affirmatively reach Step 13 — the exact #327 P1
failure that orphaned Step 12. 8 unit tests; wired into
spec-consistency.yml + CI pytest manifest. SKILL.md Phase 0 summary
updated (the stale "9 items" line now enumerates Steps 9-13 too).

Closes #392

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test: anchor C8 negation fixture on the period-less directive core (#392)

test_neg_h2_step12_mentioned_but_negated replaced the exact directive
sentence including its final period; the #392 directive-tail extension
(", then Step 13 (Citation Verification Level).") moved the period, so
the replace no-opped and the fixture precondition failed. Anchor on
the period-less core phrase so tail extensions don't break the
mutation fixture.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 10:22:24 +08:00
Edward Cheng-I Wu b84e48aa4c feat(socratic): extend Layer-5 contribution probes into plan mode + revision coaching (#393) (#400)
* feat(socratic): extend Layer-5 contribution probes into plan mode + revision coaching (#393)

Mirrors the socratic_mentor Layer 5 (SIGNIFICANCE & CONTRIBUTION)
question patterns into two later-stage surfaces (blindspot-audit F-2,
adjudicated shape 1):

- academic-paper plan mode: new Step 2.5 CONTRIBUTION SHARPENING
  between chapter negotiation and the argument stress test, anchored
  to the user's Chapter Summaries, extracting
  [INSIGHT: contribution_claim]; Source & Boundary section maps each
  instantiated question back to its Layer-5 pattern.
- academic-paper-reviewer Phase 2.5: new step 3 contribution framing
  probe (5 -> 6 steps; no external step-number references existed).

Single-sourcing: Layer 5 owns the pattern family; both surfaces are
labeled instantiations, and Layer 5 gains a downstream-consumers note
(re-derive, don't fork). Boundary per Kong L2 verb test: questions
only — never propose / substitute / rank / expand / select; an
unanswered probe is recorded, not filled in.

Pattern-protection, line-budget, spec/version-consistency, RQ-framing
and reading-probe lints all green.

Closes #393

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(393): adopt codex review — true single-sourcing via L5-W IDs, verb-test tightening (#393)

Codex cross-model review of the first draft: 1 P1 + 2 P2 + 1 P3, all
adopted.

- P1: the draft carried labeled copies of the questions in three files.
  Layer 5 now owns three later-stage anchored forms with IDs (L5-W1/2/3);
  plan mode Step 2.5 and reviewer Phase 2.5 step 3 reference the IDs and
  carry no question text.
- P2 (verb test): "probe the contribution argument the outline now
  implies" let the mentor infer-and-offer; reworded to "ask the user to
  articulate the contribution their Chapter Summaries claim; quote only
  user-written text".
- P2 (third divergent consumer): the orchestrator Stage 3->4 coaching
  sketch now defers to the reviewer SKILL.md six-step list as
  authoritative (net-zero line edit; surface has 1 line of v3.6.7
  budget headroom).
- P3: [INSIGHT: contribution_claim] extraction is now conditional —
  unanswered probes are recorded as open questions carried into Step 3.

All lints re-verified green incl. the v3.6.7 line-budget test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(393): adopt independent-reviewer findings — wrong-file resolution + anchor permission (#393)

Independent context reviewer (third gate) on the post-codex diff:
1 P1 + 1 P2, both adopted.

- P1 (execution-time reachability): the repo has TWO same-named
  socratic_mentor_agent.md files; plan mode dispatches the
  academic-paper variant, which has no Layer 5 — and its own prompt
  flow went Step 2 -> Step 3 with no Step 2.5, so the probe defined
  in plan_mode_protocol.md would never have fired. The agent prompt
  gains a Step 2.5 Contribution Sharpening section that references
  L5-W1/2/3 by full path (deep-research/agents/...), and the
  protocol's inline reference is path-disambiguated against the
  same-named local file.
- P2 (one-way carve-out): L5-W3's "consumers may adapt the anchor
  noun" read as an unbounded edit permission when reached via the
  by-ID cross-reference; tightened to noun-phrase-swap-only, never
  re-anchoring to a contribution the user did not state.

All lints green incl. write-scope and v3.6.7 line budget.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 09:15:42 +08:00
Edward Cheng-I Wu f9a5ad6d9f fix(harness): retire Fable 5-stale model pins — opus command floor, display names, gpt-5.5 lineup (#383)
Harness-retirement audit 2026-06-10, second model-generation pass
(follows the #301/#347 Opus 4.7->4.8 pattern). Trigger: primary session
model moved to Fable 5.

- commands: the v3.7.0 `model: opus` frontmatter floor on /ars-full,
  /ars-reviewer, /ars-revision-coach inverted into a silent downgrade
  ceiling under a stronger-than-Opus session model; the three heavy
  commands now inherit the session model. The 11 light-mode
  `model: sonnet` pins are deliberate cost routing and stay.
- cross_model_verification.md: primary-model row made
  generation-agnostic (named "the inherited Claude Code session model")
  so it stops needing a per-release bump; OpenAI verifier lineup unified
  gpt-5.4 -> gpt-5.5 / gpt-5.5-pro (judge default was already
  gpt-5.5-xhigh while the doc taught 5.4, and the `gpt-5.4*)` case glob
  rejected 5.5 ids; web_search-on-Responses + pricing verified
  first-party 2026-06-10; legacy gpt-5.4* ids remain accepted; cost
  table re-anchored on gpt-5.5 $5/$30).
- announce hook + PERFORMANCE(+zh-TW): the per-session "$4-6 on
  Opus 4.7" anchor (two generations stale) reworded to name its
  measurement provenance (Opus 4.x) and order-of-magnitude status;
  recommended-model line no longer pins a generation.
- issue-133 routing smoke: acceptance threshold reworded from "100% on
  Opus 4.7" to "100% on the current primary model"; Fable 5
  recalibration run 2026-06-10: 8/8 routing-class pass (clarify/proceed
  + all three escape-hatch behaviors).
- compliance surfaces: two bare anti-hallucination tails kept as
  annotated debt (high-stakes domain, silent failure mode).
- disclosure protocol: e.g. model list refreshed.

Deferred, tracked separately: #272/#273/#274 premise re-baseline
against the Fable 5 system card; negative-framing sample-reframe of the
top-3 agent files at the next minor.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 03:57:09 +08:00
Edward Cheng-I Wu d0663404ff #260: Experiment Provenance Intake + claim→experiment alignment (schema-first) (#374)
## #260 — Experiment Provenance Intake + claim→experiment alignment (schema-first)

Adds the **intake + alignment** layer for experiment-backed claims (Kong et al. 2026, arXiv:2605.18661, §3.3 + §7.4.3). ARS deliberately keeps experiment **execution** outside the pipeline — the scholar runs experiments externally and brings results back; this change records that provenance and audits manuscript claims against it. Explicit non-goals (carried verbatim into the gate wording): does not run experiments, does not judge whether one was correctly designed/run/statistically-adequate/reproducible, does not auto-fill provenance, does not require provenance for literature-only pipelines.

### What ships

**Block A — `experiment_provenance[]` aggregate** (`experiment_provenance_entry.schema.json`): each scholar-entered entry carries a nested `repro_lock` (same inline-object shape as the passport-level lock, re-declared — not `$ref`'d — because the source is inline prose, not a schema file), a `planned_vs_executed[]` record (each `executed:false` unit carries a gate-checked `skip_reason`), and `negative_results[]` / `known_limitations[]` whose **key must be present** (empty `[]` = well-formed advisory; absent key = malformed → gate FAIL, the absent-key rule ported from #261 C3).

**Block B — claim→experiment alignment**: the claim manifest gains an optional per-claim `planned_experiment_ids[]` join field, plus a **fourth ref_slug-less aggregate** `experiment_alignment_results[]` (`experiment_alignment_result.schema.json`) with a MECE verdict enum `{ALIGNED, OVERSTATED, NOT_SUPPORTED_BY_PROVENANCE, PROVENANCE_INSUFFICIENT}`. The verdict is **produced by the integrity verification agent AT the gate** (Stage 2.5 sampling / 4.5 full), mirroring #261 C3 — so the row is emitted and gated in the same pass, avoiding the stage-ordering race. A **mixed-evidence claim** (both `planned_refs` and `planned_experiment_ids`) is audited by both paths; the gate decision is **worst-verdict-wins**. `PROVENANCE_MISSING` is deliberately NOT a verdict — a dangling `experiment_id` is a structural lint FAIL, never a fake judge row.

### Invariants + enforcement layering

Seven cross-array lint invariants in `check_claim_audit_consistency.py`: EP-INV-1 (experiment_id unique), EP-INV-2 (planned_experiment_ids resolve — rename + forward-reference guard), EP-INV-3 (experiment ids ⟹ empirical; mixed allowed), EP-INV-4 (declaration↔provenance symmetry), EP-INV-5 (declaration well-formedness when present), EA-INV-1 (finding_id unique), EA-INV-2 (alignment-row references resolve).

The persisted passport-level `experiment_intake_declaration` gives a **fail-closed legacy boundary, split by enforcement layer (stated precisely)**: the lint deterministically enforces declaration↔provenance *symmetry* (EP-INV-4) and *well-formedness* (EP-INV-5); the **integrity gate — not the lint — owns the `ars_version` numeric legacy decision and the declaration-presence FAIL** (a passport is `legacy_unknown` only with positive `ars_version < #260-constant` proof, everything else is treated-as-post-#260 so the declaration is REQUIRED). The `ars_version` numeric half is kept at the gate layer by design: the release constant it compares against is frozen at ship time, not at intake.

### Three documented departures from the issue's literal text

Each corrected after a first-party read of the **tracked** repo:

1. `repro_lock` is an inline-prose object, not a schema file — so "inherit repro_lock" means nesting the shape, not `$ref`'ing a non-existent file. A shared `repro_lock_validation.py` single-sources the field set (imported by both checkers) with a drift test.
2. The claim manifest had **no** experiment pathway (`additionalProperties:false`, `planned_refs` is literature-only) — the join field is **added**, not assumed.
3. "Path X / Tier-1 required / writer-binding" are not named conventions in the tracked repo — the discipline is **described**, not cited by a name a reader cannot find.

Two spec-table typos found during implementation were also corrected (the `report_compiler_agent` path and the pytest invocation path).

### Producers (taught in lockstep)

Three manifest writers (`synthesis_agent` / `draft_writer_agent` / `report_compiler_agent`) emit `planned_experiment_ids` when an experiment backs a claim; the integrity agent gains a disclosure-only Phase carrying the POSITIONING non-goal verbatim; the orchestrator carries the aggregate + declaration forward; README intake detection sets the declaration.

### Tests

`examples/passport_with_experiment_provenance.yaml` (2 experiments, a mixed-evidence claim, an OVERSTATED row) + full TDD suite: schema ±, fail-closed symmetry, declaration well-formedness, mixed-evidence two-row, verdict-derivation, mutation-verified non-vacuous invariants (each fixture flips fully clean when its invariant is neutralised), reverse-invariant producer pins, repro_lock drift, literature-only regression, and a documented D4-c carve-out boundary (the experiment carve-out is the LLM-caller's job; the deterministic detector is manifest-unaware — pinned explicitly so a future deterministic caller is on notice). Full suite green (2347 passed, 0 regression).

### Not a release

CHANGELOG `[Unreleased]`. All schemas, the manifest field, and all seven invariants are additive and backward-compatible.

Closes #260

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-08 22:10:03 +08:00
Edward Cheng-I Wu 4464abe04c feat(#261): Figure/Table Fidelity Gate — caption-claim trace + Stage 4.5 check (#372)
Closes #261

## What

Adds the **Figure/Table Fidelity Gate** — the visual analog of the §F.3.2 partial-evidence trap addressed for prose citations in #213 and review synthesis in #214 (Kong et al. 2026 §3.4, arXiv:2605.18661). The existing VLM Figure Verification Protocol checks *"does the rendered figure match the source data?"*; it cannot check *"does the caption's interpretation follow from the data, and does the manuscript cite this artifact for a claim it actually supports?"* This PR closes that gap.

## Approach — prose-layer only (mirrors #214, not #213)

The `figure_table_trace[]` producer (`visualization_agent`) and consumer (`integrity_verification_agent`) are both LLM agents reading a markdown Figure Package — there is **no deterministic downstream parser**, so this ships as a prose contract with **no JSON Schema, no lint invariant, no gold fixture**. Machine-validating the YAML shape would be false rigor (it proves field presence, not visual claim fidelity) and an unrequested maintenance surface. This is the same scope decision #214 made; #213 got schema+lint only because it has a machine consumer.

## Changes (5 files, +244 / -1, prose/protocol + doc example only)

- **`academic-paper/references/vlm_figure_verification.md`** — new Figure/Table Trace section: the `figure_table_trace[]` block (six required keys: `artifact_id`, `source_data`, `transformation`, `caption_claim`, `supported_manuscript_claims`, `limitations`) + field rules.
- **`academic-paper/agents/visualization_agent.md`** — emits the trace in the Figure Package (new Step 6.6); claims identified by text + locator (not a bare id — the agent can run before the draft's claim manifest exists).
- **`academic-pipeline/agents/integrity_verification_agent.md`** — Phase **C3. Figure/Table Caption Fidelity** at Stage 4.5: entry well-formedness (malformed → short-circuit FAIL) + four fidelity checks (trace completeness / caption-claim support with compound-caption sub-claim decomposition / bidirectional manuscript-claim linkage / limitation visibility), with an explicit FAIL-vs-advisory severity table and per-entry precedence.
- **`examples/figure_table_trace_example.md`** — 3-figure + 1-table ML ablation walkthrough (normal trace, decomposed compound caption, empty-limitations advisory, reverse-linkage omission).
- **`CHANGELOG.md`** — `[Unreleased]` entry.

## Key design points

- **Severity is split, not blanket-advisory.** A caption that contradicts *or is unsupported/overstated by* the data, an untraceable claim-bearing artifact, a missing/overstated/omitted manuscript link, or a dropped known limitation → **FAIL (block)**. Only uncertainty signals are advisory: empty `limitations: []` → `[FIGURE-LIMITATIONS-EMPTY]` (never a silent pass), VLM skipped with reason, legacy figure with no package.
- **Anti-skip:** an updated Figure Package missing the trace is a FAIL, not the legacy advisory case.
- **Bidirectional linkage:** every *substantive* manuscript use of an artifact must be listed (incidental/structural mentions exempt) — catches one-sided traces that declare only flattering support.
- **Inherits, doesn't duplicate:** C3 reuses the C1 data-cross-referencing layer; it does not re-render figures (VLM) or re-verify raw data (C1). Its new coverage is interpretation + linkage.

## Verification

- Regression green: **2291 passed / 3 skipped / 1 xfailed**.
- Reviewed across multiple independent passes to convergence; severity table verified exhaustive and mutually exclusive.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-08 13:17:45 +08:00
Edward Cheng-I Wu 36ee7df81f feat(#274): concise output discipline + pressure-stable boundary reinforcement (#369)
## Summary

Closes #274 — a guidance-layer follow-up to the Claude Opus 4.8 system card §4.1.4, which documents two behavioral signals: (1) refusals/responses trend longer and more over-caveated than 4.7, and (2) a small number of multi-turn cases where a correct refusal was retracted under sustained pressure. Both are quality-of-output issues a user feels directly in a review tool — a verdict buried in hedging, or a boundary that quietly gives way.

Guidance layer only. This strengthens prompt text; it makes **no** claim of having proven 4.8's runtime behavior.

## Changes

- **Concise output discipline** inlined (before `## Output Format`) into the report-producing reviewer agents — `domain` / `methodology` / `perspective` / `eic` / `devils_advocate` / `editorial_synthesizer` reviewers and `academic-paper/peer_reviewer`. State findings and verdicts directly; don't pad with repeated qualifiers or restated caveats. **Concise explicitly does NOT mean under-caveated** — preserve every material uncertainty; cut only redundancy.
- **Pressure-resistance reinforcement** — one general "pressure is not evidence" rule added to the Devil's Advocate Anti-Sycophancy Rules and the editorial synthesizer's arbitration discipline: repeated pushback / authority appeals / bare softening requests do not change a finding; only a substantive rebuttal meeting the existing concession threshold (≥4 normally, 5/5 after a prior concession) does. Framed by evidence standard, not as an attack catalogue — public-repo safe.
- **Epistemic-status line** on every block: these are prompt-surface instructions; they cannot prove the model stays pressure-stable at runtime — that would need a separate non-deterministic behavioral eval.

## Honesty bound (the crux of this issue)

The issue's acceptance "confirm boundaries hold under 4.8 after pushback" is an LLM-behavior property. It is **not** ticked by self-simulating a pushback dialogue (that is theater, not verification) and **cannot** be pinned by a deterministic CI test. Acceptance #2 is therefore reframed as a *prompt-surface confirmation* — the pressure-resistance instructions are present and explicit — with the limit stated plainly. This mirrors the #272 discipline (guidance layer ≠ runtime enforcement). No "confirmed 4.8 behavior" claim appears anywhere.

No lint / mutation test / xfail pebble: "be concise" is style guidance, not a contract invariant with a downstream consumer.

## Verification

- Full suite: 2291 passed / 3 skipped / 1 xfailed.
- Phase-boundary lint green (the added `## Output Discipline` H2 trips no count/budget assertion).
- Independent pre-merge review converged clean over two rounds (a DA concession-threshold contradiction was found and fixed); honesty and public-repo-boundary axes clean — no runtime claim, no jailbreak recipe, no leakage.

Related: #272 / #273 (Opus 4.8 cluster); #247 (CLOSED — ethics-gate override recording).
Design: `docs/design/2026-06-08-274-concise-pressure-guidance-design.md`.
2026-06-08 10:37:59 +08:00
Edward Cheng-I Wu a38757d74a fix(disclosure): reground ACL/EMNLP rows to ACL Admin Wiki canonical (#242) (#364)
The ACL row pointed at the 2023 conference blog (still live, HTTP 200) but
its content had drifted from ACL's current Exec-approved policy. The Admin
Wiki — which ARR / EMNLP 2026 link to for current paper-integrity guidance —
places disclosure in the Acknowledgements section and graduates it by use
type, contradicting the old row's "dedicated Use of AI Assistance subsection".

First-party verification: Admin Wiki returns HTTP 200 via browser navigation
with the full "Guidelines for Generative Assistance in Authorship" section
present (the 418 reported in #242 was a curl-UA challenge, not a stable
block). Repo has no CI link-checker, so the humans-vs-tooling URL tension
recorded in #242 does not apply.

- ACL row: Source URL -> Admin Wiki anchor; access date 2026-06-07; summary,
  required phrasing, disclosure location, prohibited uses, authorship, notes
  regrounded verbatim/closely-paraphrased from the first-party wiki text.
  Graduated disclosure stated per wiki clauses a-f: language-only and
  short-form input not disclosed; literature search needs no special
  disclosure but normal citation-accuracy rules apply; low-novelty text and
  AI-suggested ideas disclosed.
- EMNLP sibling row: Source URL -> EMNLP 2026 Paper Integrity Policy page
  (first-party verified, HTTP 200), which refers authors to ACL's
  generative-authorship guidelines; consolidated to "see ACL row" rather
  than duplicating; disclosure location aligned to Acknowledgements.
- disclosure_mode_protocol.md prose: aligned the ACL example to
  Acknowledgements (was mirroring the old subsection wording).
- Top snapshot date clarified as the original v1 build date (per-row access
  dates record re-verification).

Faithfulness pass: independent cross-model review against the first-party
wiki + EMNLP pages corrected two fluent-wrongness overstatements (literature
search no-disclosure bucket; EMNLP "adopts wholesale").

Closes #242

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 18:50:05 +08:00
Edward Cheng-I Wu 539af2f78c fix(citation-gate): carry advisory lookup_verified=false visibility via provenance_summary + resolve spec self-contradiction (#333 item 1) (#342)
* fix(citation-gate): carry advisory lookup_verified=false visibility via provenance_summary, resolve spec self-contradiction (#333 item 1)

#333 item 1 reported a spec-vs-impl conflict: spec C-V6(b) said an advisory
lookup_verified==false is "co-emitted in the ref marker", impl said it adds NO
marker suffix. Independent codex review found the SPEC was internally
self-contradictory — C-V6(b) claimed both "byte-equivalent to v3.9.x" AND
"co-emitted in the ref marker", which cannot both hold for a firing false row —
and that adding a marker suffix would break the v3.7.3 one-advisory-token grammar
cap (a ref can be both CONTAMINATED-* and lookup-false; the single advisory slot
is already taken by contamination).

Resolution (third path, user-approved): keep the marker byte-equivalent to
v3.9.x (no new suffix, no grammar/back-compat churn) and carry the advisory's
visibility in the formatter's output package instead, so the safety intent —
the warning travels with the human-reviewed deliverable — is honored without a
marker suffix.

- formatter_agent.md: new "Citation Existence Advisory (v3.11 / C-V6(b))" section
  (symmetric with the Kong #258 and contamination advisories) requiring a
  mandatory provenance_summary.md "Citation Existence Advisories" section that
  lists every advisory false row (ref_slug, citation_key, the falsifiable
  DOI/arXiv ID, resolvers_unmatched). Advisory: no block, no auto-fix.
- orchestrator + formatter prose: the false "why" lives in the aggregate AND the
  mandatory provenance_summary section; the marker stays byte-equivalent.
- spec C-V6(b) (lines 24/186): replaced "co-emitted in the ref marker" with the
  byte-equivalent-marker + provenance_summary-carrier form, removing the
  self-contradiction.
- check_v3_10_policy.py: new C-V6(b) lint asserting the formatter documents the
  mandatory provenance_summary Citation Existence Advisories section; 2 mutation
  tests (drop the section / detach it from provenance_summary → lint fails).

Marker behavior is UNCHANGED: test_citation_existence_policy's advisory-no-suffix
assertions still pass (the marker was never touched). Full suite 2138 pass / 3 skip;
v3.9.0 + v3.10 lints clean.

Refs #333

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(citation-gate): reconcile all citation_existence advisory mirror points to no-marker-suffix (codex dual-track)

Addresses six codex P2 findings across the #333 dual-track review, all the same
class: stale "advisory annotation/suffix in the marker" wording for
citation_existence (which, unlike contamination, adds NO marker advisory suffix
in either mode — the v3.7.3 grammar caps the marker at one advisory token, taken
by contamination's CONTAMINATED-* suffix).

- spec §0 line 24 (advisory) + line 26 (strict): no marker suffix; visibility via
  aggregate + provenance_summary; strict token is additive to base-status, the
  "why" in reason= + aggregate.
- spec C-V6(c)/(e) (187/189) + Rule 12 (103): removed the "co-emitted alongside
  the advisory annotation" contamination analogy for citation_existence.
- formatter_agent.md: new "Citation Existence Advisory" section now also lands
  provenance_summary.md in the Output Package "Files Delivered" table (it is the
  ONLY deliverable-visible carrier for an advisory false, so it cannot be dropped).
- check_v3_10_policy.py: the C-V6(b) lint now scopes the carrier check to the CE
  subsection (a whole-prompt scan false-passed on pre-existing provenance_summary
  mentions) AND requires the exact 'Citation Existence Advisories' label inside it.
  3 mutation tests pin: drop section header / detach provenance_summary within the
  section / rename the in-body label.

Verified the contamination strict clause (orchestrator 847) is untouched — it
legitimately co-emits a CONTAMINATED-* suffix; only citation_existence is
no-suffix. Full inventory grep confirms no stale citation_existence advisory-suffix
mirror remains. codex converged to PASS 0 findings at round 4; security-review 0
findings (prose + lint string-check only). Full suite 2139 pass / 3 skip.

Refs #333

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 01:22:50 +08:00
Edward Cheng-I Wu 3ab2b2247a fix: wire domain evidence profiles end-to-end (#327) (#339)
Three real feature-logic defects from the #259 post-ship review, all on
main and uncaught by the C1-C7 documentation-surface lint:

- [P1] Step 12 (Domain Evidence Profile producer) was orphaned from the
  no-handoff control-flow directive, which bounded the most common
  full-mode entry at "Step 1-11". The profile silently never activated on
  that path. intake_agent.md now affirmatively reaches Step 12; new lint
  C8 pins the directive's bound (requires "then Step 12", not bare token
  presence, so a "do not run Step 12" regression still fails).

- [P2] A reserved-fallback row "unknown_user_defined (requested: reserved)"
  was misparsed as case (c) and emitted [PROFILE-UNRESOLVED] (the
  malformed signal) for a valid reserved request. The consumer now parses
  the effective token + parenthetical and emits a distinct
  [PROFILE-RESERVED-FALLBACK]; (c) is narrowed to genuinely unresolvable
  rows (typo'd reserved, ship-enum-with-suffix coherence violation). New
  lint C9 requires both the tag and the parse instruction.

- [P2] The screening decision tree's currency (time-range) node was not
  profile-aware, so a canonical humanities source admitted at the
  peer-review node was re-excluded at the currency node unless cited>100 —
  an INVARIANT 5 monotonic-admit violation, and the "peer-review node
  only" prose both encoded the bug and contradicted four other passages.
  The currency node now has a humanities admit branch (union/loosen-only,
  continues through the universal relevance+methodology nodes, does not
  short-circuit; the neutral cited>100 seminal Include is untouched). New
  lint C10 pins the branch (on its branch-exclusive "recency is not a
  quality signal" rationale) and forbids the fossil wording.

TDD throughout (RED mutation fixtures before each fix). Dual-track ship
gate: codex gpt-5.5 review (2 P2 lint-strength findings fixed + covered by
new fixtures) + security review (no findings). 24 lint tests pass.

Refs #327

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 17:25:51 +08:00