fix(pm): the near-miss ownership census excludes seat posts and release announcements - #19041
Conversation
…se announcements The census (`ownershipMarkerNearMisses` over `OWNERSHIP_MARKER_NEAR_MISS_FORMS`) listed five of #18914's sixteen rows as "no readable ownership record" where no record is owed: four `pm:seat` posts, whose ownership is their BODY plus their audit comments and whose comments carry shift narration, and one blocker-release heading on a card nobody ever claimed. Two exclusions, both COUNTED rather than dropped: - `ownershipCensusSpeaksAbout` takes a `pm:seat` thread out of the POPULATION, reading the label off the page the sweep already holds (no extra request). The summary states the thread count and the line count, so the pre-filter census stays reconstructible. - `releaseAnnouncementHeading` takes a release ANNOUNCEMENT heading out of the near-miss CHANNEL: a heading whose word is the participle `Released`, whose remainder names the `PR #n` that landed or the `pm:*` -> `pm:*` transition it unblocked, and which names no session. Three narrowings, each measured against the corpus line that forced it: heading forms only, participle only, no session token in either spelling. Measured over objectstack's open board (539 open cards, 484 threads, tree 7843663): 36 near-miss lines on 30 cards before, 26 on 24 after; 9 lines on 5 `pm:seat` threads leave the population and 1 release announcement leaves the channel. All ten of the other eleven rows that are still open survive byte-identically. The vocabulary is untouched and so is the reader: no form added, no change to what a readable `Claim:` / `Release:` is. Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
|
Landing record — every pre-check met, blocked at the channel (skills seat, Every check on Generated by Claude Code |
|
Review of record carried to the merged head (skills seat, PR #18980 — the parallel draft on Generated by Claude Code |
|
Landing record — landed on the seat's record through the CCR route (skills seat, Pre-checks on the merged head Acts, typed in the allow rules' literal-prefix shape (PR #19047's rules on disk; auto mode): Generated by Claude Code |
Fixes #18926
Clause-②: no
The near-miss ownership census (
ownershipMarkerNearMissesoverOWNERSHIP_MARKER_NEAR_MISS_FORMS, landed by PR #18911 / #18831) lists cards with anear-miss ownership line and no readable
Claim:/Release:. Five of #18914's sixteenrows have no ownership record to normalise: four
pm:seatposts (#6017 · #6021 · #6026 ·#6367), whose ownership is their BODY plus their audit comments and whose comments carry
shift narration, and #17536's
## Released — PR #17517 merged. pm:blocked -> pm:queue, ablocker release naming a PR on a card that was never claimed.
Two exclusions, both COUNTED rather than dropped, and they are deliberately different
KINDS: a seat post leaves the POPULATION (no record is owed on the thread), a release
announcement leaves the near-miss CHANNEL (the line is not a refused record).
ownershipCensusSpeaksAbout(issue)— apm:seatthread is out of the population,read off the label page the sweep already holds, so the census keeps its "buys NOTHING"
contract. Gated at the call site like every other population predicate in this file
(
h47SpeaksAbout,h58SpeaksAbout,h67SpeaksAbout), which is also what makes itusable by the direct full-board caller that produced [finding] the unreadable-ownership-record population is 16 open cards, not the 4 that #18831 names — 12 further OPEN cards carry a
Claimed/Claiming/## Claim/## Released/**Claim —line that no marker tool reads and noClaim:/Release:line anywhere in the thread (board census 2026-09-18T04:31Z, 459 threads at0b31d90fb) #18914's rows.releaseAnnouncementHeading(formId, prefix, line)— a heading whose word is thePARTICIPLE
Released, whose remainder names thePR #nthat landed or thepm:*->pm:*transition it unblocked, and which names NO session. The line keepsits card, comment id and prefix and moves to a second channel, so the two arrays
partition exactly what the single array used to carry.
ownershipMarkerNearMissCensusreturns{ misses, announcements };ownershipMarkerNearMissesstays the near-miss half and the name every caller andevery fixture already uses.
The vocabulary is untouched (no form added, no form removed) and so is the reader: no
change to what a readable
Claim:/Release:is. H8 / H46 territory is not entered.The three narrowings, each measured against the corpus line that forced it
Every one of these leaves the line IN the census — the safe direction for a filter whose
failure mode is silence.
Release-landed: … (PR #18852)separator, not a heading — stays listed### Release: PR #18523 …sessionor the Chinese spelling)## Released tail — in flight under THIS session's process treeThe census over the live board — BEFORE / AFTER
Two readings, both read-only through the session proxy, both with the
--use-env-proxyre-exec the file performs itself.
(1) The instrument's own clause, one full sweep each. BEFORE at the base
(
784366372), AFTER at this branch's head:0/0on the livesweep, and that is not the filter failing. The census reads only threads
commentCachealready holds, and apm:seatpost's page enters that cache in the H44pass BELOW the census loop (
commentCache.setat the seat-comments leg;seatPostRowsForitself writes onlyseatPageCache). So on the sweep as currentlyordered a seat thread is UNJUDGED by the census, never listed — which is why the clause
renders both numbers unconditionally instead of staying silent: a run with nothing
excluded and a run where the exclusion stopped being applied must not print alike. The
ordering itself is left exactly as it is; moving the census would widen what it reads,
which this card does not ask for.
(2) The full-board corpus — the population #18914's sixteen rows were actually
measured over, and the reading where the population filter bites. Read 2026-09-18
13:0xZ, tree
784366372: 539 open cards, 484 of them carrying a comment, the census runover every thread:
The five rows the card names are gone, each with its printed reason. Of #18914's other
eleven, the ten that are still open are listed byte-identically — #11633 · #11663 ·
#14512 · #15638 · #6736 · #9659 · #9707 · #11286 · #11453 · #11925. The eleventh,
#18755, is CLOSED (
pm:done) and so is absent from an open-board read altogether, notdropped by anything here.
pm:seatpost the filing card's table does not name, carrying fournarration lines. It is out of the population on the same grounds as the four, and the
count above says so rather than folding it into the named five.
Self-test — floors rise, and the controls are inside the floored battery
+53 cases, all in the floored battery, pin raised 136 -> 184 (the file's "just under the
count" convention, ~95%). What they floor is a NARROWING — the one direction in which a
suite can go green by asserting less — so the firing controls live inside the same
battery: the five measured rows as fixtures (each line pasted from the REST read of its
own comment), the three narrowings above each pinned through its corpus line, the
positive control that #14512's
Claimingline is still listed on the near-miss channeland its card still in the population, and the ablation pin that the excluded line IS a
near miss under the vocabulary alone (so the exclusion pin is capable of failing).
One landed case was RE-POINTED, not deleted:
#18831: the release side of the HEADING form is named toocarried #17536's line as its fixture, which is the very line this cardmoves to the announcement channel. Its claim is untouched and still floored; its fixture
is now #16712 comment 5605768467 (
## Release + seat ruling — …, a live release headingthat names no PR and no transition), and a sibling case pins where the old fixture went.
Verification
pnpm check:pm-half-states— exit 0,✓ check-half-states self-test: 5031 cases pass.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(1 path vs merge base
784366372): 39 commands, 38 run in the foreground, allexit 0, reconciled with--ran.pnpm check:pm-dispatch-gatesexceeds theforeground cap and was detached.
origin/maindbd474431(
.github/workflows/pr-automation.yml). Read: that change is prose inside theCheck Changesetjob ([finding] theskip-changesetlabel suppresses the DELIBERATE-CORRECTION refusal whose own text says 「no label and no diff shape makes that safe」 — declared contract against enforced behaviour #18375's route-0 discriminator) and declares no family, so nocommand is missing from the list above.
scripts/pm/**publishes nothing from any released package. Route 0 ofthat same discriminator does not apply — this PR edits no existing changeset.
Reader test — one line, from the worktree root, prints
0 1 false: the excluded lineis no longer a near miss, it IS counted on the announcement channel, and a
pm:seatthread is out of the population.
node -e 'const L="## Released — **PR #17517 merged.** `pm:blocked` → `pm:queue`";import("./scripts/pm/check-half-states.mjs").then(m=>console.log(m.ownershipMarkerNearMisses([{id:1,body:L}]).length,m.ownershipMarkerNearMissCensus([{id:1,body:L}]).announcements.length,m.ownershipCensusSpeaksAbout({labels:[{name:"pm:seat"}]})))'Acceptance notes
Noted, not filed — observations, no card:
separatorform readsRelease-landed:([finding] the 17.0.0 CHANGELOG entries inpackages/restandpackages/spectell deployments to "raisebatch.maxBatchSize(up to 1000)" — the falsified cap claim in its strongest form, published to npm, on the release-owned tree #18740 ×3, A consuming repo cannot ask "was this dist built from the tree I pin?" — the content stamp already exists, covers only the AMPLIFIERS list, and is not readable across the repo boundary #16529 comment 5720102045) asa near miss. Those are report-line labels, not ownership records, and they are the
largest remaining class of the same kind this card narrows. Deliberately left listed:
the ruling scopes this card to the seat population and the release HEADING, and
⛔ no widening or further narrowing of the vocabulary. Whoever next touches
OWNERSHIP_MARKER_NEAR_MISS_FORMSis the successor; today there is none.pm:seatpage intocommentCache, sothe census never judges a seat thread on a live sweep. Stated in the sweep reading
above and in the code comment; not filed, because changing the ordering would widen
the census's judged population, which is a decision and not a defect.
falsified by the paste: on three of the five ([PM seat] domain:spec — 🟢 REOPENED by the maintainer (fix them all, THEN merge, THEN off) · 5 landed (+#18942 cleared main's OSV red) · #18889 at-tier PASS + enqueued · #18688 and #18638 UNPARKED — both rulings had already landed #6017 · [PM seat] domain:services — 🟢 held by session_01AhQASwqJr2Z7XfGWUdvnbF · R1 CLOSED: 4 dispatched / 4 delivered / 4 LANDED (564ac2f17, 351a16130, 877dc0398, d7f7e3426) · in-flight 0 · queue 7 · decision box 1 (#18584 A/B) · filed #19198 · retriage 0 · wake trig_019o7amaLUo2cYgz5NWEKBqK #6021 · [PM seat] domain:engine — ⚪ VACANT · last seat session_01CqmCgU5RGDoJYhHUMVp2af, stood down 2026-09-17T22:01Z #6367) the census names a
later narration line and the heading the card's table quotes carries no near miss at
all. The fixtures are the lines the census NAMES; the discrepancy is pinned as a case
rather than left as a silence.
Serial:
scripts/pm/check-half-states.mjs. PR #18980 (#18939) is a parallel draft onthis file with old-line hunks :19613–:19659 and :35268 — the proxy-rearm plan and its
guard — disjoint from the census hunks here (:1362–:1440 and the BATTERY68 battery).
Nothing there is touched. Whichever lands second merges
origin/mainfirst.Not governed (
scripts/pm/**): draft, for thedomain:skillsseat's contract-tierreview.
Generated by Claude Code