Repository navigation
Commit 9364e1b
feat(pm): name the two measured claim near-miss forms so the sweep sounds on the unreadable claims (#18911)
Part of #18831
Clause-②: no
This is the INSTRUMENT half of #18831: the measured spellings are NAMED
as near-miss forms, so the census SOUNDS on the four rows instead of
reading absence. The WRITER half — a compliant `Claim:` (or a
`Release:`) on each of those four cards — is the holders', and was
requested on #18886 (cli, for #15638) · #18887 (spec, for #14512) ·
#18888 (services, for #11633 and #11663). #18831 closes only when those
four rows are discharged, so this PR says `Part of` and carries no
closing keyword: #18831 remains open after this lands.
## The reader is untouched, on purpose
The binding constraint is the triage grading (5722974011), kept in its
own words:
> 派工时的边界要写死:修的是那四条评论(请原作者或按协议补一条合规的 `Claim:`),⛔ 不是放宽读者 —— 放宽读者会同时改变
#18829 正在等裁的那条定义,把一个待裁的问题用一次实现悄悄裁掉。
So `CLAIM_COMMENT_MARKER`, `RELEASE_COMMENT_MARKER` and `markerMatches`
are byte-identical in this diff — the identity record's spelling stays
exactly what `AGENTS.md` :394–:395 names, and #18829's undecorator
question is decided by nothing here. What grew is only
`OWNERSHIP_MARKER_NEAR_MISS_FORMS`, whose whole job is to make a refusal
audible, and which is report-only and never a half-state verdict by
itself. No ownership row (H2 / H34 / H47 / H66 / H67) changes its
verdict on any card.
## The premise, re-read live rather than taken from the card
All four rows read through the REST proxy at 2026-09-18T04:26Z, each
thread in full:
| card | state | the record, as written | comment | near misses BEFORE |
AFTER |
|---|---|---|---|---|---|
| #15638 | open, `pm:queue` `domain:cli` p3, assignee `os-litant` | `##
Claim` heading, then `Claimed by the os-dev seat. Session …` |
5555005915 | 0 | 1 (`bare-word`, prefix `Claimed`) |
| #14512 | open, `pm:queue` `domain:spec` p3, no assignee | `Claiming
the producer half (…)` | 5523309738 | 0 | 1 (`bare-word`, prefix
`Claiming`) |
| #11633 | open, `tracking` `pm:blocking` `domain:services` | `## Claim
+ dispatch — design only…` | 5394770585 | 0 | 1 (`heading-bare`, prefix
`## Claim`) |
| #11663 | open, p0 `security` `tracking` `pm:epic` `domain:services` |
`## Claim + dispatch — design only…` | 5394306066 | 0 | 1
(`heading-bare`, prefix `## Claim`) |
None of the four carries a readable `Claim:` or `Release:` anywhere in
its thread — checked by running `markerMatches` over every comment row
of each, not by eye. The card's premise holds.
One honest boundary: #15638's `## Claim` heading carries nothing after
the word, and the census deliberately skips a form whose remainder is
empty (「a directive with NO record after it is silent — a census, not a
heading count」). That card is named through its prose line instead, and
the two behaviours are pinned together rather than traded against each
other.
## The two forms, chosen from a measurement and not from symmetry
Measured over the whole open board — objectstack's 514 OPEN cards, the
459 of them carrying a comment, 131,587 comment lines, read through the
REST proxy 2026-09-18T04:26Z–04:31Z at `0b31d90fb`:
- **`heading-bare`** — a markdown heading whose word carries NO
canonical colon (a `+`, a dash, or nothing): **10 lines on 10 cards**,
every one a real ownership record. Symmetric across both directives and
carrying the inflected spellings, because the heading prefix is already
the strong signal its `heading` sibling reads. The only prose casualty
the measurement turned up was `### release-aftercare.md` — a FILE NAME —
and requiring whitespace-or-end after the word excludes it by
construction (pinned as a control).
- **`bare-word`** — the PARTICIPLE at line start with no separator at
all: **13 lines on 13 cards**, every one claim-shaped. Claim side only,
and deliberately not the bare imperative. Both omissions carry their
counterfactual in the docblock:
- the bare imperative would have added **5 lines on 5 cards** (all real
records today) and would also read the protocol's own sentence 「Claim
the issue BEFORE you write any code」 — which seats quote — as a near
miss. A participle cannot open an imperative; that is the whole
discriminator, which is why the omission is the WORD and not a lookahead
full of English determiners.
- the release participles would have added **19 lines on 12 cards**, of
which **7 are ordinary release-board prose** (`Release timing, …`,
`Release checklist, …`, `Release board: …`, `Release condition:`,
`Release confirmed …`): that noun opens sentences in this repo, the
claim participles do not.
A heading carrying an inflected word AND the canonical colon (`##
Released:`) is named by no form: measured ZERO occurrences over the
corpus, so it is left unnamed with its reading written down rather than
guessed at.
## Board census — with the unit, and the counterfactual
Same corpus, run through the sweep's own predicate
(`ownershipMarkerNearMisses`) over a REST-listed open-card set, because
`check-half-states.mjs` reads the whole board and exceeds this
container's foreground cap:
| reading | before this diff | after |
|---|---|---|
| near-miss LINES | 14 | **37** |
| near-miss CARDS | 10 of 459 threads | **32 of 459 threads** |
| …of those cards, carrying NO readable `Claim:`/`Release:` anywhere in
the thread | 2 | **16** |
| the four cards #18831 names | 0 | **4** |
By form, after: `bare-word` 13 · `heading-bare` 10 · `separator` 5 ·
`list-item` 5 · `heading` 4. What would have made the number different:
the two omissions above (+5 lines for the bare imperative, +19 for the
release participles, 7 of the latter prose); and the empty-remainder
rule, which holds back #15638's `## Claim` line and every bare `##
Release:` heading. The 14 cards that moved from silent to audible with
an unreadable ownership record are the census's own answer to
「四张活卡的身份记录此刻不可读」 — there were never four.
## Verification
- `node scripts/pm/check-half-states.mjs --self-test` — **exit 0, 4963
cases pass** (4921 before), battery `H2/H47/H66 decorated ownership
marker` **140/136** (98/94 before; the floor rose with the battery, per
the roster's own rule). `pnpm check:pm-half-states` is that same
self-test: exit 0.
- **Ablation** — the two added members deleted from the roster on a
committed tree, the deletion proven on disk (`grep -c` 1 → 0 for each;
blob `5c5a24a7` → `b35ec2ed`), then the self-test re-run: **exit 1, 18
of 4955 cases failed** — the roster id pin plus all four measured rows
and the "every one of the four is named" pin. Restored with `git
checkout HEAD --`, proven byte-identical (blob back to `5c5a24a7`, `git
diff HEAD` empty, `git status --porcelain` empty). Expected direction
was "turns red"; that is what it did.
- **Gates**, derived from this worktree with `node
scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` (no hand-fed paths; change set = 1 committed
path, merge base `600b1e2ab`): **38 commands, 37 exit 0**. The 38th,
`pnpm check:pm-dispatch-gates`, spawns every gate script's own self-test
and exceeds this container's ~10-minute foreground cap in both legs —
**NOT MEASURED** (`exit 124` from `timeout`, 0 `✗` in 1818 lines of
output), left to CI rather than reported as a pass or a red. Reconciled
with `--ran`.
- `origin/main` was merged in (`600b1e2ab`) before the gate run; the
merge touched no file this diff touches.
## Acceptance notes
- `skip-changeset`: `scripts/pm/**` is published by nothing — no
package's `files[]` ships it, and the diff is one PM instrument plus its
self-test. Hence `Clause-②: no`.
- Not touched, deliberately: objectui's byte-pinned copy of
`check-half-states.mjs` (re-synced only through objectui#9395); the
writer-side text on the four cards; the three request cards.
- Noted, not filed: the release-side bare word is a precision question,
not a defect — its counts and its prose class are recorded in the
roster's own docblock, which is where the next editor of the roster
reads them, and the roster is the only surface that could carry the
change.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent cc8a94c commit 9364e1b
1 file changed
Lines changed: 111 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1305 | 1305 | | |
1306 | 1306 | | |
1307 | 1307 | | |
| 1308 | + | |
| 1309 | + | |
| 1310 | + | |
| 1311 | + | |
| 1312 | + | |
| 1313 | + | |
| 1314 | + | |
| 1315 | + | |
| 1316 | + | |
| 1317 | + | |
| 1318 | + | |
| 1319 | + | |
| 1320 | + | |
| 1321 | + | |
| 1322 | + | |
| 1323 | + | |
| 1324 | + | |
| 1325 | + | |
| 1326 | + | |
| 1327 | + | |
| 1328 | + | |
| 1329 | + | |
| 1330 | + | |
| 1331 | + | |
| 1332 | + | |
| 1333 | + | |
| 1334 | + | |
| 1335 | + | |
| 1336 | + | |
| 1337 | + | |
| 1338 | + | |
| 1339 | + | |
| 1340 | + | |
| 1341 | + | |
| 1342 | + | |
| 1343 | + | |
| 1344 | + | |
| 1345 | + | |
| 1346 | + | |
| 1347 | + | |
| 1348 | + | |
| 1349 | + | |
| 1350 | + | |
| 1351 | + | |
1308 | 1352 | | |
1309 | | - | |
| 1353 | + | |
| 1354 | + | |
| 1355 | + | |
| 1356 | + | |
1310 | 1357 | | |
1311 | 1358 | | |
1312 | 1359 | | |
| |||
1343 | 1390 | | |
1344 | 1391 | | |
1345 | 1392 | | |
| 1393 | + | |
| 1394 | + | |
| 1395 | + | |
| 1396 | + | |
| 1397 | + | |
| 1398 | + | |
| 1399 | + | |
| 1400 | + | |
| 1401 | + | |
| 1402 | + | |
| 1403 | + | |
| 1404 | + | |
1346 | 1405 | | |
1347 | 1406 | | |
1348 | 1407 | | |
| |||
24302 | 24361 | | |
24303 | 24362 | | |
24304 | 24363 | | |
24305 | | - | |
| 24364 | + | |
24306 | 24365 | | |
24307 | 24366 | | |
24308 | 24367 | | |
| |||
35042 | 35101 | | |
35043 | 35102 | | |
35044 | 35103 | | |
35045 | | - | |
| 35104 | + | |
35046 | 35105 | | |
35047 | 35106 | | |
35048 | 35107 | | |
| |||
35057 | 35116 | | |
35058 | 35117 | | |
35059 | 35118 | | |
| 35119 | + | |
| 35120 | + | |
| 35121 | + | |
| 35122 | + | |
| 35123 | + | |
| 35124 | + | |
| 35125 | + | |
| 35126 | + | |
| 35127 | + | |
| 35128 | + | |
| 35129 | + | |
| 35130 | + | |
| 35131 | + | |
| 35132 | + | |
| 35133 | + | |
| 35134 | + | |
| 35135 | + | |
| 35136 | + | |
| 35137 | + | |
| 35138 | + | |
| 35139 | + | |
| 35140 | + | |
| 35141 | + | |
| 35142 | + | |
| 35143 | + | |
| 35144 | + | |
| 35145 | + | |
| 35146 | + | |
| 35147 | + | |
| 35148 | + | |
| 35149 | + | |
| 35150 | + | |
| 35151 | + | |
| 35152 | + | |
| 35153 | + | |
| 35154 | + | |
| 35155 | + | |
| 35156 | + | |
| 35157 | + | |
| 35158 | + | |
| 35159 | + | |
| 35160 | + | |
| 35161 | + | |
| 35162 | + | |
| 35163 | + | |
| 35164 | + | |
| 35165 | + | |
| 35166 | + | |
| 35167 | + | |
35060 | 35168 | | |
35061 | 35169 | | |
35062 | 35170 | | |
| |||
0 commit comments