Skip to content

docs(spec): the app and view liveness ledgers cite the deciding commit, or state the decision in words, in place of dead tracker numbers - #20840

Merged
os-justin merged 1 commit into
mainfrom
claude/issue-20234-liveness-dead-numbers-4a
Sep 30, 2026
Merged

os-justin merged 1 commit into
mainfrom
claude/issue-20234-liveness-dead-numbers-4a

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #20234

Clause-②: no

Liveness slice 4a (claim 5909281604). In app.json (10 sites) and view.json (6), each note that cited a tracker number answering 404 now names the commit that decided it or, where the number alone carried the meaning, says what was decided. All 16 sites carried the same number, and each now reads (commit 8f10a79f7), the commit that wrote them. 16 note / _note leaves change and no other leaf does; no number is added. Left for slice 4b: field.json (11) and liveness/README.md (29). One @objectstack/spec patch changeset.

Local runs at e5552bfc90: build 71/71; spec local 578 files pass; spec repo 41 of 45 pass; spec typecheck and the lint package's liveness test pass; 58 derived gates, 57 exit 0 (check:platform-checklist: the pre-existing auth-plugin.ts#twoFactor anchor, not per-PR CI). Lint: ESLint's config matches none of the 3 changed files (3 "no matching configuration" results, 0 errors); type-aware linting is never enabled.


Generated by Claude Code

…commit in place of a dead tracker number

Sixteen notes in packages/spec/liveness/app.json (10) and view.json (6)
dated their 2026-08-28 re-anchoring with a tracker number that now
answers 404. Each now names the commit that wrote it, 8f10a79 (the
closing symbol-anchor batch), the same anchor earlier slices landed for
that batch's other ledgers. Note text only: no status, evidence,
verifiedAt, producer or evidenceScope leaf changes.

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

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 2 changed file(s) yielded no anchor (packages/spec/liveness/app.json, packages/spec/liveness/view.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 2 changed file(s) yielded no anchor (packages/spec/liveness/app.json, packages/spec/liveness/view.json) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 137 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json bbe03f4068c8cdf84480c4dccdf6831d540faef7 → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: e5552bfc90bbf3139690b4ba4b2efcadb5f831d4
Local-runs: none

Read: card #20234 (body and all 60 comments, among them the fleet decision 5856637615, the pointer 5858331362, the liveness-stage claim 5903336242 and its ruling 5903816491, the slice-2 and slice-3 rulings 5905232957 and 5907367381, the slice-3 landing 5908457230, the slice-4a claim 5909281604, the dev report 5909847170 and the seat's ruling 5909873384, plus every earlier stage's claim, report, ACCEPT and landing); ruling C+D 5749154545 on #19123; the slice-1, slice-2 and slice-3 records 5904102896 (PR #20772), 5905625045 (PR #20788) and 5907859984 (PR #20815) for the bar; PR #20840 (object, body, 3-file list, its one commit e5552bfc90, the net diff against main from merge base 15b586dcff, which is origin/main's ancestor and the base the claim named); the two ledgers at base and head by git show; the anchor commit 8f10a79f7 by git show (message, stat, its own diff of app.json and view.json, and its changeset); the later writer 6ac33a57df; the nine sibling ledgers on origin/main; packages/spec/package.json files[], packages/lint/src/lint-liveness-properties.ts, eslint.config.mjs lines 327-328 and 971, AGENTS.md line 14, docs/qa/platform-checklist/areas/identity-auth.json and packages/plugins/plugin-auth/src/auth-plugin.ts at the head; REST issues/N without redirects for every one of the 58 distinct in-repo numbers the two files carry at the head, the removed number, the batch's PR number, the field.json and README dead numbers, a lit control (#20234) and a dead control (#8710), and the objectui repo for the one cross-repo number; the check-runs on the head, last. Nothing built, tested, re-run or checked out: the structural read below parses git show output as JSON and compares leaves, which is a read of the diff and not a repo tool.

① Derived judgments

(a) Accept set and public surface: nothing moves. Right. The diff is packages/spec/liveness/app.json (+10/-10), packages/spec/liveness/view.json (+6/-6) and one new changeset (3 files, +30/-16). No .zod.ts, no export, no generated page, no migration entry, no script, no README, no state-counts/, nothing under packages/spec/src or packages/spec/scripts. The ledgers are published data (files[] of @objectstack/spec 17.5.0 names liveness), which is the only reason a changeset exists (②). Author-shown text: the one reader that surfaces a ledger note to an author is lint-liveness-properties.ts:390 (entry.authorHint ?? entry.note, on authorWarn rows only); none of the 14 changed rows carries authorWarn (each holds status, verifiedAt, evidence, note and, on three of them, evidenceScope, and nothing else), and the two _note leaves are file headers no lint reads. So no author-shown string moves, form D is not required at any site, and Clause-②: no is right.

(b) Structural read: PASS, and it matches the report and the ruling to the leaf. Every leaf of both files at 15b586dcff and at the head compared, in order: app.json 217 leaves before and after, view.json 225 before and after; 0 leaves added, 0 removed, leaf order identical in both files. 16 leaves differ: app.json 10 (the _note and the note of name, label, description, hidden, navigation.label, navigation.requiredPermissions, navigation.requiresService, requiredPermissions, _unpublished) and view.json 6 (the _note and the note of object, list.name, form.sharing, listViews, formViews); 14 note, 2 _note, nothing else. 0 status, evidence, verifiedAt, producer or evidenceScope leaves differ, and neither file has a proof leaf. Each changed leaf equals its base text with the literal (#13003) replaced by (commit 8f10a79f7) and no other byte, by string equality. Tracker numbers: #13003 counts 10 → 0 and 6 → 0; 8f10a79f7 counts 0 → 10 and 0 → 6; every other #N count in both files is unchanged, so 0 numbers are added.

(c) The anchor: real, unique, reachable, and its own content decides what every note says. Right. git rev-parse --disambiguate=8f10a79f7 returns exactly one object, 8f10a79f7aef471482fdb4761ae150014a7f355a; merge-base --is-ancestor origin/main exits 0. Its subject is "chore(spec): re-anchor the closing twelve liveness ledgers to consuming symbols (#13003 batch 4) (#13044)", its body "Part of #13003", and its stat lists app.json (56 lines) and view.json (28). git log -S 'RE-ANCHORED (#13003)' and git log -S '2026-08-28 (#13003)' over both files each return that commit alone, and its own diff adds #13003 exactly 10 times to app.json and 6 to view.json, equal to the base counts, so it wrote every site. 15 of the 16 sixty-character text windows around the base number are present verbatim in the commit's version of the file; the sixteenth (app.json description note) carries its "RE-ANCHORED (#13003) and REPOINTED — :482 had rotted onto the title lookup" clause at 8f10a79f7 verbatim, while the words before it were rewritten by 6ac33a57df (the #20302 AppSidebar re-point, 2026-09-27); the clause the parenthesis dates is the commit's own. Its content matches what the notes say around the number: the message records app.json's name / label / description drifting onto "three consecutive lines of one unrelated action resolver" (the description note's words), "view 5/5" rotted (the view _note's "all five were wrong"), and its diff re-anchors ten app.json evidence citations across nine rows with the hidden note recording its pointer as accurate (the _note's "nine of the ten were wrong"). #13003 and #13044 both answer 404 (controls #20234 = 200, #8710 = 404), so the number was dead and the commit is the right in-repo object. Form C's first preference, an ADR or ruling record, has nothing to offer here: no ADR on main covers the symbol-anchor re-anchoring, the grammar card #12516 answers 200 but is itself a tracker number, and #13003's rulings died with it. The identical construction, (commit 8f10a79f7) beside the unchanged "Re-closed by hand against 8cb96ec" clause, already stands on origin/main in nine of that batch's sibling ledgers (capability 6, dashboard 4, flow 5, hook 9, mapping 7, qa 5, seed 6, translation 9, validation 9), accepted by the slice-2 and slice-3 records.

(d) Form: 16 of 16 in form C, 0 in form D. Right. Every site was the dating parenthesis of "2026-08-28 (#13003):" (the two headers) or "2026-08-28: RE-ANCHORED (#13003)" (14 rows); the sentence around it already said what was decided, so the commit alone is the citation and no sentence was rewritten in words. No form-D sentence exists to test.

(e) The two files at the head carry no dead in-repo number. Right. All 58 distinct #N spellings the two files carry at the head were probed here: 57 answer 200, 0 answer 301. The one 404 in this repo, #10617, is spelled "objectui PR #10617" at all 12 of its sites (pre-existing at base, untouched), and objectstack-ai/objectui pulls/10617 answers 200, as do objectui #5817, #5720 and #10827; it is a cross-repo pointer, not a dead citation. So the PR body's population sentence is exact, not over-broad.

(f) Text someone acts on, sentence by sentence.

  • Changeset headline "Notes in the app and view liveness ledgers that cited a tracker number which no longer resolves now either cite the commit that decided them or say the decision in words": the population is the 16 notes (e), all 16 take the first arm, and the either/or wording is what ruling 5905232957 set for these changesets. True on main when this PR lands.
  • "Sixteen notes in the app and view ledgers cited a GitHub issue that no longer exists": 16 changed leaves, one number, 404. True.
  • "Each such note now either names the commit that made the decision or, where the number alone carried the meaning, says what was decided": 16 of 16 name 8f10a79f7, the commit that performed the re-anchoring each sentence dates. True.
  • "The liveness/ ledgers ship in this package's tarball, which is why this is a release note at all": files[] names liveness. True.
  • "Note text only: no row's status, evidence, proof, producer or date changes, and no schema, export or runtime behaviour changes": (b) and (a). True, and the notes' own date text is unchanged too.
  • PR body "In app.json (10 sites) and view.json (6), each note that cited a tracker number answering 404 now names the commit that decided it or ... says what was decided": counts exact, population exact (e). True.
  • "All 16 sites carried the same number, and each now reads (commit 8f10a79f7), the commit that wrote them": (b) and (c). True.
  • "16 note / _note leaves change and no other leaf does; no number is added": (b). True.
  • "Left for slice 4b: field.json (11) and liveness/README.md (29)": at the head field.json carries #13003 9, #13036 1, #13043 1 (all 404) and the README 29 sites over 16 dead numbers (#14369 5, #14691 4, #6540 3, #14365, #13036, #11330, #10812 2 each, nine singles), counted here. True today; ruling 5909873384 takes field.json after PR feat(spec): the picklist metadata kind — a shared option list select fields reference by name (#19518) #20823 lands.
  • "One @objectstack/spec patch changeset": true.
  • The local-runs paragraph (build 71/71, spec local and repo projects, typecheck, the lint liveness test, 58 derived gates with 57 exit 0): not re-run here by design; the check-runs answer every family it names (Build Core, Test Core 1-6, TypeScript Type Check, the four Type Check gates, Lint & Repo Gates, Spec property liveness, all success). Its one named failure, check:platform-checklist on the auth-plugin.ts#twoFactor anchor, reads true at the head: identity-auth.json:1599 cites that anchor, and twoFactor appears in auth-plugin.ts only inside a comment (1612) and as an inline object key (1622), never as a declaration; none of the 3 changed files is under docs/qa, packages/plugins or scripts, and no check-run on the head carries that gate's name. True, and pre-existing.
  • "ESLint's config matches none of the 3 changed files ...; type-aware linting is never enabled": eslint.config.mjs:971 is files: ['**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}'], which no .json or .md matches, and lines 327-328 state the type-aware invariant. True.
  • Commit message "the closing symbol-anchor batch" and "the same anchor earlier slices landed for that batch's other ledgers": the commit's own body calls itself "the closing batch", and nine sibling ledgers on main carry commit 8f10a79f7 (c). True. The commit subject is chore(spec) where the PR title is docs(spec); the squash takes the PR title, as slices 1-3 did. Cosmetic.

Witness, not a finding. Each rewritten sentence now pairs the row's own 2026-08-28 with a commit stamped 2026-08-29T00:39:37Z (author and committer, UTC). The date is the rows' verifiedAt, unchanged by this PR, and the nine sibling ledgers on main carry the same pairing under the slice-2 and slice-3 records. Nothing here for this PR to change.

② Semver level

patch on @objectstack/spec is right, and not skip-changeset: liveness/app.json and liveness/view.json are inside the published tarball (files[] names liveness), so the shipped bytes change, and nothing else does (no schema, no export, no json-schema, no api-surface, no generated page, no migration entry). Clause-②: no on the PR body and inside the changeset agree with the diff: no accept set moves, no key is added to a published payload, no author-shown or AI-facing string changes. The changeset headline and body say only what holds for every rewritten note (①f). Check Changeset is success on the head. The changeset's frontmatter, Clause-②: line and either/or shape follow the slice-1 to slice-3 files on main (82 changesets on main carry a Clause-② line).

③ Boundary flags

The dev report 5909847170 carries open_questions: [], four deviations and three out_of_scope_findings; each is read here.

Check-runs on e5552bfc90bbf3139690b4ba4b2efcadb5f831d4, read last at 2026-09-30T11:24Z: 39 raw runs, 35 names after dedupe by newest started_at; 30 success, 5 skipped (Auto Label, Build Docs, Check PR Size, Console Pin Gate, Packed-tarball smoke (opt-in)), 0 failure, 0 cancelled, 0 still running. Among the successes: Check Changeset, Spec property liveness, Lint & Repo Gates, Build Core, Test Core and its six shards, TypeScript Type Check and the four Type Check gates, Temporal Conformance, Dogfood Regression Gate and its three shards, Dogfood Verify CLI, Governed Surface Queue Guard, Part-of PR must not also close its card, The card this PR closes must claim this branch, No other open PR may claim the same issue, No other open PR may claim the same single-writer path, Check Documentation Links, Flag docs affected by code changes, filter. The skips are the filter's own paths verdicts and the opt-in label, not failures.

Implemented-by: claude/issue-20234-liveness-dead-numbers-4a
Reviewed-by: session_01Sfe5YjBLwB9J3y8fvm2xq1

VERDICT: PASS

Adopted and posted by domain:spec seat 5 (session_01Sfe5YjBLwB9J3y8fvm2xq1) · 2026-09-30T11:29Z · rendered by the seat's at-tier review subagent on this head. The seat read its served tier family from the subagent transcript before posting.


Generated by Claude Code

@os-justin
os-justin marked this pull request as ready for review September 30, 2026 11:30
@os-justin
os-justin enabled auto-merge September 30, 2026 11:31
@os-justin
os-justin added this pull request to the merge queue Sep 30, 2026
Merged via the queue into main with commit 688ddef Sep 30, 2026
44 checks passed
@os-justin
os-justin deleted the claude/issue-20234-liveness-dead-numbers-4a branch September 30, 2026 11:51
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Oct 7, 2026
… — no queued PR left the queue on a draft conversion (objectstack-ai#20845)

Fixes objectstack-ai#20764

Clause-②: no

## What changes

`.claude/skills/pm-dispatch/references/platform-readings.md`, lines
41-43 only. The rewrite is net 0 lines, and the three new lines are 120
/ 118 / 120 bytes (cap 120).

| line | before | after |
|:--|:--|:--|
| `:41` | 转 draft 不是可靠的踢队手段:两向相反读数并存,处置按最坏走。 | 转 draft
不是可靠的踢队手段:本仓与姊妹仓均见已入队转 draft 仍保位照合,处置按最坏走。 |
| `:42` | 本仓转 draft 同时掉 auto-merge 与队列成员资格,不自动恢复,转正后重挂;姊妹仓曾保位照合。 | 本仓转
draft 同秒掉 auto-merge 仅见于未入队时,转正后重挂;已入队者 2026-08-08、09-29 照合。 |
| `:43` | 补救:转 draft 与卸载 auto-merge 都做 —— 本仓卸载 auto-merge 单独不踢队。 | 补救:转
draft 与卸载 auto-merge 都做,本仓卸载单独不踢队;两手齐做亦未见踢队(08-08、09-28)。 |

The remedy on `:43` is unchanged: do both acts. No rule is added. The
in-file citations are dates, because `pnpm check:pm-skill-id-lint` goes
red on a `#`-number anywhere under `.claude/skills/pm-dispatch/`, and
this file cites no PR number today. The PR numbers and timeline events
are in this body. That is where the id-lint header puts a reading's
provenance.

## The readings (re-readable: `GET
/repos/objectstack-ai/objectstack/issues/N/timeline`)

I ran a read-only timeline scan over objectstack-ai#4700-objectstack-ai#4900, objectstack-ai#6650-objectstack-ai#6850 and
objectstack-ai#20400-objectstack-ai#20840. It looked for two patterns: a `convert_to_draft` between
`added_to_merge_queue` and the next `removed_from_merge_queue`, and a
`convert_to_draft` on a PR that was armed but not queued. The scan found
every row below. The table is complete for those windows only, not for
the whole repo.

**Queued, then converted to draft.** None of the four left the queue
because of the conversion.

| PR | queued | draft | disable sent? | what followed |
|:--|:--|:--|:--|:--|
| objectstack-ai#6732 | 2026-08-08T14:01:50Z | 14:04:32Z | claimed in objectstack-ai#6799's text; no
`auto_merge_disabled` event | the queue merged it at 14:38:56Z, 34 min
later, still draft |
| objectstack-ai#20420 | 2026-09-28T13:43:01Z | 14:02:28Z | claimed in the seat's
14:04Z comment; no event | its own group `pr-20420-3cf6449` had `Lint &
Type Check` = failure at 14:01:49Z, before the draft;
`github-merge-queue[bot]` removed it at 14:11:24Z, unmerged |
| objectstack-ai#20442 | 2026-09-28T13:45:42Z | 14:02:50Z | claimed in the seat's
14:04Z comment; no event | the queue built a new group
`pr-20442-b285508` for it at 14:11:29Z, 9 min after the draft; that
group's `CI` = failure at 14:30:14Z; removed at 14:35:44Z, unmerged |
| objectstack-ai#20695 | 2026-09-29T23:32:51Z | 23:57:02Z | no (the card discloses:
draft alone) | the queue merged it at 00:04:21Z, 7 min later, still
draft |

**Armed, not queued, then converted to draft.** Each one dropped
auto-merge.

| PR | armed | draft | `auto_merge_disabled` | after |
|:--|:--|:--|:--|:--|
| objectstack-ai#4745 | 2026-08-03T01:28:46Z | 01:29:30Z | 01:29:30Z (same second) |
ready, re-armed 01:30:52Z, queued, merged |
| objectstack-ai#6727 | 2026-08-08T13:42:58Z | 13:44:36Z | 13:44:36Z (same second) |
ready, re-armed 13:46:02Z |
| objectstack-ai#6829 | 2026-08-08T23:37:05Z | 23:40:25Z | 23:40:26Z (1 s) | ready and
enqueued 6 h later |

Each disable event carries the converter as its actor. A timeline cannot
tell whether the platform wrote it or a scripted follow-up did. The line
records what was observed ("同秒").

## Where the old reading came from

- The "drops queue membership" reading first appears in `db6581a5`
(objectstack-ai#4893, card objectstack-ai#4892, 2026-08-03). It cites no PR. That is the same day
objectstack-ai#4745 dropped auto-merge on an armed PR that was not queued. The
queue-membership half has no instance behind it.
- `cd704cc4` (objectstack-ai#6799) later cited objectstack-ai#6732 for "only draft evicts; disable
alone does not". In objectstack-ai#6732's own timeline the PR stays queued after the
draft and is merged by the queue 34 minutes later.
- The sister-repo half ("姊妹仓曾保位照合", objectui 2026-08-25) is carried over
as it was. I did not re-read it.

## How this departs from the triage direction (5903760674)

I did not choose these quietly. Each one is a place where a measurement
changed what the direction assumed:

1. **`:42` is split by queue state, not "mixed" in the sense of opposite
readings.** No queued PR in the scanned windows left the queue because
of a draft conversion. The direction assumed the old half had its own
measurement. It has none, and the one PR later cited for it reads the
other way. What does go both ways in this repo is the effect by state:
unqueued, auto-merge drops; queued, the PR keeps its place.
2. **`:43` says "not seen to dequeue", not "not measured".** Three PRs
(objectstack-ai#6732, objectstack-ai#20420, objectstack-ai#20442) have both acts claimed in writing, and none was
removed by them. The caveat: on a queued PR, the disable leaves no
timeline event, so whether it was sent rests on the seats' own comments.
3. **`:41` loses "两向相反读数并存".** No opposite reading survived the re-read.

## Acceptance notes

- **Out of scope, same family, Tier H.** `AGENTS.md` states the
falsified reading as a premise in three places. Prime Directive objectstack-ai#14 says
"draft is what removes queue membership, disabling alone drops only the
arming". Multi-agent §7 says "flipping back to draft drops auto-merge
and queue membership at once". The "State on your PR" paragraph says the
draft flag "flipped back destroys auto-merge and queue membership at
once". I did not touch them. They are reported to the seat.
- **Eviction.** The only dequeue acts measured in this repo are these
two. First, the queue's own ejection after a red group build (objectstack-ai#20420,
objectstack-ai#20442). Second, a manual removal by a maintainer with no draft
conversion (objectstack-ai#20797, `removed_from_merge_queue` 2026-09-30T07:33:36Z).
Whether the remedy should name a different act is a question for the
seat. It is not a rule this PR adds.
- **Changeset.** `.claude/**` is not in any package's `files[]`, so this
PR publishes nothing. `skip-changeset` is the seat's to apply.
- **Governed surface, Tier S (`.claude/**`).** This PR stays a draft
until a `## Contract review` record at `CONTRACT_REVIEW_TIER` exists for
its head.

## Verification (head `02ea176a1`)

- The 20 gates from `node scripts/pm/dispatch-gates.mjs --repo
objectstack-ai/objectstack --commands` all exit 0. They are
`check-closing-keyword-parity` (plus `--self-test`),
`check-comment-mask-corpus`, `check-governed-queue-guard --self-test`,
`check-harness-current --self-test`, `lint
check:doc-formula-expressions` (after building `@objectstack/lint` and
its dependency closure under `os-verify-lock.sh`),
`check:agent-test-spelling`, `check:cross-package-test-inputs`,
`check:doc-authoring`, `check:driver-memory-census`,
`check:gitlink-declared`, `check:nul-bytes`, `check:pm-governed-merges`,
`check:pm-half-states`, `check:pm-skill-id-lint`,
`check:pm-skill-ratchet`, `check:refd-timer-probe`,
`check:required-contexts`, `check:skill-frame-sync` and
`check:watch-hint-literal`.
- `pnpm check:pm-settings-deny-roster` was also run, because its roster
lives under `.claude`. Exit 0.
- `--ran` reconciliation: 20 derived, 20 run, 0 NOT-MEASURED. All 20
recorded an exit code.
- `check:pm-skill-ratchet` printed: `platform-readings.md is 469 lines
(ceiling 469; headroom 0)`, widest table row 0 bytes (pin 0).
- Not measured locally: `check-required-contexts --verify-required-set`
and `check-half-states --provenance`, which read the workflow event, and
the four CI type-check lanes. This diff touches no TypeScript.

## 维护者速读(草稿)

- **改了什么**:PM 协议参考文件 `platform-readings.md` 第 41-43 行,关于「已入队 PR 转 draft
能否踢出合并队列」的三条平台读数。行数不变。
- **为什么改**:旧文说本仓转 draft 会掉出队列。回查时间线后发现,本仓 4 个已入队后转 draft 的 PR 都没有因此出队。其中
2 个带着 draft 状态被队列直接合入,另外 2 个是在自身队列构建变红之后才被移出。旧说法唯一引用的实例,时间线恰好反向。转 draft
会掉 auto-merge,这一点只在「未入队」时成立。
- **风险与代价(含回滚)**:只改文档读数,不改任何规则或代码。补救仍是两手都做。风险在于读者以为有可靠的踢队手段,而实际没有。回滚就是
revert 这一个提交。
- **席位意见**:
- **你要做的**:无需操作,由席位按 Tier S 复核后落地。若要让 `AGENTS.md` 里的同一旧说法一并修正(Tier
H),需要你点头另开 PR。

---
_Generated by [Claude
Code](https://claude.ai/code/session_01KTZmMfzVzjNvyaLyQ8mHvg)_

Co-authored-by: Claude <noreply@anthropic.com>
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 tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants