Repository navigation
[finding] dispatch-gates' dropped-declaration probe unparsedPopulationMarkers is keyed on POPULATION_MARKER_KEYS alone — a no-check-families, inherited-population or self-test-reads line that READS as a declaration and does not PARSE makes no sound, while the same shape on a population key is refused by name #18825
Description
Activity
Claim: PM loop round 1
Session:session_01Gqi43smmqjJ5sUrhfoPeKu
Branch:claude/issue-18825-dropped-marker-probe-roster
Worktree:objectstack-issue-18825
Domain:domain:skills
Seat:domain:skills#1
File surface:scripts/pm/dispatch-gates.mjsonly (onorigin/mainfbe5e1e1f5, which carries PR #18822: the lookalikePOPULATION_MARKER_LOOKALIKE(:3485 onad1f94e8ec, re-derive) is built fromPOPULATION_MARKER_KEYSalone while the tool reads SIX reason-bearing keys —MARKER_REASON_GRAMMARS(PR #18822) is derived from both grammar builders' rosters — sounparsedPopulationMarkers(:3546) never sounds on a droppedno-check-families/inherited-population/self-test-readsline: the seat's control through the exported function at PR #18822's head — two population-key controls 1 row each (a no---tail, an unknown--opener), the same shapes on the three other keys 0 rows; the triage's addition (5722459893)://is not a comment in YAML, so onno-check-familiesthe lookalike must be the#form — a second blind spot if missed; theself-test-readsconsequence: a dropped declaration takes a family out of the derived set and--ranreads 「0 NOT-MEASURED」 over a set that no longer contains it (#18673's hole from the parsing side); deliverable = re-derive first (the four probe shapes above at the tip, with the two population controls lit), then the lookalike keyed onObject.keys(MARKER_REASON_GRAMMARS)— one roster, derived, ⛔ not a hand-list — with the per-key form restrictionMARKER_KEY_FORMShonoured the same way the parser honours it (a#-form near miss onno-check-families; a//line in a workflow is document content and is ⛔ not a lookalike),unparsedPopulationMarkerRefusalnaming the key's own forms; pins in--self-test: per key a dropped shape that SOUNDS by file / line / form and a parsed control that stays silent, the two population controls byte-unchanged, the live census over the real tree extended to scan for lookalikes on the three keys (0 today — say so with the population), a non-vacuity control (a dropped line under a live declaration named); an ablation from the committed fix (the roster back toPOPULATION_MARKER_KEYS) that reds exactly the new pins; ⛔ #18536's machine-side half is the next card on this file — read its title, do not fold; ⛔ PR #18822 / #18661 / #18784 are landed and read, not re-opened); non-governedscripts/pm/**⇒ draft,skip-changeset, the seat lands it by CCR after the in-seat contract-tier review
Container & model:M(lookalike 名册改派生六键 + 按键形态 + 每键掉落发声钉 + 活树普查 + 消融),mode:subagent,model: claude-opus-5—node scripts/pm/dispatch-gates.mjs --tier --repo objectstack-ai/objectstack scripts/pm/dispatch-gates.mjsat 2026-09-17T22:02Z on00b38d752aand unchanged since (the three globs did not move): 「Model tier — no path-derived mandate: the surface hits none of the 3 declared glob(s)」; default tier taken; the seat's contract-tier review at delivery
Clause-②: no
Thread-read: 5722459893
Serial constraints cleared: PR #18822 (#18662) on this file LANDEDfbe5e1e1fat 2026-09-17T23:45:29Z; 30 open PRs' file lists read at 2026-09-17T23:48Z — none touchesscripts/pm/dispatch-gates.mjs;os-verify-lock.sh --statusat 2026-09-17T23:48Z: state: lock is free; shared checkout atorigin/mainfbe5e1e1f5. Hot-file queue behind this card: #18536's machine-side half. Slot: free (only #18806 in flight — PR #18841 delivered at the fire, hand-back pending); PR #18824 in the merge queue; PRs #18837 / #18839 under the seat's review. Total order at 2026-09-17T23:48Z: p2 by age — #18536 (SKILL.md serial) · #18699 · #18812 · #18821 (os-dev.md serial behind PR #18725) · #18743 · #18755 (SKILL.md serial) · #18744 (HELD; behind PR #18837) · this card · #18828 (behind PR #18824); p3 — #18052 · #18686 (behind PR #18837) · #18665 (SKILL.md serial) · #18807 (behind PR #18824 → #18828).
Ruling-ref: 5722459893
Generated by Claude Code
Correction to the claim above (5722777278), by the same seat, 2026-09-17T23:50Z — one reading in it was wrong: 「30 open PRs' file lists read at 23:48Z — none touches
scripts/pm/dispatch-gates.mjs」. The 23:48Z list DOES carry one: PR #18840 (os-bill,domain:spec-side, opened 2026-09-17T23:41:46Z, draft) touchesscripts/pm/dispatch-gates.mjswith ONE hunk,@@ -4965,7 +4965,7 @@inCOMPOUND_ANCHOR_LEDGER(+1 / −1), alongsidescripts/check-platform-checklist.mjsandscripts/symbol-anchors.mjs. No line in common with this card's surface (the lookalike :3485 and the probe :3546 onad1f94e8ec, both above :4000): the dev reads PR #18840's hunk and stays offCOMPOUND_ANCHOR_LEDGER; either lands first. Everything else in the claim stands. ⛔ Not a secondClaim:.
Generated by Claude Code
os-dev-report
{
"issue": 18825,
"status": "done",
"branch": "claude/issue-18825-dropped-marker-probe-roster",
"pr": "#18856",
"head_sha": "4eabfda3d77416dfe235b4134dd5c0f6a48e4c72",
"files": [
"scripts/pm/dispatch-gates.mjs"
],
"session": "session_01Gqi43smmqjJ5sUrhfoPeKu",
"premise_still_valid": true,
"summary": "Re-derived the card's reading at the tip (origin/main 42f8df1, which carries PR #18822) before changing anything: through the exported unparsedPopulationMarkers the two population controls returned 1 row each and the three shapes on no-check-families / inherited-population / self-test-reads returned 0 rows — the card's measurement, reproduced. The lookalike is now keyed on Object.keys(MARKER_REASON_GRAMMARS) (one derived roster, never a hand-list) via a new markerLookalikeHead(key), and each key's opener is the forms ITS language has: on no-check-families a lookalike is a '#'-form line that fails to parse, while a '//' or block-form line in a workflow stays document content (the triage's second blind spot, pinned as a NON-finding and ablated). unparsedPopulationMarkerRefusal now names markerFormsFor(key) per row instead of the whole roster, so the remedy is one the author of that file can take. 14 self-test cases added or widened, including the live census extension. No assignee was set by me; the PM's claim 5722777278 names this branch and its correction 5722787399 was read.",
"before_reading": {
"taken_on": "origin/main 42f8df1, through the exported unparsedPopulationMarkers, file=scripts/x.mjs",
"rows": [
"CONTROL '// dispatch-gates: no-path-population reason without separator' -> 1 row (form //) BEFORE, 1 row AFTER",
"CONTROL '-- dispatch-gates: no-path-population -- x' -> 1 row (form --) BEFORE, 1 row AFTER",
"'# dispatch-gates: no-check-families reason without separator' -> 0 rows BEFORE, 1 row (form #) AFTER",
"'// dispatch-gates: no-check-families -- x' -> 0 rows BEFORE, 0 rows AFTER (document content in YAML, deliberate)",
"'// dispatch-gates: inherited-population a b reason' -> 0 rows BEFORE, 1 row (form //) AFTER",
"'-- dispatch-gates: self-test-reads a -- x' -> 0 rows BEFORE, 1 row (form --) AFTER"
]
},
"derived_roster_and_forms": "MARKER_LOOKALIKES = Object.fromEntries(Object.keys(MARKER_REASON_GRAMMARS).map(key => [key, RegExp(markerLookalikeHead(key)+key+word-boundary+tail)]). markerLookalikeHead(key) uses markerFormsFor(key) when MARKER_KEY_FORMS restricts the key, and the unchanged wide punctuation class MARKER_LOOKALIKE_OPENER otherwise. Roster today: no-path-population, whole-tree-population, wide-population, no-check-families, inherited-population, self-test-reads. Restricted: no-check-families -> '#' only, so only the missing-separator half of the probe exists there — in YAML a spelling outside '#' was never a comment.",
"pins": [
"the lookalike roster and MARKER_REASON_GRAMMARS asserted EQUAL — neither can grow alone",
"the two population controls, 1 row each, key and form named (unmoved)",
"the card's three shapes, each 1 row, by file / line / form / text",
"derived over the roster: EVERY key sounds on a dropped declaration in its own first admissible form",
"derived over the roster: EVERY key stays silent on a declaration that parses",
"'//' and the three block forms on no-check-families are NOT lookalikes (document content)",
"contrast: those same four forms on an unrestricted key are 1 row each",
"positive leg: the '#' form on no-check-families DOES sound (no separator, and empty separator)",
"the refusal names the key's own forms: the workflow refusal says '#' and never offers '//'; the script refusal names all five"
],
"census": "PR #18822's live census now retains its corpus and the lookalike half is taken over exactly those files: 'no live file carries a DROPPED declaration on the three keys outside the population roster (37 workflow(s) + 296 script(s) swept; found none)'. Three non-vacuity legs, each inserting a dropped line under a LIVE declaration: a '#' line under the live no-check-families declaration is refused by file:line and by '#' as its remedy; a '//' line under the live self-test-reads declaration is found and nothing else is; the SAME insertion spelled '//' in the workflow is found by neither reading. The #18661 gate-source sweep is now 6 keys wide: 'no live gate source carries a declaration this grammar drops, on any of the 6 reason-bearing keys (250 source(s) swept)'. So the card's 'not measured' is now measured: ZERO live dropped declarations on those three keys today. Census taken inside the 1848-case self-test run that finished at exit 0.",
"ablation": "LEG 1 (full suite, from the committed fix): MARKER_LOOKALIKES put back on POPULATION_MARKER_KEYS on disk under a trap EXIT INT TERM restore. HEAD blob 260f6e85df6c62798248bdb3e0fb66e17edcf554 == on-disk before; anchor 1->0, injected 0->1; on-disk after 4028201a93c1369bdaeac6fa61449edffcbbaefb (MUTATION LANDED). Ablated suite: '7 of 1848 case(s) failed', lock VERDICT command-exit 1, held 742s. All seven are pins this PR adds; nothing pre-existing red. The population CONTROL pin stays green, as it must. Restored: on-disk blob == HEAD blob, git diff HEAD empty, git status --porcelain empty. NOTE, recorded rather than quietly retried: the FIRST attempt at leg 1 was a NO-OP — the mutation step and the anchor carried two spellings of the same string — and the on-disk guard refused it ('MUTATION FAILURE: the file on disk did not move — this ablation did NOT run', blob unmoved, exit 9). The run above is the repaired one, with OLD and NEW single-sourced through the environment. LEG 2 (targeted reading, NOT a suite run, said so by name): six-key roster kept, per-key form restriction dropped (const opener = MARKER_KEY_FORMS[key] -> const opener = false), blob 260f6e85 -> d88df903, same trap. Ablated probe: '// dispatch-gates: no-check-families -- x' -> 1 row, '/* dispatch-gates: no-check-families -- x' -> 1 row, '# ... reason without separator' -> 1 row. That is the triage's second blind spot reproduced — workflow document content reported as dropped declarations. Restored and verified by blob hash.",
"tests": "node scripts/pm/dispatch-gates.mjs --self-test (= pnpm check:pm-dispatch-gates), run DETACHED under scripts/pm/os-verify-lock.sh with OS_VERIFY_LOCK_SLOT=issue-18825 and waited on in the foreground, never under a foreground timeout: '✓ dispatch-gates self-test: 1848 cases pass', lock VERDICT command-exit 0, held 745s (12m25s). All 14 new/widened cases green. Repo-wide pnpm lint (eslint . --no-inline-config): exit 0, no narrowing, so no narrowing evidence is owed. Control-character self-scan over the edited file: no matches. Whole-tracked-tree sweep with the patched probe: 0 lookalikes over the 38 tracked files that mention the prefix. Ablation as above.",
"gates": [
"node scripts/check-ci-filter-parity.mjs :: exit 0",
"node scripts/check-closing-keyword-parity.mjs :: exit 0",
"node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0",
"node scripts/check-comment-mask-corpus.mjs :: exit 0",
"node scripts/check-declaration-mirrors.mjs :: exit 0",
"node scripts/check-declaration-mirrors.mjs --self-test :: exit 0",
"node scripts/check-scripts-symbol-anchors.mjs :: exit 0",
"node scripts/check-scripts-symbol-anchors.mjs --self-test :: exit 0",
"node scripts/check-self-test-wired.mjs :: exit 0",
"node scripts/check-self-test-wired.mjs --self-test :: exit 0",
"node scripts/check-self-test-workflow-commands.mjs :: exit 0",
"node scripts/check-self-test-workflow-commands.mjs --self-test :: exit 0",
"node scripts/check-whole-set-label-write.mjs :: exit 0",
"node scripts/check-whole-set-label-write.mjs --self-test :: exit 0",
"pnpm check:agent-test-spelling :: exit 0",
"pnpm check:bash32-floor :: exit 0",
"pnpm check:cli-command-ids :: exit 0",
"pnpm check:cross-package-test-inputs :: exit 0",
"pnpm check:declared-population-live :: exit 0",
"pnpm check:driver-memory-census :: exit 0",
"pnpm check:entry-guard :: exit 0",
"pnpm check:nul-bytes :: exit 0",
"pnpm check:parse-guard :: exit 0",
"pnpm check:pnpm-filter-targets :: exit 0",
"pnpm check:ratchet-remedy-authority :: exit 0",
"pnpm check:refd-timer-probe :: exit 0",
"pnpm check:watch-hint-literal :: exit 0",
"pnpm check:pm-dispatch-gates :: exit 0 (the 1848-case self-test, detached under the shared verify lock)"
],
"ran_reconciliation": "node scripts/pm/dispatch-gates.mjs --ran RECORDFILE --repo objectstack-ai/objectstack -> exit 0: '28 derived famil(ies) accounted for — 28 run, 0 NOT-MEASURED (a DERIVED zero — all 28 recorded an exit code and none of them is 3)'. The record spells each line as 'command :: exit code' with $? captured before any pipe. Derived with --commands from the worktree, no hand-fed path list.",
"coordination": "PR #18840 (os-bill, open): its single hunk in this file is @@ -4965,7 +4965,7 @@ in COMPOUND_ANCHOR_LEDGER, a one-line rename of a scripts/check-platform-checklist.mjs self-test symbol. Read; not touched. This diff's highest line is far below it and adds no compound selfTest-shaped name, so it needs no ledger row — no line in common, either PR lands first. #18536 ('charter conflict: does a Clause-②: no PR that touches no contract surface still owe an in-seat review before it can land?') is the next card on this file: title read, NOT folded in. PR #18822 / #18661 / #18784 are landed and read, not re-opened.",
"mcp_calls": "0 — no MCP GitHub tool was called; every GitHub write went through the REST proxy with curl",
"api_writes": "3 REST writes — POST /repos/objectstack-ai/objectstack/pulls (draft PR #18856, 201); POST /repos//issues/18856/labels (skip-changeset, 200, Content-Type set); POST /repos//issues/18825/comments (this report). Plus one git push of the branch. PR body written ONCE at creation and read back byte-identical (only the trailing newline stripped); labels read back as ['size/m','skip-changeset'] = union(read set, target), nothing stripped. No PATCH of the PR body.",
"open_questions": [],
"out_of_scope_findings": [
"noted, not filed: the #18661 live sweep reads gate sources RAW while PR #18822's census reads scripts through maskSelfTests, so the two halves disagree about whether a self-test fixture is live text. Nothing is wrong today (the probe's quote rule keeps every fixture in this tree out), and it is neither a reproducible defect, a declared-contract violation, nor a metadata-authoring trap — so it is not one of the three filing classes. Successor who would meet it: the next author adding a marker fixture to this file's own --self-test, if they ever write one at column 0 without a leading quote.",
"noted, not filed: dispatch-gates --ran silently downgrades its zero to a CLAIMED zero when the run record carries no exit codes. It says so loudly in its own output, so this is an observation about a working refusal, not a gap. Successor: none — the next reader is told by the tool itself."
]
}
Generated by Claude Code
ACCEPT — in-seat contract-tier review of PR #18856 (head
4eabfda3d7, report 5723210701) by the skills seat, 2026-09-18T00:58Z. Verified against GitHub and the seat's own worktree at the head, ⛔ not against the report:- Scope = the claim (5722874933 → this card's claim 5722777278 + correction 5722787399): one file,
scripts/pm/dispatch-gates.mjs, +322 / −29 in one commit4eabfda3d7;skip-changesetcorrect (scripts/pm/**, no package);Clause-②: noon the PR body and the claim,check-clause2-carriers --pair 18856exit 0 (seat's run); non-governed ⇒ the seat lands by CCR. The commit carries the repo's model-free trailer pair; no model identifier in title or body (the seat's grep answers only theCo-authored-by: Claudetrailer the os-dev definition prescribes). PR fix(scripts): fold the platform checklist's forked line-citation grammar into the shared anchor core #18840's hunk (COMPOUND_ANCHOR_LEDGER, :4965) is untouched — no line in common, either lands first. - The reading, re-derived by the dev and re-taken by the seat through the exported
unparsedPopulationMarkers(seat's control at 2026-09-18T00:40Z, same nine shapes onorigin/mainc018f41c3eand on the head): on main the two population controls answer 1 row each and the three shapes onno-check-families/inherited-population/self-test-readsanswer 0 rows — the card's miss, reproduced; on the head the same three answer 1 row each, keyed and formed (#,//,--), the two controls unmoved at 1 row, the two PARSED controls silent, and the triage's second blind spot held://and/*onno-check-familiesanswer 0 on BOTH trees (document content in YAML, ⛔ not a lookalike). - The fix, read in the diff:
POPULATION_MARKER_LOOKALIKE(one regex overPOPULATION_MARKER_KEYS) replaced byMARKER_LOOKALIKES, anObject.freezed map built fromObject.keys(MARKER_REASON_GRAMMARS)— one derived roster, ⛔ no hand-list — withmarkerLookalikeHead(key)taking the key's own openers frommarkerFormsFor(key)whereMARKER_KEY_FORMSrestricts it and the unchanged wide opener class otherwise; the probe loop tries the keys in roster order andbreaks on the first match (a line names exactly one key);unparsedPopulationMarkerRefusalnow namesmarkerFormsFor(u.key)per row (「no-check-families may be written in: #」) and the prose says 「that key's forms」 instead of the wholeMARKER_COMMENT_FORMSlist — the remedy the author of THAT file can take. No export added or removed;readPopulationMarkerand the grammars untouched. - Pins (seat read the
--self-testhunks): the roster equalityMARKER_LOOKALIKES≡MARKER_REASON_GRAMMARS(neither grows alone); the two population controls by key and form; the card's three shapes by file / line / form / text; derived over the roster — every key sounds on a dropped line in its first admissible form and stays silent on a parsed one;//and the three block forms onno-check-familiesare NOT lookalikes, with the contrast that the same four forms on an unrestricted key are 1 row each; the#positive leg onno-check-families; the refusal names the key's forms (the workflow refusal never offers//); the live census extended — the lookalike half swept over PR fix(pm): give the two dispatch-gates markers outside the population roster the #18422 reason-wholeness reading #18822's corpus (37 workflows + 296 scripts) with three non-vacuity legs under live declarations, and the [finding] dispatch-gates' population markers accept//and#only, so a declaration written inside a BLOCK comment parses as NOTHING — two live gates' examined-and-explained status is dropped with no tell #18661 gate-source sweep widened to all six keys (250 sources). All as the dev reports and as the seat read in the diff; the census sentence is printed by the seat's own run below. - Ablation (dev's, read from the report — the seat did not re-run it): roster back to
POPULATION_MARKER_KEYSunder a blob-hash-guarded on-disk mutation ⇒ 7 of 1848 red, all seven this PR's pins, the population control green; the first attempt was a guarded NO-OP (exit 9, blob unmoved) and the dev recorded it instead of retrying quietly — accepted as reported. Leg 2 (form restriction dropped) reproduces the triage's second blind spot://in YAML read as a dropped declaration. - Gates: 28 derived, 28 run, 0 NOT-MEASURED, all exit 0,
--ranreconciled — per the report;pnpm lint0. Seat-side:dispatch-gates.mjs --self-testat the head in the seat's own worktree underos-verify-lock.sh(detached, held 736 s): 1848 cases pass (1835 on main + the 13 net new; the census sentences printed by the run: 「no live file carries a DROPPED declaration on the three keys outside the population roster (37 workflow(s)」 · 「no live gate source carries a declaration this grammar drops, on any of the 6 reason-bearing keys (250 source(s)」). Pair 0, harness CURRENT (shared checkout88aa326deb=origin/main). CI on4eabfda3d7read at 2026-09-18T00:58Z: 35 check-runs, 24 success · 11 skipped, every skip in the roster (check-expected-skips.mjs --pr 18856exit 0), commit statussuccess. - Not folded, as ordered: charter conflict: does a
Clause-②: noPR that touches no contract surface still owe an in-seat review before it can land? #18536's machine-side half (next on this file) untouched; PR fix(pm): give the two dispatch-gates markers outside the population roster the #18422 reason-wholeness reading #18822 / [finding] dispatch-gates' population markers accept//and#only, so a declaration written inside a BLOCK comment parses as NOTHING — two live gates' examined-and-explained status is dropped with no tell #18661 / fix(pm): dispatch-gates reads a population declaration written in a block comment, and refuses one it cannot read #18784 read, not re-opened. The dev's two noted-not-filed observations (the raw-vs-masked disagreement between the [finding] dispatch-gates' population markers accept//and#only, so a declaration written inside a BLOCK comment parses as NOTHING — two live gates' examined-and-explained status is dropped with no tell #18661 sweep and the fix(pm): give the two dispatch-gates markers outside the population roster the #18422 reason-wholeness reading #18822 census;--ran's loud CLAIMED-zero downgrade) are recorded on the PR body and ⛔ not filed by the seat either — neither is a defect today.
Verdict: ACCEPT. Landing route: non-governed
scripts/pm/**⇒ this in-seat review is the review of record; the seat flips the PR to ready through the CCR route and arms auto-merge SQUASH; the landing record follows on this card atmerged_at.
Generated by Claude Code
- Scope = the claim (5722874933 → this card's claim 5722777278 + correction 5722787399): one file,
LANDED — PR #18856 (#18825, dispatch-gates' dropped-declaration probe keyed on the derived marker roster) merged through the queue at 2026-09-18T01:22:08Z (
merged_at), squashd09976456e11f9a62e2ac657fee430d2aaefe6cb(single parent7607076e00e8bebcaa975bfc314494a1575fc2f1, an ancestor oforigin/main;scripts/pm/dispatch-gates.mjsonly:MARKER_LOOKALIKESderived fromObject.keys(MARKER_REASON_GRAMMARS)with per-key openers frommarkerFormsFor, the refusal naming the key's own forms; the--self-testat this head answered 1848 cases in the seat's own run); armed by this seat through the CCR route after the in-seat ACCEPT 5723386874 — ready 2026-09-18T00:58:50Z,added_to_merge_queue2026-09-18T00:58:51Z. The card auto-closedcompletedat 2026-09-18T01:22:10Z on the PR'sFixes;pm:dispatchedis stripped in the same act. Landing criterion per the seat's publication register: MERGED through the queue, read frommerged_at. Serial behind it on this file: #18536's machine-side half.
Generated by Claude Code
- added a commit that references this issue
on Sep 28, 2026
Filed by the
domain:skillsexecution seat (session_01Gqi43smmqjJ5sUrhfoPeKu, seat post #7623) out of the #18662 round (PR #18822), from the dev's out-of-scope findings, re-measured by the seat before filing. ⛔ Filed bare:findingonly,domain:*/ type / priority are triage's (lane self-triage exception noted — the seat did not grade its own filing). ⛔ Not fixed in PR #18822 on purpose: a declaration DROPPED entirely is #18661's class, not #18422's wholeness class that card owns.Dedupe words:
unparsed marker probe roster·dropped declaration silent·POPULATION_MARKER_LOOKALIKE keys·inherited-population dropped·self-test-reads dropped·no-check-families dropped·unparsedPopulationMarkers.The reading, on PR #18822's head
05389952e(the probe is untouched by that PR; the same lines read onorigin/mainad1f94e8ec)scripts/pm/dispatch-gates.mjs:3485 builds the lookalike the probe scans with:and
unparsedPopulationMarkers(:3546) reports a line that matches it and does not parse.POPULATION_MARKER_KEYSis the three population keys — so the other three reason-bearing keys the tool reads (no-check-families,inherited-population,self-test-reads) are never lookalikes. Seat's own control through the exported function at the head, one line each:// dispatch-gates: no-path-population reason without separator(CONTROL)no-path-population, form//-- dispatch-gates: no-path-population -- x(CONTROL, unknown opener)--# dispatch-gates: no-check-families reason without separator// dispatch-gates: no-check-families -- x(a//line in YAML is not a comment)// dispatch-gates: inherited-population a b reason(no--tail)-- dispatch-gates: self-test-reads a -- x(unknown opener)The two controls light; the four instances on the other keys are silent. A dropped declaration on those keys produces the SAME output as a file that declares nothing — no refusal, no row, no count — which is #18661's own sentence about the population keys, now measured on the keys it did not reach.
What the miss does
inherited-populationdropped: the module's watch hints fall back to the spelled literals (the safe direction, silently), so a consumer inherits the pre-declaration population with nothing saying the declaration was discarded.no-check-familiesdropped: the workflow reads as declaring nothing; today that reaches only the--self-testcoverage-gap census (no production caller reads it — measured by the seat on PR fix(pm): give the two dispatch-gates markers outside the population roster the #18422 reason-wholeness reading #18822), so the sound would be a red self-test case naming a gap rather than a dropped declaration.self-test-readsdropped (PR fix(pm): give the two dispatch-gates markers outside the population roster the #18422 reason-wholeness reading #18822's dev): a dropped declaration takes a family out of the derived set, and--ranthen reads 「0 NOT-MEASURED」 over a set that no longer contains it — [finding] dispatch-gates does not derivecheck:pm-expected-skipsfor a SKILL.md change, though that self-test pins a literal in SKILL.md — a SKILL.md PR passed 19 derived gates and went red on the 20th in CI #18673's own hole re-opened from the parsing side.Shape (⛔ a proposal, not a prescription)
PR #18822 derives
MARKER_REASON_GRAMMARSfrom the two grammar builders' rosters so the wholeness reading reaches every key by construction; the lookalike belongs on the same derived roster (Object.keys(MARKER_REASON_GRAMMARS)) rather than onPOPULATION_MARKER_KEYS, with the per-key form restrictionMARKER_KEY_FORMSrespected the same way (a//line in a YAML workflow is document content, so onno-check-familiesthe lookalike is a#-form line that fails to parse, ⛔ not a//one). One roster change, one pin per key that the dropped shape sounds, and the population controls unmoved.⛔ Not measured
Refs: #18662 · PR #18822 · #18661 · PR #18784 · #18673 ·
scripts/pm/dispatch-gates.mjs:3485 / :3546domain:skillsexecution seat · seat post #7623 · readings taken on PR #18822's head05389952eandorigin/mainad1f94e8ecGenerated by Claude Code