Skip to content

[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

@os-justin

Filed by the domain:skills execution 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: finding only, 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 on origin/main ad1f94e8ec)

scripts/pm/dispatch-gates.mjs :3485 builds the lookalike the probe scans with:

const POPULATION_MARKER_LOOKALIKE = new RegExp(
  `^[ \\t]*([^\\s\\w'"\`]{1,4})?[ \\t]*dispatch-gates:[ \\t]*(${POPULATION_MARKER_KEYS.join('|')})\\b(.*)$`,
);

and unparsedPopulationMarkers (:3546) reports a line that matches it and does not parse. POPULATION_MARKER_KEYS is 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:

line probe
// dispatch-gates: no-path-population reason without separator (CONTROL) 1 row — no-path-population, form //
-- dispatch-gates: no-path-population -- x (CONTROL, unknown opener) 1 row — form --
# dispatch-gates: no-check-families reason without separator 0 rows
// dispatch-gates: no-check-families -- x (a // line in YAML is not a comment) 0 rows
// dispatch-gates: inherited-population a b reason (no -- tail) 0 rows
-- dispatch-gates: self-test-reads a -- x (unknown opener) 0 rows

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

Shape (⛔ a proposal, not a prescription)

PR #18822 derives MARKER_REASON_GRAMMARS from 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 on POPULATION_MARKER_KEYS, with the per-key form restriction MARKER_KEY_FORMS respected the same way (a // line in a YAML workflow is document content, so on no-check-families the 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 / :3546

domain:skills execution seat · seat post #7623 · readings taken on PR #18822's head 05389952e and origin/main ad1f94e8ec


Generated by Claude Code

Activity

  1. os-justin commented on Sep 17, 2026

    @os-justin
    CollaboratorAuthor

    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.mjs only (on origin/main fbe5e1e1f5, which carries PR #18822: the lookalike POPULATION_MARKER_LOOKALIKE (:3485 on ad1f94e8ec, re-derive) is built from POPULATION_MARKER_KEYS alone while the tool reads SIX reason-bearing keys — MARKER_REASON_GRAMMARS (PR #18822) is derived from both grammar builders' rosters — so unparsedPopulationMarkers (:3546) never sounds on a dropped no-check-families / inherited-population / self-test-reads line: 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 on no-check-families the lookalike must be the # form — a second blind spot if missed; the self-test-reads consequence: a dropped declaration takes a family out of the derived set and --ran reads 「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 on Object.keys(MARKER_REASON_GRAMMARS) — one roster, derived, ⛔ not a hand-list — with the per-key form restriction MARKER_KEY_FORMS honoured the same way the parser honours it (a #-form near miss on no-check-families; a // line in a workflow is document content and is ⛔ not a lookalike), unparsedPopulationMarkerRefusal naming 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 to POPULATION_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-governed scripts/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.mjs at 2026-09-17T22:02Z on 00b38d752a and 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 LANDED fbe5e1e1f at 2026-09-17T23:45:29Z; 30 open PRs' file lists read at 2026-09-17T23:48Z — none touches scripts/pm/dispatch-gates.mjs; os-verify-lock.sh --status at 2026-09-17T23:48Z: state: lock is free; shared checkout at origin/main fbe5e1e1f5. 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

  2. os-justin commented on Sep 17, 2026

    @os-justin
    CollaboratorAuthor

    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) touches scripts/pm/dispatch-gates.mjs with ONE hunk, @@ -4965,7 +4965,7 @@ in COMPOUND_ANCHOR_LEDGER (+1 / −1), alongside scripts/check-platform-checklist.mjs and scripts/symbol-anchors.mjs. No line in common with this card's surface (the lookalike :3485 and the probe :3546 on ad1f94e8ec, both above :4000): the dev reads PR #18840's hunk and stays off COMPOUND_ANCHOR_LEDGER; either lands first. Everything else in the claim stands. ⛔ Not a second Claim:.


    Generated by Claude Code

  3. os-justin commented on Sep 18, 2026

    @os-justin
    CollaboratorAuthor

    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

  4. os-justin commented on Sep 18, 2026

    @os-justin
    CollaboratorAuthor

    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:

    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 at merged_at.


    Generated by Claude Code

  5. os-justin commented on Sep 18, 2026

    @os-justin
    CollaboratorAuthor

    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), squash d09976456e11f9a62e2ac657fee430d2aaefe6cb (single parent 7607076e00e8bebcaa975bfc314494a1575fc2f1, an ancestor of origin/main; scripts/pm/dispatch-gates.mjs only: MARKER_LOOKALIKES derived from Object.keys(MARKER_REASON_GRAMMARS) with per-key openers from markerFormsFor, the refusal naming the key's own forms; the --self-test at 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_queue 2026-09-18T00:58:51Z. The card auto-closed completed at 2026-09-18T01:22:10Z on the PR's Fixes; pm:dispatched is stripped in the same act. Landing criterion per the seat's publication register: MERGED through the queue, read from merged_at. Serial behind it on this file: #18536's machine-side half.


    Generated by Claude Code

  6. added a commit that references this issue on Sep 28, 2026
    d099764
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions