Skip to content

pm-dispatch: six measured platform readings, and the search_issues qualifier rows rewritten onto what is measured - #18279

Merged
claude[bot] merged 3 commits into
mainfrom
claude/issue-18195-platform-readings-fold
Sep 15, 2026
Merged

claude[bot] merged 3 commits into
mainfrom
claude/issue-18195-platform-readings-fold

Conversation

@claude

@claude claude Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Fixes #18195
Fixes #18158
Fixes #16762
Fixes #18219
Fixes #18147
Fixes #18258
Fixes #18262

skip-changeset: nothing published moves. The diff is one governed reference file and one scripts/pm/ gate script, both on the fast-track list, and neither is inside any package's files[].

What lands

Six rows added to .claude/skills/pm-dispatch/references/platform-readings.md, one per deduplicated reading, plus three search_issues rows rewritten in place onto what is measured. The ceiling moves 459 to 465 in scripts/pm/check-skill-line-ratchet.mjs, recorded as the SIXTEENTH ruledRaises record under the standing one-file exception, quoted verbatim and dated, with the positive delta 6 accounted for line by line beside the ceiling.

A rewrite is not a raise: the three rewritten rows are line-neutral and buy nothing. So is the reading-trap list's own count word, which moves from five to six for the trap appended to it.

Rows added (measured on head 6715b3d1)

card line bytes what it records
18158 130 116 the write-identity probe is the read-back of the session's own write, and inside it user.type with user.login ALONE: performed_via_github_app names the same App under both token classes, and GET /user answers the bound account under both
18147 164 118 a suspension erases the account's EVENTS as well as its content: the label stays on the card while the labeled event that wrote it is gone
18219 248 114 the card comment COUNT over-reads (1 against a comment list and a timeline that both read 0), so the thread-empty question goes to those two channels
18195 288 117 reading trap six: a phrase that exists only after joining reads zero for the SUBJECT and the CONTROL alike under a single-line grep
18262 298 118 both repositories key the CI concurrency group on the pull-request number, so re-running a SUPERSEDED head cancels the CURRENT head's run: a re-run is a write
18258 338 120 the exclamation-mark-before-left-bracket loss also fires on the COMMENT write path, where the stored regex is already invalid and a reader who runs it gets a zero

Every row is at or under the 120-byte cap, Chinese, in the file's own register voice, and each is traceable to its card's reading with an instant and a carrier.

Rows rewritten (card 16762, line-neutral, lines 189 to 191)

Before, the stated BASIS of the prohibition was that a qualifier-shaped query answers zero. Three sessions plus this one measured the opposite. After the rewrite, the three lines say what is measured: search_issues describes itself as a semantic matcher and only the QUALIFIER form contradicts that self-description; a qualifier spelled into query is not refused and does filter, matching the deterministic REST list endpoint number for number; and the sentence form has been measured in BOTH directions and is dated for each - a confident zero against a population that exists on 2026-09-09, and a hit with the target first on 2026-09-15 - so it is a lead and never a zero-proof for dedupe.

The prescription that scope goes through the owner and repo parameters is NOT kept, because no reading supports it: the rewritten row says the range parameters may be omitted, which is what was measured.

Measurements taken for this PR

Card 16762, the REST control. GET /repos/objectstack-ai/objectstack/issues?labels=pm:queue&state=open&per_page=100, paged: 100 plus 100 plus 8 rows, page four empty, 208 open issues, zero of them pull requests, zero of them missing the label. The seat's MCP qualifier query (repo:objectstack-ai/objectstack is:issue is:open label:pm:queue, no owner or repo parameters) read total_count: 208, incomplete_results: false, with the first five numbers 18239 / 18218 / 18200 / 18199 / 18179 - identical to the REST page-one head, in order. Two channels, one population. The qualifiers ARE honoured as filters.

Card 18219, re-measured through REST before writing. One of the two disagreeing cards still disagrees and one has healed:

card issues/{n} count field comments list timeline commented
17645 1 0 0 reproduces
17976 3 3 3 healed, it had three writes land since
17512 5 5 5 control
16287 2 2 2 control
16529 1 1 1 control
15723 8 8 8 control

Four controls consistent in the same round on the same token, so the disagreement is not a dead instrument. The healing is ONE observation and is deliberately not written to the register; the card already carries the same shape for another specimen.

Card 18147, re-read through REST. Card 17963 still carries the label the suspended account wrote. Its /issues/17963/events returns ten rows whose labeled entries name finding, pm:queue, priority:p3 and pm:dispatched - and NOT the label the suspended account wrote, which has no labeled event at all. Actor tally over the same response: claude[bot] 7, os-project-manager 2, os-bill 1, the suspended account 0. /issues/17963/timeline agrees: four labeled rows, same four labels. The lit controls sit inside the same response, so the absence is a reading and not a dead endpoint.

Card 18158, live probe. GET /user answered a human login of type User; the read-back of a comment this seat wrote through the same container answered login claude[bot], type Bot, performed_via_github_app slug claude. Two answers, one session: GET /user is not the write-identity probe.

Card 18262, the second repository read. .github/workflows/lint.yml on this tree keys its concurrency group on github.event.pull_request.number with the workflow and event name in front of it, and cancel-in-progress: true. Same shape as the sibling repository's: on the pull-request path the identity segment is the PR number, never the head sha. So the hazard the card measured on the sibling is not sibling-specific, which is why the row says both.

Card 18195, live instrument reading on this tree. Subject: a single-line grep -F for the joined ruling phrase over scripts/pm/check-skill-line-ratchet.mjs reads 0, exit 1. Same file, same pattern, after collapsing the source's own string concatenation: 10. A ten-hit population that a single-line search reports as absent - which is the direction in which a defect looks like success.

Dedupe, per card

Counted candidate / landed / rewritten / already present / refused, as the standing exception requires.

card candidates landed rewritten already present refused
18195 1 1 0 none 0
18158 1 1 0 none - the RULE half is carried by rest-channel.md and pm-dispatch SKILL.md, the PROBE was not 0
16762 2 0 3 the absent total_count state (the refused search path) at register lines 208 to 210 0
18219 2 1 0 none 1 (the self-heal: one observation, not a mechanism)
18147 2 1 0 none - the suspension block records destroyed CONTENT, never events 1 (the periodic-burst discriminator: an explicitly falsifiable hypothesis)
18258 3 1 0 the trigger itself and its issue-body cells at lines 331 to 332; the author-side prescription at 333 and the first-differing-offset comparison at 357 0
18262 1 1 0 none - line 297 carries the READ-side discipline, this is the WRITE half 0
total 12 6 3 3 2

Every card landed something, so every card takes a Fixes line. No card was all-present.

The grep that proved the two clean subjects, taken on origin/main before writing: the join-before-search family returned exit 1 and zero lines with the control at 5 lines, and performed_via returned exit 1 and zero lines with the control at 6 lines.

Reverse verification

  • The register is 465 lines and the ceiling is 465: check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 465 lines (ceiling 465; headroom 0).
  • The declared cross-file move still reconciles with the new record subtracted: cross-file move into .claude/skills/pm-dispatch/references/platform-readings.md: +11 (314 to 465, less 140 lines of ordinary ruled raise) against a net source decrease of 20.
  • Each new row greps back from the register by its own control word: performed_via_github_app, the suspension-events row, the comment-count row, the sixth reading trap, the concurrency row and the comment-write mangling row all return exactly one line.
  • The rewritten rows no longer carry the falsified basis: a grep for the old zero-answer clause over the three rewritten lines returns nothing, while the new qualifier row and the new sentence-form row each return one.

Gates

Derived with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack and NO paths, on head 8d518947, then reconciled with --ran carrying every exit code:

Run reconciliation - 39 derived, 39 run, 0 NOT-MEASURED, 0 UNRUN.
dispatch-gates --ran: 39 derived famil(ies) accounted for - 39 run,
  0 NOT-MEASURED (a DERIVED zero - all 39 recorded an exit code and none of them is 3).

Every family ran in the foreground with its exit captured by redirect before any pipe, on the head above, after the merge commit. On an earlier pass one family exited 3 (check:doc-formula-expressions, PREREQUISITE NOT MET: two workspace packages unbuilt); the build the gate itself prescribes was run and it has exited 0 ever since, which is the only reason it reads green - a 3 is recorded as NOT MEASURED, never as a pass. check:pm-dispatch-gates is derived (this diff edits a gate source) and was run the way its own header prescribes - detached, waited on in the foreground with tail --pid, never a foreground call that a cap could cut off - and reached a verdict: dispatch-gates self-test: 1730 cases pass, 435.7s on this box, exit 0.

The three families the dispatch named by hand are in that set and green: check:pm-skill-ratchet, check:pm-skill-id-lint (27 files clean) and check:pm-governed-prose (2 instruction surfaces name all 5 registered governed surfaces).

origin/main moved five commits while this was in hand (none of them touching either file in this diff, two of them touching gate sources). It was merged, dependencies refreshed, the family list re-derived byte-identical, and the WHOLE union re-run on the merge commit - so every exit code above belongs to the head named here and the reconciliation reports no stale tree.

Repo-wide pnpm lint is CI's run, and the narrowing here is measured rather than assumed. (1) The universe is read from eslint's own configuration: of the two changed paths only the .mjs is in it, and eslint says so itself for the other - File ignored because no matching configuration was supplied. (2) The count is read from --format json: two entries, one actually linted, 0 errors and 0 warnings on it. (3) The invariance: eslint.config.mjs states it configures no parserOptions.project and no typed rules, so type-aware linting is off and this diff cannot move the verdict on any file it does not touch.

Patch round 1 - two rows corrected in place, line-neutral

Both corrections are rewrites, so neither adds a line and the ceiling does not move: the register stays at 465 of 465 with headroom 0.

Line 130, the write-identity probe. The first pass named performed_via_github_app beside user.type as though the pair discriminated. It does not: that field was measured reading the same App object for a REST-proxy write authored by the App, for a REST-proxy write authored by a user token, and for four further specimens - six in all, one identifier. The row now says the read-back is still the probe but that user.type with user.login is what tells the class, and names the App field and GET /user together as the two that answer the same under both. 118 bytes to 116. The ratchet record's accounting comment carries the same correction.

Lines 189 and 191, the sentence form. The first pass wrote the sentence form as the one that answers a confident zero. That is one of its two measured directions, not its behaviour: on 2026-09-09 a sentence returned total_count: 0 against a population that existed, and on 2026-09-15 a sentence built from a card's own title words returned three hits with that card first and the control lit. Line 189 no longer claims both spellings contradict the tool's self-description - only the qualifier form does - and line 191 now carries both dated readings and the consequence: a lead, never a zero-proof for dedupe. 111 to 114 bytes and 120 to 113 bytes. Line 190, the qualifier row, is untouched.

Authored by the skills-lane dev agent in session session_01HZfg2AwVX191qCizp88gQr; this line is the durable attribution, because a body edit through this channel does not keep a footer.

Acceptance notes

Noted, not filed:

  • Card 17976's three-channel disagreement healed between the card's reading and this one, after three writes landed on it. Consistent with a stale counter recomputed on the next write, but it is one observation on one card and the mechanism is still NOT MEASURED - it stays on the card, not on the register.

To file (class a, a register row whose stated basis a reading falsifies - the same class card 16762 was filed as). Dedupe words: check:pm-dispatch-gates, 600 seconds, foreground cap, detached, tail --pid, battery runtime:

  • The register's row saying this gate EXCEEDS the container's 600-second foreground cap was measured at 433.3s on this box today, on a merged head, under sibling load. The prescription (detach and wait with tail --pid) is untouched by that and the gate's own header keeps it deliberately - the cap is a property of the caller's container and its contention, neither of which the script can see. Only the row's stated basis is now conditional. One reading on one box does not settle it, which is why this is a card and not an edit riding this PR.

Maintainer summary (draft)

改了什么(含补丁轮)- 事实表加了六行实测读数(写身份探针、账号停用抹掉事件、卡片评论计数多读、拼接短语的 grep 仪器、CI 并发组按 PR 号、评论写侧的字符丢失),另把三行关于查重搜索的旧规则按实测重写。门禁脚本里上限 459 抬到 465,记一条引常设裁决的 ruledRaises

为什么改 - 这七张卡各自带着已测到的平台事实,而事实表是舰队查表的唯一出处;其中一格(查重搜索)写着的理由已被三个会话加本轮的对照读数推翻,继续留着会把舰队指向唯一会静默失败的那种拼法。

风险与代价(含回滚) - 只动说明文字与一个门禁的上限数字,无运行时影响,不发布任何包。回滚成本 = 还原这一个提交;上限数字随之回到 459,门禁自洽。真正的代价是事实表又长了六行,这正是常设裁决按落地行数逐次计价的那件事。

席位意见 - (留空,待席位定稿)

你要做的 - 无须动作;这是 references/** 层,按分层落地规则走席位契约级复核后进队列。补丁轮把两处读数按已在案的实测改正:令牌类只由作者类型判别,句子形搜索两个方向都测到过,故只作线索。


Generated by Claude Code

…lifier rewrite

Folded family of seven graded cards, one file surface plus the ratchet entry.

Six rows added to the facts register, one per deduplicated reading: the
write-identity probe; a suspension erasing events as well as content; the card
comment COUNT over-reading against list and timeline; the join-before-search
grep instrument; PR-keyed CI concurrency making a re-run a write; and the
comment-write cell of the exclamation-before-bracket loss.

Three search_issues rows are rewritten in place onto what is measured: the
qualifier-shaped query is not refused and does filter, matching the
deterministic REST list endpoint number for number, while the description
sentence form answers a confident zero with a lit control at zero too.

Ceiling 459 -> 465 under the standing one-file exception, recorded as the
sixteenth ruledRaises record.

Claude-Session: https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr
Co-authored-by: Claude <noreply@anthropic.com>
…e sentence form is a lead not a zero-proof

Patch round 1, two rows corrected in place, line-neutral, no ceiling move.

The token-class row named a field that does not discriminate: the App
identifier reads the same object for a REST-proxy write authored by the App
and for one authored by a user token, measured across six specimens. The
read-back still is the probe; within it only the author type and login tell
the class.

The search rows overstated the sentence form. It is a semantic matcher that
can answer a confident zero for a population that exists and can also hit
with the target first, and both directions are now measured and dated. It is
a lead, never a zero-proof for dedupe; the qualifier form stays the
deterministic one and its row is untouched.

The ratchet record's accounting comment follows the same correction.

Claude-Session: https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr
Co-authored-by: Claude <noreply@anthropic.com>
@claude

claude Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 8d5189479b2cc08e87163c2cd4d349669a0b75de

Reviewing seat: domain:skills, in-seat review at the contract-review tier — get_session read at 2026-09-15T07:15Z: configured_model = session_context.model = last_served_model, the constant's tier, no fallback notice this round. Fold of seven cards (#18195 anchor · #18158 · #16762 · #18219 · #18147 · #18258 · #18262), claims 5675724812 / 5675725089 / 5675725359 / 5675725683 / 5675725956 / 5675726367 / 5675726731, report 5676284551, REWORK 5676372550 (patch round 1 of 2), patch report 5676566126; Clause-②: no on every claim; default-tier build (--tier names no mandate for references/** or scripts/pm/**), seat review at tier.

① Derived judgments

② Semver level

Not applicable — nothing published moves; skip-changeset measured.

③ Boundary flags

open_questions: none. Round-1 deviations (5) and patch deviations (2), each answered: (1) one ruledRaises record per increment, not per row — accepted, the FIFTEENTH's measured shape; the seat's own body line said 「each row = one entry」 and is corrected by this record. (2) #18258 narrowed to the uncarried comment-create cell after dedupe — accepted, dedupe-first is the rule. (3) the owner/repo-parameter prescription dropped for want of a reading — accepted, the seat's reading agrees (its qualifier query carried none). (4) the count word 五 → 六 — accepted, line-neutral. (5) main merged mid-flight and the union re-run — accepted. Patch (1) the PR-body PATCH sent footer-less per the register's own cell, one footer stored — accepted. Patch (2) :191 drops the lit-control clause for the two dated directions — accepted, the card carries it. Out of scope, routed: the register row saying check:pm-dispatch-gates EXCEEDS the 600 s foreground cap, measured under it three times on one box — filed as #18283 (a class-a register row, region claim behind #18280 / #18274 / #18248); card 17976's healed counter stays on its card. Landing: references tier + scripts/pm/** ⇒ in-seat, once every check on 8d518947 is green: ready through the CCR route, auto-merge SQUASH, the enqueue event read, provenance on this PR.

Implemented-by: claude/issue-18195-platform-readings-fold
Reviewed-by: session_01HZfg2AwVX191qCizp88gQr

VERDICT: PASS


Generated by Claude Code

@claude
claude Bot marked this pull request as ready for review September 15, 2026 07:47
@claude
claude Bot added this pull request to the merge queue Sep 15, 2026
@claude

claude Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor Author

Landing provenance — skills seat, session session_01HZfg2AwVX191qCizp88gQr, 2026-09-15T07:47Z. References-tier + scripts/pm/** landing (no rules-layer file in the diff; #17950 tiering): review of record 5676604220 PASS on head 8d5189479b2cc08e87163c2cd4d349669a0b75de, ACCEPT 5676604957 on the anchor #18195 after patch round 1; every check on that head read green at 2026-09-15T07:47Z (27 success / 11 skipped / running none / failed none). The seat flipped the PR ready through POST …/pulls/18279/ccr/ready_for_review and armed auto-merge SQUASH through PUT …/pulls/18279/ccr/auto_merge; the added_to_merge_queue event reads 2026-09-15T07:47:03Z (actor claude[bot], one second after the ready_for_review event at 2026-09-15T07:47:02Z). Base e07eecfa behind origin/main 9fa9955a with no conflict (mergeable true) — no base merge taken, the queue builds the group on the current main. Landing is confirmed by the two readings (merged_at + git log origin/main carrying (#18279) single-parent) at the next wake; the squash closes the seven cards by Fixes, then each card's residue is stripped and the landing records posted.

Edited at 2026-09-15T07:48Z by the same seat: the enqueue clause above was stored garbled — the seat's own timeline read script failed at write time and its error text was pasted into the token slot; post-stamped neither rendered nor refused the malformed token (filed as a tool finding). The reading now in the clause was taken from the timeline at 2026-09-15T07:47Z and nothing else in this comment changed.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] issue 的 comments 字段可读出 1 而 list 与 timeline 两条通道都读 0 —— 可复现,带四张对照 [finding] platform-readings: a phrase that only exists after joining (string concatenation, markdown emphasis, a wrapped line) reads 0 under a single-line grep in both directions — the instrument row PR #18194 could not fit into the rules layer [finding] platform-readings: write identity is a per-session credential shape — installation → claude[bot], user-to-server → the human login with performed_via_github_app: claude; GET /user answers the human login in BOTH, so it is not the probe [finding] platform-readings: a suspended account's EVENTS are erased with its content (labels stay, the labeled actor is gone) — and the one variable shared by the two suspended triage accounts is the hourly periodic-burst shape, not volume [finding] MCP search_issues DID honour GitHub qualifiers (repo: is: label:) in two exact readings — the ledger's "qualifier form returns total_count 0" rule needs a second session before it stands or falls

1 participant