Repository navigation
make the board analyst the sole filing authority and wire both packet registers into the contract text (user directive, 2026-08-15) #2695
Description
Final scoped lifecycle disposition — 2026-10-19
The current user-selected policy under #4701 retires this original recipe as not planned; it is not a completed implementation claim. Source PR4711 and selected109/020 distribution/installed joins are accepted at their recorded scope. The final issue comment records independent owners and preserved remainder. Original promise, owners, evidence and supersession history below remain intact. #4701/#4712 and original Unknown custody remain open.
Current lifecycle supersession — 2026-10-19
The present user direction and accepted #4701 design explicitly supersede the 2026-08-15/16 requirement that every follow-up pass through a sole filing analyst and permanent pending/rejected packet registers. Current authorized owners perform cause-level semantic deduplication and preserve useful findings through existing native issues/PRs and Atlas; optional analyst advice grants no separate filing/scheduling authority. This preserves critic independence, materiality judgement and the right to raise/dispose review findings without a third-party permission gate.
Retain the historical wedge argument and measured reason the old seam existed as dated evidence, together with #2691/#2687 register history; they are not an active queue. Retain the duty to detect, record and finish an owed post-merge release/adoption obligation. A source merge cannot end an owner's broader accepted promise, and routing a debt to an optional helper cannot make it disappear. Preserve release-debt cause-level deduplication and the independent technical source-review/CI guarantees. Do not restore claims/done stamps or packet adjudication as the way to enforce this guarantee.
#4702 owns coherent active callers, mirrors, Claude critic routes and validation closure; #4701 retains distribution/installed and continuous-loop acceptance. After actual source/installed retirement is accepted, Root can close this exact directive as NOT_PLANNED/superseded if no independent valid remainder exists. Do not mark the analyst monopoly completed or silently erase the historic operator decision. Its old ranking question is answered operationally by current user priority and fair native Delivery selection, without repurposing Phase/Severity or introducing a score store.
Kind: directive
Owner: FS-GG/.github
What this is
A decision the user made explicitly on 2026-08-15, not a finding. The three-test filing bar does not
apply — board-analyst's scope limit exempts operating changes the host or user has already decided to
make, and a decision is not required to be red before it is recorded. .github#2674 and .github#2689
are the live precedents for this shape.
The analyst's job on this packet was scope and shape — how many rows, what each declares, what order they
land in — and not whether it is worth doing. That adjudication is below.
Packet: .github#2691 comment 5304217783, recorded by the drive-board-best host relaying the user.
The directive, as stated
- All follow-ups route through the analyst — including critics'. The analyst becomes the only actor
that files a board row. This deliberately supersedes
.claude/skills/pnext-item/references/findings-and-filing.md:79-86, which today grants critics direct
filing authority for review-discovered causes. - Packets are stored permanently and robustly, so work can be picked up by a new session.
- With one filing authority, the board should shrink absent user intervention.
- At a stable board, the analyst adjudicates the accumulated packets together with board history and
churn, hunts root causes across them, and decides what is worth filing. - Where the analyst needs user input, it returns a multiple-choice question with a recommendation
rather than filing on a guess.
Why this is ONE row and not several — the shape adjudication
The change is a single contract statement expressed in several files that must move together
atomically. Split across rows, there is a window in which findings-and-filing.md says analyst only
while independent-review.md says the critic files directly — a self-contradicting contract, which is
worse than either endpoint. A critic reading it mid-round would have no defensible action.
The two skill roots (.claude/ and .agents/) move together by construction under ADR-0067
(resolve-don't-copy), so they are not separable into rows either.
The Paths: below are files, not directories, wherever the directory holds unrelated work — the
pnext-item/references/ directories carry merge-and-release.md and host-loop.md, which this change
does not touch and must not glue. .github#2587 is the measured precedent: one over-broad token there
gave the board a single 13-item lane, and narrowing it took the board from 8 lanes to 16.
What is already done and must not be re-specified
.github#2691exists as the pending-packet register, off-board, and held ten packets through this
pass..github#2687exists as the rejected-findings register, off-board.- Both were created through
gh api, neverfsgg-coord add: noStatus, noClass, noPaths:, no
lane, invisible to every scheduler. - The live critics were told mid-chain to packet by default rather than file.
Why the change is needed even though it is already operating
The directive is currently enforced by nothing except the host remembering it. The contract text still
says the opposite, in three places, and a new session reads the contract text — not this row and not the
register.
The measured evidence that memory is insufficient is in the packet itself: .github#2675 landed the
analyst-dispatch host step at 19:25:45Z, before any of this run's filings, and the mechanism was used
once in eight opportunities. Of the eight rows opened during the run, one arrived via the packet route;
the host filed three directly and directed a fourth, a critic filed one under the review carve-out, an
implementer filed one, and the analyst filed two.
After the rule was stated explicitly at 21:00Z, the same actors routed ten findings through the
register and opened zero rows. The difference between those two intervals is not competence; it is
whether the rule was in front of the actor. Only the contract text is in front of every future actor.
The wedge objection, and why the directive survives it
findings-and-filing.md:79-86 justifies the critic carve-out on the ground that "a review round that
waits on an analyst is a wedged chain", and that objection is correct on its own terms. It does not apply
here, because findings-and-filing.md already requires that nothing waits on the analyst: a packet
blocks no review round, no merge and no done stamp. Posting a packet is not a handoff.
What the directive transfers is authority, not latency. That trade should be recorded in this row
rather than rediscovered by whoever next reads the carve-out and wonders why it went.
This change is the one the contract itself anticipated
.claude/skills/board-analyst/references/the-bar.md § The seam this creates, stated honestly already
names this exact seam, concedes the resulting monopoly is partial, and closes:
Whether the monopoly should be extended over review-round filing is a route and scope question for
the host and the operator, not something to settle by editing this paragraph.
The operator has now answered that question. So the edit is not a reversal of that paragraph's
reasoning — it is the amendment the paragraph was written to await, and the file should say so rather than
silently deleting the seam. The wedge argument must be preserved as the reason the seam existed, with the
measurement that retired it.
Acceptance criteria
findings-and-filing.mdand its.agents/twin state that the analyst is the sole filer, and the
critic carve-out at:79-86is replaced — not deleted silently. The replacement keeps the wedge
argument on record and states why it no longer decides.independent-review.mdand its twin keep materiality with the critic, absolutely. The critic still
owns whether a finding is material and still owns the disposition of its own review-round findings;
what changes is that the durable record is a packet rather than a row. A critic must never need a third
party's permission to raise or judge a finding.board-analyst'sSKILL.md,the-bar.mdand their twins record the amendment at the seam paragraph,
with the operator decision dated, rather than by rewriting the paragraph as though the seam never
existed..claude/agents/fsgg-critic-best.mdandfsgg-critic-normal.mdinstruct the critic to record a packet.
Both must retain the canonical recency-comment-edit hazard statement byte-identically —
tests/skill-quality/recency-comment-edit.pyrequires exactly one occurrence in every
.claude/agents/*.md, and this row edits two of them.- Both registers are named in the contract text by number, so a new session finds them without being
told:.github#2691for pending packets,.github#2687for rejected findings. - The contract states the property that makes the change safe — nothing waits on the analyst; a packet
blocks no review round, no merge and no done stamp — adjacent to the authority transfer, so the two
are never read apart. bash tests/skill-quality/run.shgreen, and the skill-mirror and projection gates green across both
roots.
Criteria 8–10 added 2026-08-16 by board analyst avocet-aa55, adjudicating .github#2691 packet
5305856450. Reason recorded first at comment 5305912985. They exist because this row, as originally
drafted, would have shipped a contract that contradicts a live paragraph in a file it does not touch.
merge-and-release.md:152-186is explicitly superseded, in that file, not silently left standing.
Its § "An engine release that becomes owed is FILED by the worker who owed it" instructs the worker to
file the row and "board it withfsgg-coord add <n>in the same breath", and names the worker as the
destination. That paragraph is.github#2231's acceptance-5 discharge, so deleting it without a
replacement would silently un-discharge a closed row. The replacement keeps the worker's duty to
detect and report the debt and redirects only the filing act to a packet, and it states that
#2231's guarantee is preserved by a different mechanism.- The residual weakening is decided, not left implicit. Under the superseded clause, boarding was
simultaneous with discovery; under the directive there is a window in which the debt is only a packet
and nothing schedules it. On 2026-08-16 that window was held shut by a worker voluntarily keeping its
claim and withholding its stamp — a host instruction, not a contract rule. This row must land one of:
(a) a contract rule that a worker holding an undischarged post-merge obligation does not stamp until the
packet is adjudicated; (b) an explicit carve-out leaving release obligations under
merge-and-release.md; or (c) a recorded acceptance that the window is tolerable, with the reason.
Do not leave this to worker discipline unstated — that is the exact failure#2231refused. - The dedupe instruction says what to dedupe ON.
merge-and-release.md's "dedupe over REST first"
has no such guidance, and on 2026-08-16 a conscientious three-query REST dedupe returned[]while an
open row (.github#2648) did carry the debt — the two share no symptom text. Wherever the filing
instruction lands, it must direct a cause-level dedupe and point atboard-analyst's test 3, which
is built on precisely this failure.
Open question returned to the operator rather than decided here
The host observed that no honest lever ranks analyzer-process work above defect-class rows: Phase's
vocabulary is product areas and Workstream is not a rank input, so the user's request to prioritise
analyzer work cannot be expressed in a board field. Severity was raised on .github#2674 from its own
text, which is honest but not a general answer.
This row does not invent a ranking lever. The question is returned to the operator as a decision, and this
row should be updated with the answer once it is made.
Dedupe
.github#2675 and .github#2676 landed the host-loop dispatch of the analyst and do not carry this.
.github#2672 stood the analyst up. .github#2584 is the lineage root and is closed. No open row proposes
the sole-filing-authority change.
Filed by board analyst snipe-38f0, 2026-08-16, adjudicating the batch pending at .github#2691.
Paths: .claude/skills/pnext-item/references/findings-and-filing.md, .claude/skills/pnext-item/references/independent-review.md, .claude/skills/pnext-item/references/merge-and-release.md, .agents/skills/pnext-item/references/findings-and-filing.md, .agents/skills/pnext-item/references/independent-review.md, .agents/skills/pnext-item/references/merge-and-release.md, .claude/skills/board-analyst, .agents/skills/board-analyst, .claude/agents/fsgg-critic-best.md, .claude/agents/fsgg-critic-normal.md
Class: hardening
Severity: High
Metadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsDone
Activity
fs-gg-cross-repo-dispatch commentedon Aug 16, 2026
EHotwagner commentedon Aug 16, 2026
{
"schema": "fsgg.coord.route-decision/v2",
"subject": "#2695",
"revision": 1,
"previousDigest": null,
"scope": [
"state in the contract text that the board analyst is the sole filer, replacing the critic carve-out on the record rather than deleting it",
"keep materiality and the disposition of a critic's own review-round findings with the critic, absolutely",
"name both packet registers by number in the contract text so a new session finds them without being told",
"state the no-latency property adjacent to the authority transfer so the two are never read apart",
"keep the canonical recency-comment-edit hazard statement byte-identical in both critic agent files"
],
"dependencies": [
"no live implementation dependency: the row declares no Blocked by, and independent-review.md's prior contender .github#2662 merged as 682dc69",
"the lifecycle bot's Status Blocked with intent=human-decision is a scheduling park, not a work dependency, and does not bear on the route"
],
"touchSet": [
".claude/skills/pnext-item/references/findings-and-filing.md",
".claude/skills/pnext-item/references/independent-review.md",
".agents/skills/pnext-item/references/findings-and-filing.md",
".agents/skills/pnext-item/references/independent-review.md",
".claude/skills/board-analyst",
".agents/skills/board-analyst",
".claude/agents/fsgg-critic-best.md",
".claude/agents/fsgg-critic-normal.md"
],
"policyVersion": "structured-decisions/1",
"route": "lightweight",
"agent": "curlew-cd6f",
"timestamp": "2026-08-16T02:32:00Z",
"reasonCodes": [
"single-repo",
"contract-prose-and-existing-gates-only",
"no-engine-source",
"no-wire-schema-change",
"operator-decision-already-made",
"acceptance-criteria-already-concrete",
"worked-precedent-2666",
"registry-pin-widen-caveat-stated"
],
"rationale": "Lightweight. Routed on evidence, and deliberately NOT on the row's size or on the weight of the authority it moves.\n\nWHY NOT SDD-REQUIRED. The SDD front half exists to settle an open design question. There is none here. The row is Class decision and records a choice the operator already made on 2026-08-15; the analyst's own adjudication says its job on this packet was 'scope and shape ... and not whether it is worth doing'. The one question that remains genuinely open - that no honest board field ranks analyzer-process work above defect-class rows - is explicitly returned to the operator and explicitly excluded from this row's scope, so a spec has nothing to decide. The seven acceptance criteria are each concrete and independently checkable, including a named command (bash tests/skill-quality/run.sh).\n\nNO ENGINE SOURCE, NO WIRE CONTRACT, NO VALIDATOR, NO DIGEST. Every declared path is agent-facing contract prose. Nothing here touches src/, no schema version moves, and no already-written ledger digest is disturbed. This is the axis on which .github#2662 was re-decided to sdd-required at its revision 2 ('public-wire-contract-change, additive-field-required, existing-digests-must-stay-stable'), and this row is nowhere near it.\n\nWORKED PRECEDENT, SAME SHAPE. .github#2666 was agent-facing prose across .claude/agents/*.md plus a gate, routed lightweight, and landed (merged bd18a15). .github#2662 revision 1 declared .claude/skills/pnext-item/references/independent-review.md and its .agents/ twin inside a lightweight route and recorded the governing principle for the kit consequence: a kit release-verification obligation is an OBLIGATION, not a migration, and does not by itself make the route heavier. Both files are declared again here and the same reasoning applies. Verification:
gh api repos/FS-GG/.github/issues/2666/commentsand.../2662/commentsfiltered on fsgg:route-decision/v2 return those two receipts;git logshows bd18a15 and 682dc69 on main.\n\nTHE TWO ROOTS ARE NOT A SECOND REPOSITORY. .claude/ and .agents/ move together by construction under ADR-0067 (resolve-don't-copy, one source and a generated view), so the doubled paths are one edit projected, not a coordinated multi-surface change. Verification:ls .agents/skills/board-analyst/ .agents/skills/pnext-item/references/returns the twins of every declared file.\n\nCAVEAT THE CLAIMING WORKER MUST READ BEFORE TOUCHING A DECLARED PATH - A DECLARED-PATH GAP THIS DECISION FOUND AND THE ROW DOES NOT YET NAME. Acceptance criterion 3 edits .claude/skills/board-analyst/SKILL.md and references/the-bar.md. BOTH ARE SHA256-PINNED IN THE REGISTRY, AND registry/ IS NOT IN THIS ROW'S DECLARED Paths. registry/skills.yml:386 pins board-analyst's SKILL.md at 154194b9d17241bff001de1b804ddfc8f8d1751145c368300b0e5eca0a9947f9, andsha256sum .claude/skills/board-analyst/SKILL.mdreturns exactly that value today, so the pin is live and current rather than already drifted. registry/driver-skill-manifest.json additionally pins the whole package: a tree-sha256 plus per-file entries, including references/the-bar.md at c10c056d146c06c45c73e0dc65e4a82acb0910565edc5d166472950d8b31b8aa. tests/skill-registry/run.sh:133 asserts that a stale sha256 is reported with exit 1. So criterion 3 will red the registry gate unless the pins are reconciled, and the file that must change to reconcile them is undeclared. THE WORKER MUST REQUEST A WIDEN NAMING registry/skills.yml AND registry/driver-skill-manifest.json rather than editing them undeclared, and must treat an OVERLAP verdict on that widen as a hard stop. This is a declaration gap, not a route question: the reconciliation is mechanical and the reconciler already exists. It does not make the route heavier, and it is recorded here rather than left to be discovered mid-PR.\n\nSECOND CAVEAT. Criterion 7 requires existing gates to stay green; it does not ask for a NEW gate, and tests/ is not declared. If the worker or its critic concludes that prose alone cannot hold the sole-filing rule and a mechanical gate is needed, that is a scope change: stop and ask for sequencing rather than widening into tests/ unilaterally. Note for that judgement that the row's own measurement is honest about what prose achieves - the mechanism landed at 19:25:45Z was used once in eight opportunities before the rule was stated, and ten times in ten after - so the claim being made is that contract text in front of every future actor is the intervention, and criterion 4's byte-identical hazard statement (tests/skill-quality/recency-comment-edit.py) is the only mechanical check this row carries.\n\nTHIRD, ON SCOPE DISCIPLINE. .claude/skills/board-analyst carries a registry row with scope: operator and materializes-when "false" (registry/skills.yml:386), so it is NOT materialized into driver kits and no kit-republish obligation should be manufactured for it. pnext-item has no row in either registry file, yet registry/CHANGELOG.md:211,222,288-291 records kit/skills/pnext-item/... shipping in FS.GG.Kit - so the pnext-item edits DO carry a kit release-and-verify obligation, discharged after merge by verifying the published bytes against canonical rather than by trusting a green release workflow.","sddWorkId": null,
"specHome": null,
"requiredGates": [],
"digest": "ae9dbdcaefc89f954c789c1a54e5168b18e465e9369861a5990ec05b742fd051"
}
EHotwagner commentedon Aug 16, 2026
Packet 15 adjudicated onto this row — the directive collides with
merge-and-release.md, and this row must resolve it or ship a self-contradicting contractBoard analyst
avocet-aa55, 2026-08-16. Adjudicating.github#2691comment5305856450,recorded by the
drive-board-besthost.Verdict: NOT a new row. It is an amendment to this row's acceptance criteria and
Paths:, which isthe disposition the packet itself asked for. Recording the reason here, before the body edit.
The collision is real as written, and I verified the text rather than the quotation
.claude/skills/pnext-item/references/merge-and-release.md:152-186, § "An engine release that becomesowed is FILED by the worker who owed it":
Verification:read directly at1624a011;.agents/twin is the same file under ADR-0067.If this row lands as currently drafted, the repository will contain that paragraph and a contract
saying only the analyst files, with nothing stating which governs. The next worker to owe a release meets
the same fork with no maintainer in the loop. That is the packet's point and it is correct.
Two refinements the packet did not have, both of which narrow the collision
1. The clause is scoped to the case where the gate is GREEN, and tonight's was RED. Its own procedure
begins "It exits 0 when unreleased commits touch no wire surface…
releaseOwedin the report istrueanyway", and.github#2231's justification is explicitly about a signal nobody sees —"'reported, not red' means nothing acts on it. The report is emitted into a passing check run that nobody
reads."
Verification:merge-and-release.md:154-165;.github#2231body.Tonight the defect-class arm fired, so
engine-freshnesswas red onmain, not green-and-ignored(
gh api "…/actions/runs?head_sha=1624a011…"→engine-freshness push completed failure). The failuremode the clause exists to prevent was not reachable in this instance. The worker-files rule and the
analyst-files rule disagreed about who acts, but
#2231's actual guarantee — that the debt not vanishinto a green check — was held by the red check regardless of who filed.
So the honest resolution is not "the directive overrides
#2231's reasoning". It is that#2231'sreasoning has two cases and the paragraph only ever described one.
2. The dedupe step failed tonight, on symptom-versus-cause, and that is a second thing this row should
fix. The packet's own filer deduped conscientiously over REST —
"coord-engine release","engine freshness OR unreleased engine","release"— and got[]and twenty unrelated rows. But anopen row did carry the debt:
.github#2648, whose title is about a coherent-set tag and shares nosymptom text with "engine release owed".
Verification:the packet's own dedupe section at.github#2691comment5305858963, and my ruling at.github#2678comment5305903782folding it onto#2648.The clause instructs "dedupe over REST first" with no guidance on what to dedupe on, and a
title-similarity search structurally cannot find a cause-level duplicate. This is exactly the property
board-analyst's test 3 is built around — "the finding and the class row surface in different places andshare no symptom text; deduping on the symptom would have missed it" (
references/the-bar.md§ Test 3).It is also the strongest available argument for this row's own thesis: the actor holding one item
cannot see the board, so a symptom-level dedupe by the finder is not a substitute for a cause-level
adjudication.
What
.github#2231was protecting, and whether the packet route preserves itThe packet marked this
unverifiedand asked an adjudicator to read#2231directly. I did.#2231is CLOSED. Its acceptance 5 required that "the recurrence is addressed, not just this instance.Either the freshness report acquires a destination … or this issue records explicitly that the debt is
expected to be noticed by a human each time." The
merge-and-release.mdparagraph is thatdestination — it is
#2231acceptance 5's discharge. That is the lineage, and it is why silentlycontradicting the paragraph would quietly un-discharge a closed row's acceptance criterion. This row must
supersede it explicitly, with the reason, rather than leave two rules standing.
The one guarantee that is genuinely weaker, stated rather than argued away — and the packet was right
to flag it: under
merge-and-release.mdboarding is simultaneous with discovery ("in the same breath");under the directive there is a window where the debt exists only as a packet, and nothing schedules a
packet. Tonight that window was held shut by the worker keeping its claim and withholding its stamp —
a host instruction, not a contract guarantee. A worker that stamped
doneon a merely-packetedrelease debt would reproduce exactly the failure
#2231refused. This row should decide whether that holdbecomes a contract rule or whether release obligations are carved out of the directive; I have put it to
the maintainer as a multiple-choice decision rather than choosing here.
Body edit that follows
Adds acceptance criteria 8, 9 and 10, and two file tokens to
Paths:. ThePaths:addition is twofiles, not the
pnext-item/references/directory, preserving this row's own anti-glue argument and.github#2587's precedent.— board analyst
avocet-aa55EHotwagner commentedon Aug 16, 2026
Operator decision — reclassed
decision->hardening, so this row can be scheduledRecorded by the
drive-board-besthost, 2026-08-16, from a decision interview with the operator.The decision: this row's
Class:body line is changed fromdecisiontohardening, and it entersnormal lane scheduling. Nothing about the directive's substance is re-decided, re-scoped or re-routed.
The reason. The substance here was decided by the operator on 2026-08-15 and this row records it; what
remains is implementation.
Class: decisionmade the row unschedulable by design (#1103/#1887), and thelifecycle bot parked it
Blockedwithintent=human-decisionfor that reason alone — its ownroute-decision/v2receipt (revision 1, routelightweight, digestae9dbdca…) states there is no liveimplementation dependency and that "the lifecycle bot's Status Blocked with intent=human-decision is a
scheduling park, not a work dependency". So the class, not any dependency, was the whole of the block.
The precedent is this row's own. The body names
.github#2674and.github#2689as "the liveprecedents for this shape" — an operating change the operator has already decided — and both are boarded
Class: hardening. Classing this onedecisionwas therefore inconsistent with the two rows it cites.Verification:scripts/fsgg-coord ready --jsonreportsclass: hardeningfor.github#2674and.github#2689.Exactly one line of the body changed. Diff, taken before writing:
-Class: decision/+Class: hardening, no other line added, removed or reordered.Severity: Highis unchanged. This is an edit to theitem's own
Class:body line, which is the authority; the board column follows viareconcile --applyandwas not hand-edited.
Two questions this row carries remain open and are NOT answered by this comment. The claiming worker
must not treat either as settled:
post-merge obligation does not stamp until its packet is adjudicated, (b) an explicit carve-out leaving
release obligations under
merge-and-release.md, or (c) a recorded acceptance that the window istolerable, with the reason.
work above defect-class rows.
Under the directive's own point 5, the claiming worker returns these to the operator as a multiple-choice
question with a recommendation rather than filing or implementing on a guess.
Why this matters more than one row's status. The directive is currently enforced by nothing except each
host remembering it, and this session measured that failing twice over: the 2026-08-15 host's adopted
scheduling discipline did not survive one session boundary, and packet 7's remedy did not either. The
contract text is the only thing in front of every future actor, and this row is what puts it there.
Verification:decision interview, 2026-08-16, host session055fd264; body diff above; the receipt andprecedent reads named inline.
fs-gg-cross-repo-dispatch commentedon Aug 16, 2026
EHotwagner commentedon Aug 16, 2026
Evidence on this row — four measured instances, in one session, of a remedy homed where no future actor reads it
Board analyst
dunlin-c152, 2026-08-16, adjudicating at a re-plan boundary. Transplanted from.github#2691increments5306757449and5306757383(recorded by thedrive-board-besthost), both of which I REJECTED as rows under test 1 (register:.github#2687comments5307078135and — for the scratchpad half — the fold recorded in this pass's adjudication record).This row already states the cause: "The directive is currently enforced by nothing except the host remembering it. ... Only the contract text is in front of every future actor." What the row did not have is a base rate. It now has one, from a single session.
The four instances
drive-board-besthost dispatched six workers with no such warning, and the collision it predicted then corrupted a live delivery declaration onFS.GG.SDDPR #874-fvs-Fhazard, disclosed in packet5306656598snipe-0760reproduced the fault twice (5306757500,5306757538) in the act of citing the packet warning about itInstance 3 is the one that settles the argument for a mechanism over an instruction. Knowing about a hazard, having just read it, in the act of citing it, did not prevent it. Instances 1 and 2 could be read as "the next host should have looked harder"; instance 3 cannot.
Two acceptance criteria this suggests, offered and not imposed
I am not editing this row's body. Both belong to whoever claims it.
[]and was wrong, because the prior instance was a rejected packet — and.github#2687is off-board by design, so it is invisible to every issue search. Workeravocet-f53f's packet5306714841did exactly this and found no open row for a cause that was sitting in packet 7. The contract text should say that a dedupe reads.github#2691and.github#2687, and how.host-loop.mdor the briefs, or they are not homed at all.And a live consequence worth stating on this row
This row is
Blockedat the time of writing, so the contract change that would make remedies survive a session boundary is itself unschedulable. The mechanism blocking it is a stale lifecycle watermark replaying a nine-hour-olddecision-class reason over an operator-instructed reclass tohardening— which is also a remedy-persistence failure, one layer down: an operator decision that did not survive twelve minutes.That cause is now established in source and folded onto
.github#2690(see.github#2690comment5307010346, workerplover-80f7). Unblocking this row is downstream of.github#2690, not of anything in this row's own scope, which is the sequencing fact a host planning the next wave needs.Verification:instances 1-2 from the two increments as linked, with.github#2687comment5307078135. Instance 3:gh api repos/FS-GG/.github/issues/comments/5306757500 --jq '.body|length'reported as122before repair in the critic's own addendum at5306757538;unverifiedby me directly, since observing it requires performing the destructive write. Instance 4: this row's own body. TheBlockedstate and its mechanism:.github#2691comment5306977191and.github#2690comment5307010346, whose source line references I re-read myself atorigin/mainfebcb5b6—src/FS.GG.Coord.Cli/Client.fs:2492,:2456-2473,:3089-3091, andsrc/FS.GG.Coord.Core/LifecycleProjection.fs:134.— board analyst
dunlin-c152EHotwagner commentedon Aug 16, 2026
Scope input — there are now THREE registers to name in the contract text, not two
Posted by the
drive-board-besthost, 2026-08-16, at the operator's instruction. This is scope inputfor this row's acceptance criterion "name both packet registers by number in the contract text so a new
session finds them without being told". It does not re-decide anything and it does not widen the
route — the added register is one more number in the same sentence, in the same already-declared files.
The third register
.github#2703— board-analyst: adjudicated row drafts and resumable pass state,created 2026-08-16 through
gh api, neverfsgg-coord add: noStatus, noClass, noPaths:,projectItems: 0, invisible to every scheduler — the identical off-board shape this row alreadydescribes for
#2691and#2687.#2691#2687#2703Why the third one exists, measured rather than assumed
This row's own argument is that "the directive is currently enforced by nothing except the host
remembering it", and that only contract text is in front of every future actor. The same argument
applies one level down, and today produced a live instance.
Analyst
dunlin-c152adjudicated the 16 packets on#2691into 5 fileable rows and filed none:scripts/fsgg-coord intake applycannot complete its duplicate-inventory read in this repository(
src/FS.GG.Coord.GitHub/Reads.fs:2939-2944issues one unpaginated page and refuses when anextlinkis present, which is always, here). The adjudication was durable — it is on
#2691and#2687. Itsoutput was five JSON files in a session scratchpad on one machine, plus per-draft decay notes that
existed only in an agent transcript. Neither survives a restart, and the scratchpad is shared by every
agent in a Claude Code session: measured the same day, one worker's files were overwritten by a sibling
and another worker's vanished mid-item.
So
#2691made "not yet adjudicated" never mean "lost", and#2687made "rejected" never mean"forgotten" — and there was no register making "adjudicated but not yet filed" never mean
"gone with the machine".
#2703is that one.What this asks of this row
Nothing beyond the register list it already changes. Where the contract text names
#2691and#2687,name
#2703too, with its one-line purpose and the two rules that make it usable rather than merelypresent:
#2703is not a row — adjudicated fileable, not filed; nothing schedules it andnothing is blocked by it.
file:line, lane claim and "held by"assertion in a draft is SHA-bound. This session measured that class of claim decaying three separate
times inside one pass, including one verdict that inverted mid-adjudication when its anchor row closed.
The collection anchor also lives there, on a comment PATCHed in place by explicit id — the last
collection that actually succeeded, which
drive-board's host loop requires so a skipped pass doesnot orphan its window permanently.
Related, and deliberately not folded in here
The operator has separately confirmed that the analyst adjudicates and files at a stable board, not
at a wave boundary with claims live. A host (this one) read
host-loop's collection boundary as theadjudication trigger and dispatched an analyst into a live wave; the pass produced a verdict that
inverted mid-adjudication, a lane check against a simulated snapshot, and a filing refused by a staleness
a mid-pass merge had just created. That is contract-text-shaped too, but it belongs to
host-loop'swording rather than to this row's
Paths:, and it is recorded here only so the connection is not lost.Verification:gh issue view 2703 --repo FS-GG/.github --json projectItems→0;sed -n '2939,2944p' src/FS.GG.Coord.GitHub/Reads.fs;gh api -X GET repos/FS-GG/.github/issues -f state=all -f per_page=100 --include→ 100 objects withrel="next"; packet.github#2691comment5307153964.EHotwagner commentedon Aug 17, 2026
EHotwagner commentedon Aug 17, 2026
The analyst's own anti-glue remedy is not executable by the analyst
Found while filing under this directive, on the pass of
2026-08-17T14:15:11Z. Recorded here because#2695owns the contract text, and because it is a gap in the role's instructions rather than a defect inany engine.
board-analyst/SKILL.md§ After you file, prove you did not glue the board prescribes a filing step:It cannot be done.
set-pathsrequires a held lock, and the same skill forbids the analyst from everholding one — "you may never
claim,take, orrelease… you hold no lock, so you can never be thereason a lane is occupied."
Measured, not inferred. I filed
.github#2752, the lane partition reported its declared token aslane glue, and I ran the prescribed remedy:
The refusal is correct and
#706is right to enforce it. The instruction is what is wrong.Why this is not merely cosmetic. The skill grounds this step in a measured incident —
.github#2587filed with the bare token
scripts, producing one 13-item lane, and narrowing it took the board from 8lanes to 16. So the hazard is real and the prescribed remedy for it has never been runnable by the role
that is told to run it. On this pass it did not bite, because
#2752's declaration is a single file andalready minimal; a broader one would have left me with no sanctioned route at all.
The route that does work, and what the contract should say instead: the analyst edits the row's own
body
Paths:line, which is inside its stated authority ("issue bodies and titles") and is safeprecisely for rows it just filed, since those carry no live claim. The prohibition that must survive any
rewording is the different one — never edit a live claim's item body, because the claim marker is the
lock and last-write-wins clobbers the holder silently.
Two smaller notes from the same pass, both inside this directive's subject:
intake applyis not the filing path today. I filed#2752and#2753withgh issue create,then
scripts/fsgg-coord add, then an authoreddelivery-route record. That is.github#2735'ssubject and it is live in repair, so this is a datapoint on it rather than a new finding.
Readyneeds an analyst-authored route receipt or it is unschedulable from birth(
.github#2698). Boarding.github#2395after its reopen refused until I authored one. If the analystis the sole filing authority, authoring route decisions is entailed by that authority, and the contract
text should say so rather than leave each analyst to infer it. I authored three this pass —
.github#2395,#2752and#2753— and signed each with my mintedid. (
#2312,#2719and#2720already carried receipts from their original filing, so theirreopen needed none. An earlier revision of this comment said "four"; corrected by PATCH to this
comment's explicit id, which is the only safe way to amend anything here.)
—
godwit-24c2, board analystEHotwagner commentedon Aug 17, 2026
Operator decision — this row's implementation half is carved out into three schedulable rows
Recorded by board analyst
avocet-bb9a, 2026-08-17, at the operator's explicit direction. This row'sbody is not edited and its declaration is unchanged; nothing here races a holder.
The problem this resolves
.github#2691packet5311740822measured that this row carries both a directive and ordinary implementation work — a ten-entry
Paths:naming real files — and that
.github#2712's migration gave itKind: directive, after which thescheduler refuses it permanently:
The consequence recorded there is that the implementation work can never be scheduled and
lintreports a clean board.
The carve-out
The work is now carried by three rows, each declaring a strict subset of this row's
Paths::#2755#266's one-child-per-instance filing practiceboard-analyst/references/the-bar.md, both roots#2756pnext-item/references/independent-review.mdboth roots,fsgg-critic-{best,normal}.md#2757pnext-item/references/findings-and-filing.md, both rootsVerification:this row'sPaths:read live 2026-08-17 — it coversfindings-and-filing.md,independent-review.md,merge-and-release.mdin both roots, bothboard-analystdirectories, and bothcritic agent files. Every token declared by
#2755/#2756/#2757lies inside it.What is deliberately NOT changed
Kind: directiveand remains the durable record of the 2026-08-15 sole-filing-authoritydecision. That is what it is good at and the classification is correct for it.
merge-and-release.mdis not carved out. No filed row claims it, so that portion of this row'sdeclared work has no schedulable home and is not resolved by this disposition. Stating it rather than
letting the carve-out read as complete.
Paths:narrowing here. Narrowing a declaration the holder did not ask to change is the raceboard-analyst/SKILL.mdforbids; if this row's declaration should shrink to match what remains, that isthe holder's edit.
The residual, stated plainly
#2712'sKindaxis has no mechanism for a row that is both a directive and a unit of work. Thisdisposition routes around that for one row by hand. The general defect is packet
5311740822and isstill unfiled — the carve-out is a remedy for this instance, not for the class.
— board analyst
avocet-bb9aEHotwagner commentedon Oct 19, 2026
The 2026-08 sole-filing-analyst directive is expressly superseded by the current user-selected policy: the accountable owner or independent reviewer can record and disposition an authorized finding, with optional analyst help and cause-level deduplication. A packet/register or analyst response is not mandatory. Close this opposite historical directive as not planned, never as completed implementation of a monopoly.
Retain critic materiality/independence, the duty to detect and finish an owed release/adoption obligation, and cause-level reuse. Existing #2691/#2687/#2703 originals remain evidence; neither their findings nor the carved-out #2755/#2756/#2757 promises are completed by this disposition. Old route/class/claim/status recipes and the unfiled kind-axis observation are historical, not current authority. No historical finding or release receipt is manufactured or erased.
Evidence boundary: source PR4711; actual coherent109 and Creator020; selected public fresh/retained instruction and runtime acceptance remains durably owned by #4712. PR4715 is normally delivered at4fadcce5004e30d122e41bac2bca6c404edbd902/tree41b683bf067acb3adb722297fc7e1c4216f901ea with exact review/required CI/coherence accepted; amended37 native continuation remains pending. Outcome4701 and Delivery4712 remain open for actual native continuation, recovery and final Atlas acceptance. All439 inherited and46 later Unknown originals remain distinct and unreleased.