Skip to content

make the board analyst the sole filing authority and wire both packet registers into the contract text (user directive, 2026-08-15) #2695

Closed as not planned

Description

@EHotwagner

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

  1. 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.
  2. Packets are stored permanently and robustly, so work can be picked up by a new session.
  3. With one filing authority, the board should shrink absent user intervention.
  4. 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.
  5. 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#2691 exists as the pending-packet register, off-board, and held ten packets through this
    pass.
  • .github#2687 exists as the rejected-findings register, off-board.
  • Both were created through gh api, never fsgg-coord add: no Status, no Class, no Paths:, 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

  1. findings-and-filing.md and its .agents/ twin state that the analyst is the sole filer, and the
    critic carve-out at :79-86 is replaced — not deleted silently. The replacement keeps the wedge
    argument on record and states why it no longer decides.
  2. independent-review.md and 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.
  3. board-analyst's SKILL.md, the-bar.md and 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.
  4. .claude/agents/fsgg-critic-best.md and fsgg-critic-normal.md instruct the critic to record a packet.
    Both must retain the canonical recency-comment-edit hazard statement byte-identically —
    tests/skill-quality/recency-comment-edit.py requires exactly one occurrence in every
    .claude/agents/*.md, and this row edits two of them.
  5. Both registers are named in the contract text by number, so a new session finds them without being
    told: .github#2691 for pending packets, .github#2687 for rejected findings.
  6. 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.
  7. bash tests/skill-quality/run.sh green, 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.

  1. merge-and-release.md:152-186 is 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 with fsgg-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.
  2. 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 #2231 refused.
  3. 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 at board-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

Activity

  1. moved this from Ready to Blocked in Coordinationon Aug 16, 2026
  2. fs-gg-cross-repo-dispatch commented on Aug 16, 2026

    @fs-gg-cross-repo-dispatch
    Contributor
    No description provided.
  3. EHotwagner commented on Aug 16, 2026

    @EHotwagner
    ContributorAuthor

    {
    "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/comments and .../2662/comments filtered on fsgg:route-decision/v2 return those two receipts; git log shows 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, and sha256sum .claude/skills/board-analyst/SKILL.md returns 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"
    }

  4. EHotwagner commented on Aug 16, 2026

    @EHotwagner
    ContributorAuthor

    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 contract

    Board analyst avocet-aa55, 2026-08-16. Adjudicating
    .github#2691 comment 5305856450,
    recorded by the drive-board-best host.

    Verdict: NOT a new row. It is an amendment to this row's acceptance criteria and Paths:, which is
    the 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 becomes
    owed is FILED by the worker who owed it"
    :

    "When it is true and no open row carries the debt, file the row. … Dedupe over REST first, then
    file with Class: hardening and a narrow Paths: declaration, and board it with fsgg-coord add <n>
    in the same breath. The boarding step is the whole point and it is not optional … So the destination
    is a person or agent already holding board write at a release checkpoint — you."

    Verification: read directly at 1624a011; .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… releaseOwed in the report is
    true anyway"
    , 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#2231 body.

    Tonight the defect-class arm fired, so engine-freshness was red on main, not green-and-ignored
    (gh api "…/actions/runs?head_sha=1624a011…" → engine-freshness push completed failure). The failure
    mode 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 vanish
    into 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's
    reasoning 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 an
    open row did carry the debt: .github#2648, whose title is about a coherent-set tag and shares no
    symptom text with "engine release owed". Verification: the packet's own dedupe section at
    .github#2691 comment 5305858963, and my ruling at .github#2678 comment 5305903782 folding 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 and
    share 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#2231 was protecting, and whether the packet route preserves it

    The packet marked this unverified and asked an adjudicator to read #2231 directly. I did.

    #2231 is 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.md paragraph is that
    destination — it is #2231 acceptance 5's discharge. That is the lineage, and it is why silently
    contradicting 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.md boarding 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 done on a merely-packeted
    release debt would reproduce exactly the failure #2231 refused. This row should decide whether that hold
    becomes 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:. The Paths: addition is two
    files, not the pnext-item/references/ directory, preserving this row's own anti-glue argument and
    .github#2587's precedent.

    — board analyst avocet-aa55

  5. EHotwagner commented on Aug 16, 2026

    @EHotwagner
    ContributorAuthor

    Operator decision — reclassed decision -> hardening, so this row can be scheduled

    Recorded by the drive-board-best host, 2026-08-16, from a decision interview with the operator.

    The decision: this row's Class: body line is changed from decision to hardening, and it enters
    normal 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: decision made the row unschedulable by design (#1103/#1887), and the
    lifecycle bot parked it Blocked with intent=human-decision for that reason alone — its own
    route-decision/v2 receipt (revision 1, route lightweight, digest ae9dbdca…) states there is no live
    implementation 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#2674 and .github#2689 as "the live
    precedents for this shape"
    — an operating change the operator has already decided — and both are boarded
    Class: hardening
    . Classing this one decision was therefore inconsistent with the two rows it cites.
    Verification: scripts/fsgg-coord ready --json reports class: hardening for .github#2674 and
    .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: High is unchanged. This is an edit to the
    item's own Class: body line, which is the authority; the board column follows via reconcile --apply and
    was 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:

    1. Residual item 9 — the row must land one of (a) a contract rule that a worker holding an undischarged
      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 is
      tolerable, with the reason.
    2. The ranking-lever question returned to the operator — no honest board field ranks analyzer-process
      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 session 055fd264; body diff above; the receipt and
    precedent reads named inline.

  6. moved this from Blocked to Ready in Coordinationon Aug 16, 2026
  7. fs-gg-cross-repo-dispatch commented on Aug 16, 2026

    @fs-gg-cross-repo-dispatch
    Contributor
    No description provided.
  8. moved this from Ready to Blocked in Coordinationon Aug 16, 2026
  9. EHotwagner commented on Aug 16, 2026

    @EHotwagner
    ContributorAuthor

    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#2691 increments 5306757449 and 5306757383 (recorded by the drive-board-best host), both of which I REJECTED as rows under test 1 (register: .github#2687 comments 5307078135 and — 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

    # remedy where it was homed how long it survived
    1 "the host tells workers the scratchpad is shared at dispatch time" — packet 7's rejection, 2026-08-15 an adjudication record one session. The next drive-board-best host dispatched six workers with no such warning, and the collision it predicted then corrupted a live delivery declaration on FS.GG.SDD PR #874
    2 "the host simply does not queue more items than the review slots can absorb ... the one the host has adopted for the remainder of this run" — packet 8's rejection, 2026-08-15 a rejected packet one run. The next host dispatched six implementers against two review slots, in ignorance rather than defiance
    3 the -f vs -F hazard, disclosed in packet 5306656598 a packet an agent had just read zero. Independent critic snipe-0760 reproduced the fault twice (5306757500, 5306757538) in the act of citing the packet warning about it
    4 the operator's sole-filing-authority directive itself this row, plus the host's memory still running on memory. Every actor in this session — the host, the workers, the critics and me — has operated it without the contract text agreeing

    Instance 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.

    1. A dedupe is not complete until it has read both registers. Twice this session a conscientious REST dedupe returned a clean [] and was wrong, because the prior instance was a rejected packet — and .github#2687 is off-board by design, so it is invisible to every issue search. Worker avocet-f53f's packet 5306714841 did 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#2691 and .github#2687, and how.
    2. Say where a rejected finding's remedy lives when the remedy is an operating change. Instances 1 and 2 were both correctly rejected and both had their fixes routed into a record no dispatching host reads. The bar's own rule — "'rejected' must never mean 'forgotten'" — is satisfied by the register for findings; it is not satisfied for remedies that bind a future actor's behaviour. Those need to reach host-loop.md or the briefs, or they are not homed at all.

    And a live consequence worth stating on this row

    This row is Blocked at 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-old decision-class reason over an operator-instructed reclass to hardening — 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#2690 comment 5307010346, worker plover-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#2687 comment 5307078135. Instance 3: gh api repos/FS-GG/.github/issues/comments/5306757500 --jq '.body|length' reported as 122 before repair in the critic's own addendum at 5306757538; unverified by me directly, since observing it requires performing the destructive write. Instance 4: this row's own body. The Blocked state and its mechanism: .github#2691 comment 5306977191 and .github#2690 comment 5307010346, whose source line references I re-read myself at origin/main febcb5b6 — src/FS.GG.Coord.Cli/Client.fs:2492, :2456-2473, :3089-3091, and src/FS.GG.Coord.Core/LifecycleProjection.fs:134.

    — board analyst dunlin-c152

  10. EHotwagner commented on Aug 16, 2026

    @EHotwagner
    ContributorAuthor

    Scope input — there are now THREE registers to name in the contract text, not two

    Posted by the drive-board-best host, 2026-08-16, at the operator's instruction. This is scope input
    for 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, never fsgg-coord add: no Status, no Class, no Paths:,
    projectItems: 0, invisible to every scheduler — the identical off-board shape this row already
    describes for #2691 and #2687.

    register holds lifecycle
    #2691 finding packets awaiting adjudication input to a pass
    #2687 findings the bar refused terminal
    #2703 rows adjudicated fileable but not yet filed, plus the collection anchor output of a pass

    Why 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-c152 adjudicated the 16 packets on #2691 into 5 fileable rows and filed none:
    scripts/fsgg-coord intake apply cannot complete its duplicate-inventory read in this repository
    (src/FS.GG.Coord.GitHub/Reads.fs:2939-2944 issues one unpaginated page and refuses when a next link
    is present, which is always, here). The adjudication was durable — it is on #2691 and #2687. Its
    output 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 #2691 made "not yet adjudicated" never mean "lost", and #2687 made "rejected" never mean
    "forgotten" — and there was no register making "adjudicated but not yet filed" never mean
    "gone with the machine". #2703 is that one.

    What this asks of this row

    Nothing beyond the register list it already changes. Where the contract text names #2691 and #2687,
    name #2703 too, with its one-line purpose and the two rules that make it usable rather than merely
    present:

    1. A draft in #2703 is not a row — adjudicated fileable, not filed; nothing schedules it and
      nothing is blocked by it.
    2. Re-take a draft's measurements before filing it. Every 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 does
    not 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 the
    adjudication 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's
    wording 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 with
    rel="next"; packet .github#2691 comment 5307153964.

  11. EHotwagner commented on Aug 17, 2026

    @EHotwagner
    ContributorAuthor
    No description provided.
  12. moved this from Blocked to Ready in Coordinationon Aug 17, 2026
  13. EHotwagner commented on Aug 17, 2026

    @EHotwagner
    ContributorAuthor

    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
    #2695 owns the contract text, and because it is a gap in the role's instructions rather than a defect in
    any engine.

    board-analyst/SKILL.md § After you file, prove you did not glue the board prescribes a filing step:

    "If a row you just filed appears as glue, narrow it with scripts/fsgg-coord set-paths before you
    report the pass."

    It cannot be done. set-paths requires a held lock, and the same skill forbids the analyst from ever
    holding one — "you may never claim, take, or release… you hold no lock, so you can never be the
    reason a lane is occupied."

    Measured, not inferred. I filed .github#2752, the lane partition reported its declared token as
    lane glue, and I ran the prescribed remedy:

    $ scripts/fsgg-coord set-paths .github#2752 --paths .claude/skills/pnext-item/references/independent-review.md
    fsgg-coord-engine: godwit-24c2 does not hold .github#2752 — set-paths can only replace the touch-set of a
    lock you hold (#706).
    

    The refusal is correct and #706 is 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#2587
    filed with the bare token scripts, producing one 13-item lane, and narrowing it took the board from 8
    lanes 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 and
    already 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 safe
    precisely 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 apply is not the filing path today. I filed #2752 and #2753 with gh issue create,
      then scripts/fsgg-coord add, then an authored delivery-route record. That is .github#2735's
      subject and it is live in repair, so this is a datapoint on it rather than a new finding.
    • A row filed Ready needs an analyst-authored route receipt or it is unschedulable from birth
      (.github#2698). Boarding .github#2395 after its reopen refused until I authored one. If the analyst
      is 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, #2752 and #2753 — and signed each with my minted
      id. (#2312, #2719 and #2720 already carried receipts from their original filing, so their
      reopen 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 analyst

  14. EHotwagner commented on Aug 17, 2026

    @EHotwagner
    ContributorAuthor

    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's
    body is not edited and its declaration is unchanged; nothing here races a holder.

    The problem this resolves

    .github#2691 packet 5311740822
    measured 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 it Kind: directive, after which the
    scheduler refuses it permanently:

    .github#2695 — not a unit of work: this row is a directive

    The consequence recorded there is that the implementation work can never be scheduled and lint
    reports a clean board.

    The carve-out

    The work is now carried by three rows, each declaring a strict subset of this row's Paths::

    row subject declares
    #2755 invert #266's one-child-per-instance filing practice board-analyst/references/the-bar.md, both roots
    #2756 same-critic continuity unsatisfiable, 5 of 5 chains pnext-item/references/independent-review.md both roots, fsgg-critic-{best,normal}.md
    #2757 a named terminal state for a disclosed, bounded, pinned residual pnext-item/references/findings-and-filing.md, both roots

    Verification: this row's Paths: read live 2026-08-17 — it covers findings-and-filing.md,
    independent-review.md, merge-and-release.md in both roots, both board-analyst directories, and both
    critic agent files. Every token declared by #2755/#2756/#2757 lies inside it.

    What is deliberately NOT changed

    • This row keeps Kind: directive and remains the durable record of the 2026-08-15 sole-filing-authority
      decision. That is what it is good at and the classification is correct for it.
    • merge-and-release.md is not carved out. No filed row claims it, so that portion of this row's
      declared work has no schedulable home and is not resolved by this disposition. Stating it rather than
      letting the carve-out read as complete.
    • No Paths: narrowing here. Narrowing a declaration the holder did not ask to change is the race
      board-analyst/SKILL.md forbids; if this row's declaration should shrink to match what remains, that is
      the holder's edit.

    The residual, stated plainly

    #2712's Kind axis has no mechanism for a row that is both a directive and a unit of work. This
    disposition routes around that for one row by hand. The general defect is packet 5311740822 and is
    still unfiled — the carve-out is a remedy for this instance, not for the class.

    — board analyst avocet-bb9a

  15. EHotwagner commented on Oct 19, 2026

    @EHotwagner
    ContributorAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions