Skip to content

[finding] AGENTS.md :461–:463 names git ls-remote --heads origin | grep issue-<n> as the claim pre-check and never says what a HIT means — 257 of 291 claude/issue-* heads carry no PR, so the silent direction is a live card read as claimed #18811

Description

@os-justin

Filed by the domain:skills execution seat (session_01Gqi43smmqjJ5sUrhfoPeKu, seat post #7623) out of the #18774 round (PR #18808), from the dev's open_questions, re-read 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). ⛔ A governed-text question (AGENTS.md, rules layer, the maintainer's word): the fact rows PR #18808 lands say the reading; the rules-layer sentence a dev actually reads does not.

Dedupe words: ls-remote pre-check hit meaning · branch is a hint claim is the comment · AGENTS.md issue-<n> pre-check · stray claude/issue-* heads · pre-check silent direction.

The reading, on origin/main 034f5a3afd

AGENTS.md :459–:463 (rule 2, 「One feature branch + one PR per task」):

The issue number is what makes in-flight work discoverable — git ls-remote --heads origin | grep issue-<n> is a one-command pre-check, and the Duplicate Fix Guard workflow warns on fix PRs whose branch names no declared issue.

That is the whole of what the rules layer says about the pre-check: what the command IS. It never says what a hit MEANS. Measured on the same tip:

The options, as the dev put them (seat's view: A)

  • A — one clause on the existing sentence at :461–:463: a hit is a HINT; the claim is the Claim: comment on the card; most heads carry no PR. Rules layer, the maintainer's word, its own serial (no open PR touches AGENTS.md at filing; 1099 / 1099 at the ratchet, paid in-file).
  • B — leave AGENTS.md alone: the fact rows carry the reading and every seat reads the pm-dispatch references anyway. ⚠️ The dev does not: the os-dev definition points at AGENTS.md, not at platform-readings.md.
  • C — change the pre-check itself to a second read (branch AND an open PR or a Claim: comment). ⚠️ Adds a read to a one-command check whose value is that it is cheap; the reading rule in A gets the same outcome without it.

Four axes on A: 实际业务需求 — the miss is measured today (257 / 291) on the surface a dev reads before claiming; 项目长远合理性 — the rule lives once where it binds, and the references table is declared the fact layer, not the rules layer; 防 AI 写错 — a pre-check with no stated reading is the tolerant-consumer shape, the reader supplies the semantics and supplies them in the silent direction; 创业阶段不扩散 — one clause, no new mechanism, no new gate.

⛔ Not measured

  • How many devs have actually skipped a card on a stray hit (no record exists; the only signal would be a card that sat unclaimed with a stray head present).
  • Whether the Duplicate Fix Guard workflow reads the stray population at all (it warns on PR branch NAMES; it is not the pre-check).

Refs: #18774 · PR #18808 · AGENTS.md :459–:463 · .claude/skills/pm-dispatch/references/platform-readings.md :374–:379 (post-PR #18808)

domain:skills execution seat · seat post #7623 · readings taken on origin/main 034f5a3afd


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-18811-precheck-hit-is-a-hint
    Worktree: objectstack-issue-18811
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: AGENTS.md only (rules layer, governed, 1099 / 1099 at the line ratchet, paid in-file; :459–:463 rule 2 「One feature branch + one PR per task」 hands the dev git ls-remote --heads origin | grep issue-<n> as 「a one-command pre-check」 and says what the command IS, never what a HIT means — measured on origin/main a7bafc2: 291 claude/issue-* heads, 26 with an open PR, 8 with a closed PR, 257 with NO PR in the newest 1,200 (seat census 2026-09-17T21:45Z, the #18774 dev's re-take 291 at 21:48Z), and a dev container creates a remote branch it cannot delete on either channel (PR #18808), so ~88 % of hits are stale and the failure direction is silent — a live card read as claimed; the triage's correction (5722026833, p1) sharpens the shape: the reading rule ALREADY STANDS in the fact layer — platform-readings.md :378 「⛔ 不据 ls-remote | grep issue- 正命中回避该卡:失效方向是活卡被读成已认领,无红信号。」 (and PR #18808 adds :378 「「分支在」不是「卡已认领」…」 beside it) — but the dev is pointed at AGENTS.md (os-dev.md :19 「仓库根的 AGENTS.md 有约束力,第一次编辑前先读它」, 8 mentions) and never at that layer (ls-remote / Claim: appear in os-dev.md zero times), so the layer that has the rule has no reader and the layer with the reader has no rule; deliverable = ONE clause on the existing sentence at :461–:463 (a hit is a HINT — the claim is the Claim: comment on the card, most heads carry no PR — with the measured ratio and the fact-layer row cited, ⛔ not a second read added to the pre-check (option C) and ⛔ not a new paragraph), paid in-file by retiring a line whose content the file states elsewhere (say where, verbatim; ⛔ never a re-wrap as currency; row pin unchanged), the victim search the triage left (map the 257 headless heads to card numbers and list any OPEN card that is unclaimed — no Claim: comment — while a same-number stray head exists on origin; report-only, timestamped, 「may have left this state since」 on every row), the check-skill-line-ratchet / check:skill-frame-sync / check:doc-authoring readings before and after, and a ## 维护者速读(草稿) in the PR body at creation (governed, the maintainer lands); ⛔ #18774 / PR #18808 is landed-or-landing and read, not touched; ⛔ os-dev.md (#18812 / #18699 / #18698, one disease) is another serial — read, not touched); governed AGENTS.md ⇒ draft, skip-changeset, the seat's four-piece, the maintainer lands
    Container & model: M(预检命中含义一句 + 文件内付费 + 受害者检索 + 速读草稿), mode:subagent, model: claude-opus-5 — node scripts/pm/dispatch-gates.mjs --tier --repo objectstack-ai/objectstack AGENTS.md at 2026-09-17T22:43Z on a7bafc29af: 「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: 5722026833
    Serial constraints cleared: no open PR touches AGENTS.md (28 open PRs' file lists read at 2026-09-17T22:48Z); os-verify-lock.sh --status at 2026-09-17T22:48Z: held by a dispatch-gates.mjs --self-test ticket (pid 17596, 283 s at 22:48Z, a dev running it detached); shared checkout at origin/main a7bafc29af. Hot-file queue behind this card on AGENTS.md: none. Slot: the one freed by #18798 round 2 (PR #18809 delivered with its SKILL.md twin; four-piece next); #18662 and #18764 in flight; PR #18808 in the merge queue. Total order at 2026-09-17T22:49Z: p1 — this card; p2 by age — #18536 (SKILL.md serial) · #18699 (behind PR #18725) · #18743 (SKILL.md serial) · #18744 (HELD; behind PR #18808) · #18755 (SKILL.md serial) · #18806 (FREE — next after this card) · #18812 (os-dev.md serial behind PR #18725 → #18699); p3 — #18622 (behind PR #18808) · #18665 (SKILL.md serial) · #18686 (behind #18744) · #18705 (FREE, MANDATORY) · #18807 (behind #18764).
    Ruling-ref: 5722026833


    Generated by Claude Code

  2. os-justin commented on Sep 17, 2026

    @os-justin
    CollaboratorAuthor

    os-dev-report

    {
     "issue": 18811,
     "status": "done",
     "branch": "claude/issue-18811-precheck-hit-is-a-hint",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/18827",
     "head_sha": "f3eabb29edf63b5cbe03e195cb7fa72be754122f",
     "files": [
      "AGENTS.md"
     ],
     "session": "session_01Gqi43smmqjJ5sUrhfoPeKu",
     "premise_still_valid": true,
     "summary": "Re-derived the card's premise and confirmed it on the tip: AGENTS.md rule 2 states what the ls-remote pre-check IS and never what a HIT MEANS, while the reading rule stands only in platform-readings.md :378 - a layer .claude/agents/os-dev.md never points at (8 mentions of AGENTS.md, 0 of ls-remote or Claim:, lit control 9 for worktree). Landed ONE clause on the existing sentence (112 chars / 116 bytes), paid in-file by retiring the Skills section's restatement of the governed-surface queue mechanism, whose content survives verbatim in Prime Directive #14 at :257-:258, :268-:274 and :284. Net zero lines: ratchet 1099/1099 before and after, widest-row pin 768 bytes untouched. The victim search the triage left is NOT empty: 9 open cards are unclaimed by the machine claim predicate while a same-number stray head sits on origin, and all 9 of those heads are ahead_by 0 - zero-commit probes.",
     "measurements": {
      "head_census_redevived": {
       "command": "git ls-remote --heads origin 'refs/heads/claude/issue-*' | wc -l",
       "value": 290,
       "exit": 0,
       "at": "2026-09-17T22:52Z",
       "note": "INCLUDES this PR's own branch => 289 pre-existing. Seat read 291 at 21:45Z; #18774 dev read 291 at 21:48Z. Population moved DOWN by 2 (both headless) between 21:45Z and 22:52Z - the census is a moving reading."
      },
      "split_rederived": {
       "window": "newest 1200 PRs, state=all, back to 2026-09-05T14:45Z (the seat's window)",
       "at": "2026-09-17T22:54Z",
       "mine": {
        "heads": 290,
        "open_pr": 26,
        "closed_or_merged_pr": 8,
        "no_pr": 256
       },
       "seat_cited": {
        "heads": 291,
        "open_pr": 26,
        "closed_or_merged_pr": 8,
        "no_pr": 257
       },
       "note": "same population less the 2 deleted heads plus this PR's own PR-less branch; ~88% of hits stale in both readings"
      },
      "pointer_readings_os_dev_md": {
       "at_commit": "a7bafc29af",
       "git grep -c 'AGENTS\\.md'": ".claude/agents/os-dev.md:8 (exit 0)",
       "git grep -n 'ls-remote|Claim:'": "no output (exit 1)",
       "lit_control git grep -c 'worktree'": ".claude/agents/os-dev.md:9 (exit 0) - proves the empty reading is a real absence, not a bad pattern",
       "git grep -n 'platform-readings'": "one hit at :54, and only for the single-card read spelling",
       "os-dev.md :19": "仓库根的 AGENTS.md 有约束力,第一次编辑前先读它。"
      },
      "clause": {
       "verbatim": "A hit is a hint, not a claim — most heads carry no PR: ⛔ never skip a card on one, the `Claim:` comment decides.",
       "chars": 112,
       "bytes": 116,
       "lines_added": 1,
       "lands_at": "AGENTS.md :463-:464, appended to the existing sentence in rule 2's bullet",
       "shape": "one sentence in the same bullet; NOT option C (no second read added to the pre-check); NOT a new paragraph; nothing else in AGENTS.md moved"
      },
      "payment": {
       "owed": "yes - one line, AGENTS.md was at 1099/1099 with zero headroom",
       "retired_from": "AGENTS.md :799-:800 (2 lines -> 1)",
       "retired_verbatim": "⛔ **Both roots are governed surfaces** — human-merge only, or queued under **Prime Directive #14**'s pinned-approval path; no per-PR check holds it: the queue guard refuses an unpinned governed diff at queue time.",
       "now_verbatim": "⛔ **Both roots are governed surfaces** — human-merge only, or **Prime Directive #14**'s pinned-approval path.",
       "content_survives_at": [
        "PD #14 :284 - 'Behind it: the queue guard refuses an unpinned governed diff' (the retired mechanism, verbatim)",
        "PD #14 :268-:274 - the pinned-approval path: who may approve, that it is spent once, that the owning seat lands",
        "PD #14 :257-:258 - the governed-surface enumeration listing `.claude/**` and `skills/**`, i.e. both roots"
       ],
       "not_a_rewrap": "the line is bought by DELETING ~109 chars of content; the surviving 109-char sentence is shorter than either of the 116/96-char lines it replaces",
       "widest_row_pin": "768 bytes (pin 768) before and after - no table row touched"
      },
      "ratchet": {
       "before": "AGENTS.md 1099 lines (ceiling 1099, headroom 0), widest table row 768 bytes (pin 768), exit 0",
       "after": "AGENTS.md 1099 lines (ceiling 1099, headroom 0), widest table row 768 bytes (pin 768), exit 0",
       "git diff --stat": "1 file changed, 3 insertions(+), 3 deletions(-) - net zero"
      },
      "victim_search": {
       "writes": "ZERO state writes - no card touched, no label, no branch deleted",
       "read_at": "2026-09-17T22:55Z-22:56Z",
       "caveat": "every row may have left this state since",
       "method": "290 heads -> 281 distinct card numbers (0 unparseable); the 256 with no PR in the 1200-window re-checked per branch against the UNBOUNDED pulls?state=all&head= endpoint so the window is not a source of false headless; intersected with the 518 open non-PR issues; each survivor's full comment list tested against CLAIM_COMMENT_MARKER (scripts/pm/check-half-states.mjs :1138)",
       "population": "27 open cards carry a confirmed same-number headless head",
       "result_rows": 9,
       "rows": [
        "#8006  pm:on-hold domain:engine | claude/issue-8006-put-roundtrip-census | ahead_by 0 | no claim in any spelling",
        "#9613  pm:on-hold domain:engine | claude/issue-9613-publish-gate-remeasure | ahead_by 0 | no claim in any spelling",
        "#11633 tracking domain:services pm:blocking | claude/issue-11633-cross-request-cache-design | ahead_by 0 | claim exists as a '## Claim + dispatch' HEADING (marker cannot see it)",
        "#11663 p0 security tracking domain:services pm:epic | claude/issue-11663-platform-admin-reanchor-design | ahead_by 0 | claim exists as a '## Claim + dispatch' HEADING",
        "#12799 tooling domain:devx pm:on-hold | claude/issue-12799-surplus-threshold | ahead_by 0 | no claim in any spelling",
        "#14512 pm:queue domain:spec p3 | claude/issue-14512-multi-package-artifact-single-copy | ahead_by 0 | claim exists as PROSE ('Claiming the producer half')",
        "#15638 bug pm:queue domain:cli p3 | claude/issue-15638-ui-plugin-legacy-arm | ahead_by 0 | claim exists as '## Claim' heading + 'Claimed by the os-dev seat'",
        "#16184 bug p2 pm:blocked domain:engine | claude/issue-16184-schema-drift-media-column-ruled-end-state | ahead_by 0 | no claim (only a triage seat's 不认领 disclaimer)",
        "#17676 bug p2 pm:blocked domain:engine | claude/issue-17676-writable-package-durability | ahead_by 0 | no claim in any spelling"
       ],
       "readings": [
        "ALL NINE stray heads are ahead_by 0 - zero-commit probe branches. By the fact layer's own two-read criterion (platform-readings.md :377) not one is in-flight work, so on all nine a pre-check hit today is false in the silent direction.",
        "Five are unclaimed in EVERY spelling: #8006 #9613 #12799 #16184 #17676. The other four carry a claim the machine predicate cannot see - filed as an out-of-scope finding below.",
        "NOT proof of harm: seven of the nine are parked for reasons of their own (pm:on-hold / pm:blocked / pm:blocking / pm:epic / tracking). Only #14512 and #15638 carry pm:queue, and both of those carry a non-marker claim. Honest verdict: the instrument is wrong by default on ~88% of hits and nine open cards sit where that default fires; no card is demonstrably a victim BECAUSE of its stray head."
       ]
      }
     },
     "tests": "No package code touched, so no build/test; the verify lock was never taken (nothing heavy ran). Gates derived in-worktree with no hand-fed path list: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (change set: 1 path, AGENTS.md) -> 14 commands, every exit code captured redirect-then-$?, never across a pipe. ALL 14 exit 0: check-closing-keyword-parity(+--self-test), check-comment-mask-corpus, check:agent-test-spelling, check:docs-audit-scope, check:driver-memory-census, check:nul-bytes, check:pm-governed-merges, check:pm-governed-prose, check:pm-skill-id-lint, check:pm-skill-ratchet, check:refd-timer-probe, check:required-contexts, check:watch-hint-literal. Reconciliation `--ran` exit 0: '14 derived famil(ies) accounted for — 14 run, 0 NOT-MEASURED (a DERIVED zero — all 14 recorded an exit code and none of them is 3)'. Dispatch-named extras outside the union, all exit 0: check-skill-line-ratchet.mjs, check:skill-frame-sync, check:doc-authoring. Repo-wide `pnpm lint` (eslint . --no-inline-config) exit 0 over the FULL population - 6843 files, 0 errors, 0 warnings, count read from eslint's own --format json; of those 6843 ZERO are .md and eslint.config.mjs names neither '.md' nor 'markdown', so this diff's single file is provably outside eslint's configured surface (this is a full run, not a narrowing). Control-byte self-scan on AGENTS.md: no match (exit 1). skip-changeset measured not assumed: 0 package manifests list AGENTS.md in files[].",
     "mcp_calls": "0 — no MCP GitHub tool used, read or write; every GitHub read and write went through the REST proxy with curl and GITHUB_TOKEN",
     "api_writes": "3 REST writes: POST /repos/objectstack-ai/objectstack/pulls (draft PR #18827); POST /repos/objectstack-ai/objectstack/issues/18827/labels (skip-changeset, additive endpoint, compare-style read-back confirms it held); POST /repos/objectstack-ai/objectstack/issues/18811/comments (this report). Plus 2 git pushes (the empty-branch write probe, then the commit). No PATCH of the PR body. PR body read back byte-for-byte after creation: identical except the platform's own appended session-URL footer block, which is the documented create-surface behaviour.",
     "open_questions": [
      {
       "question": "The dispatch asked the clause to carry the measured ratio DATED and to point at the fact-layer row (platform-readings.md :378). I did neither, and declared both deviations in the PR body. AGENTS.md's own preamble governs this file: 'A rule states what to do and what never to do, in one executable sentence; it carries no incident narrative, no ruling date or quotation, and no issue-number citation'. A dated census is that narrative, and the file already points at references/platform-readings.md twice (:431, :450) for exactly 'the readings'; a third pointer measured 2 added lines instead of 1 and wrapped the code span across a line break, so it would have cost a SECOND retired line. Does the maintainer want the dated ratio and the explicit row pointer anyway?",
       "options": [
        "A - keep as landed: qualitative ratio ('most heads carry no PR'), no third pointer; the dated census lives in the PR body and the fact layer. Cost: 1 retired line. Matches the file's declared authoring standard and does not rot.",
        "B - add the dated ratio and the :378 pointer to the clause. Cost: a second retired line, a clause that rots as the census moves (it moved twice today), and a documented conflict with this file's own preamble.",
        "C - keep the clause as landed and add the dated census to platform-readings.md instead (a separate serial; PR #18808 is already landing that row)."
       ],
       "recommendation": "A as landed, with C as the natural follow-on if the numbers are wanted in writing. 项目长远合理性: the rules layer states the rule once and the fact layer carries the readings - that division is already this repo's declared shape, and B duplicates a moving number into the one file that must not rot. 防 AI 写错: a clause naming the wrong ACTION ('never skip a card on one') binds regardless of what the ratio drifts to, whereas a dated 88% invites a reader to re-judge it. 创业阶段不扩散: B costs a second retirement from a file at zero headroom to buy a pointer the file carries twice already."
      }
     ],
     "out_of_scope_findings": [
      "to file (3 classes, dedupe words): the documented pre-check command MATCHES THE WRONG CARD - `git ls-remote --heads origin | grep issue-N` has no right delimiter, so the number is a PREFIX match. Measured on origin at 2026-09-17T22:5xZ: `grep issue-186` (card 186) returns 5 heads - issue-18611, issue-18643, issue-18651, issue-18652, issue-18662 - none of them card 186, exit 0; `grep issue-1811` (card 1811) returns claude/issue-18116-turso-begintransaction-radius, not card 1811, exit 0. Class (a): copy the documented example and it misfires, silently and in the same direction as this card (a confident hit about a card you did not ask about). This card's clause mitigates the harm (never skip on a hit) but does not fix the instrument; the fix is a delimiter or an anchored refspec, which is the pre-check itself and therefore outside this serial's scope. Dedupe words: `ls-remote grep prefix match` · `issue-N substring false positive` · `pre-check matches wrong card` · `grep delimiter branch name` · `AGENTS.md pre-check over-match`.",
      "to file (3 classes, dedupe words): the `Claim:` record has drifted off its own declared contract. AGENTS.md :394-:395 declares 'the identity record is the `Claim:` comment — first line beginning `Claim:`', and CLAIM_COMMENT_MARKER at scripts/pm/check-half-states.mjs :1138 (/^\\s*>?\\s*Claim(?:ed)?\\s*:/mi) implements exactly that. Measured while running this card's victim search: FOUR open cards carry a real claim in a spelling the marker cannot see - #15638 (a `## Claim` heading plus 'Claimed by the os-dev seat', comment 5555005915), #14512 ('Claiming the producer half', comment 5523309738), #11633 and #11663 (a `## Claim + dispatch` heading, comments 5394770585 / 5394306066). Every marker-reading tool - check-clause2-carriers' governing-claim pool, check-half-states - therefore reads those cards as UNCLAIMED. Class (b): violates a declared contract, contract quoted. Adjacent to but distinct from #18764 (that one is the marker vs a DECORATED body; this one is the seats writing a spelling the contract does not permit). Dedupe words: `Claim heading not marker` · `CLAIM_COMMENT_MARKER misses claim` · `claim spelling drift` · `## Claim vs Claim:` · `governing claim pool spelling`.",
      "noted, not filed: the stray-head population is a MOVING reading, not a standing one - it fell by 2 (both headless) between the seat's 21:45Z census and my 22:52Z re-take, so a deletion hand is already active on origin. Not filed: it is an observation about a number, not a defect, and it strengthens rather than contradicts the card. 承接者: PR #18808, whose body names the delete commands and whose author/lander owns that half."
     ]
    }

    Generated by Claude Code

  3. os-justin commented on Sep 17, 2026

    @os-justin
    CollaboratorAuthor

    ACCEPT — in-seat contract-tier review of PR #18827 (head f3eabb29e, report 5722465975) by the skills seat, 2026-09-17T23:35Z. Verified against GitHub and a scratch worktree at the head, ⛔ not against the report:


    Generated by Claude Code

  4. os-justin commented on Sep 18, 2026

    @os-justin
    CollaboratorAuthor

    LANDED — PR #18827 (#18811 p1, governed AGENTS.md :463–:464 gains one clause — a pre-check hit is a HINT, the Claim: comment decides — paid by compressing :799–:800 into one line whose mechanism survives at PD #14 :284; 1099 / 1099, widest row 768; the dev's two declared deviations ruled A by the seat; victim search: 9 open cards under zero-commit stray heads, none a demonstrable victim) merged through the queue at 2026-09-18T02:19:31Z (merged_at), squash f7e523136aa929fb077f4427200e5b622967e76b (single parent a09d79708bc472967bee5c22fbb6eb53188b1e14, an ancestor of origin/main). Governed surface (AGENTS.md): the seat's ACCEPT 5722675710 here, ## 维护者速读(终稿) 5722675931 on the PR, needs-user-decision + reviewers at 2026-09-17T23:35Z; os-zhuang APPROVED at 2026-09-18T01:16:06Z (review 5243133622 on the ACCEPT head f3eabb29ed), marked ready and enqueued by hand at 2026-09-18T01:17:34Z; the seat stripped needs-user-decision at 2026-09-18T01:18:13Z per ruling C (--pair 18827 0, CI 35 / 16 skipped rostered, harness CURRENT at 88aa326deb). The card auto-closed completed at 2026-09-18T02:19:32Z 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. Carried: #18830 (the pre-check's missing right delimiter) and #18831 (p1, claims in unreadable spellings) are the next cards on this rule, queued.


    Generated by Claude Code

  5. added a commit that references this issue on Sep 28, 2026
    f7e5231
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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions