Skip to content

docs(spec): V3_MIGRATION_GUIDE announced a relocation that never happened, and the census gains a standing unpublished-subpath control - #18866

Merged
os-bill merged 2 commits into
mainfrom
claude/issue-18753-guide-unpublished-subpaths
Sep 18, 2026
Merged

os-bill merged 2 commits into
mainfrom
claude/issue-18753-guide-unpublished-subpaths

Conversation

@os-bill

@os-bill os-bill commented Sep 18, 2026

Copy link
Copy Markdown
Collaborator

Fixes #18753

Clause-②: yes (widening)

Two halves, both required by the dispatch: (A) make the document true, and (B) turn this card into a fixture the census instrument cannot lose when the document is repaired.

All readings below were taken in this worktree at base 62b114f8b8 (the seat's readings were taken at be7aeb8275, so every one was re-measured rather than inherited). Commit cited for the gate and lint runs: 8ac750cfe9.

What the re-measurement found, and where it departs from the dispatch

The card framed one fork: repoint the specifier, or declare the subpath. The dispatching seat had already shown route (1) and route (2) are both unavailable for two of the three. Re-measuring confirmed that and added the cause:

Claim in the guide Measured at 62b114f8b8
helpers "moved to @objectstack/core/errors" / @objectstack/core/plugin False. 466f32ea22 ("v3.0: Remove all deprecated items") deleted them: 25 removed lines naming the three symbols, 0 added lines naming them. It created neither destination.
the three symbols exist somewhere No. Zero .ts/.tsx files repo-wide name createErrorResponse, getHttpStatusForCategory or definePlugin. Bright control on the same git grep: defineStack reads 368 files.
@objectstack/core serves those subpaths No. Its exports map has exactly two entries, . and ./logger.
"ErrorResponseSchema, PluginDefinitionSchema etc. remain in @objectstack/spec" Half false. ErrorResponseSchema (const) is at api-surface/api.json:364; PluginDefinitionSchema reads 0 across every api-surface/*.json file.

The guide was created 2026-02-11; the removal landed 2026-02-12. It predicted a relocation one day before a commit that did not perform it, and ticked the checklist anyway. So the defect is not three unresolvable imports — it is a false completion declaration, and there is no resolving specifier to substitute because nothing was ever published to replace these.

Departure: line 28 keeps @objectstack/spec/hub, deliberately

The dispatch prescribed repointing line 28 at @objectstack/spec/system. This PR does not do that, on the dispatch's own single criterion — after the repair, every sentence the document says must be true of this tree today.

Line 28 sits inside a block headed // ❌ v2.x (deprecated, removed in v3.0), and the ✅ block directly beneath it already says import { TenantSchema } from '@objectstack/spec/system';. Repointing line 28 would make the ❌ and ✅ blocks identical and have the guide assert that the current, supported import is the one v3.0 removed. That is a worse falsehood than the one being repaired, and it deletes the document's only statement of what to migrate away from.

Two measurements make the case stronger than a style preference:

  1. Line 28 contributes nothing to the census number anyway. Its block reports TS1109 only — a syntax error from parse({ ... }) — so it lands in pass 1's unparseable set and tsc never type-checks it. @objectstack/spec/hub produces no TS2307 at all in the corpus today. The card's "measured as TS2307" holds for two of the three specifiers, not three.
  2. Both remaining ❌ blocks (sections 2 and 4) have the same property: they are true depictions of removed APIs. The instrument's own docblock already concedes this category for CHANGELOG.md — "before/after migration snippets that deliberately show removed APIs. A failing block here is frequently CORRECT documentation."

What the ❌ blocks did get is an explicit in-block disclaimer, modelled on the shape content/docs/protocol/kernel/plugin-spec.mdx already uses in this repository (a warn callout naming what does not exist, repeated as an in-block comment at the point of use): each now says it is shown so you can find and delete it, and must not be copied.

⇒ If the seat prefers the prescription as written, or prefers de-fencing the ❌ blocks into prose so they leave the TypeScript population entirely, both are one-line follow-ups. They are recorded as open questions rather than taken unilaterally.

(A) What changed in the document

  • Section 2 renamed "Runtime Logic Extraction" to "Runtime Helper Removal" — no inbound anchor references it — and now states the removal with no destination, above a callout naming the relocation that never happened.
  • The table's "New Location" column is now "v3.0 disposition", reading "Removed — no replacement export" on all three rows.
  • The ✅ code block is gone. There is no ✅ counterpart to paste. In its place: prose pointing at what actually exists — ErrorResponseSchema still describes the envelope, and a plugin is an ordinary object or class matching the Plugin interface exported from @objectstack/core via export * from './types.js'.
  • The two checklist items are unticked and reworded. The tick was the false claim; unticking it is the first half of the repair, the wording the second.
  • The note drops PluginDefinitionSchema and names it as exported from no entrypoint.

⛔ Nothing was pointed at packages/runtime/src/error-envelope.ts (buildApiError / apiErrorResponse), although it is the closest live thing: it is not re-exported from @objectstack/runtime's index, so naming it would repeat exactly the defect this card is about.

(B) The synthetic control leg

UNPUBLISHED_SUBPATH_CONTROL reconstructs the three specifiers line for line as the guide carried them before this repair, alongside a frozen UNPUBLISHED_SUBPATH_SPECIFIERS roster the block is held equal to by a battery.

It is synthetic for the reason FIRING_CONTROL is: a control that IS the live document disarms itself the moment the document is repaired, and the fourth instance in the next guide would be just as green. It carries no elision marker and no syntax error, both load-bearing — a marker would let the disqualified exclusion reading skip it, and a syntax error would put it in pass 1's unparseable set where the three TS2307s it exists to produce are never reported. That second point is not theoretical: it is precisely what hides line 28 from the corpus, so the synthetic leg measures a specifier the live document never did.

The refusal-list question, and its cost

Decision: the leg joins controlProblems(). When it misbehaves, the whole census refuses.

  • What it guards is the tolerance rule, not the corpus. Widen classifyDiagnostic until an @objectstack/* TS2307 is forgiven and every unresolvable documented import in the repository goes quiet at once. FIRING_CONTROL is a TS2341 and cannot notice; before this PR the census had no standing control for the unpublished-subpath family — the family this card is an instance of.
  • Self-test-only was the alternative, and it leaves that hole open: the census would keep printing numbers nobody could trust.
  • The cost, stated plainly: if one of the three subpaths is ever genuinely published, the leg stops producing TS2307 for it and every census refuses until someone edits the fixture. That is the same exposure FIRING_CONTROL already carries — make ObjectKernel.logger public and it stops producing TS2341 — and it is answered the same way: the refusal text names the remedy (repoint at a subpath still in no exports entry, ⛔ never delete the leg, which takes the other two guards with it) instead of leaving a stale fixture to be diagnosed.

Five batteries register against it and SELF_TEST_BATTERY_FLOOR rises 30 → 35. Two of the five drive controlProblems() directly, and each first asserts a healthy control trio reports zero problems before asserting a broken one reports some — otherwise a controlProblems that always complained would pass.

Evidence

LIT — the leg fires, proven by ablation. Each ablation asserted the tree equalled HEAD first, proved the mutation reached disk by occurrence count and changed blob hash, restored from HEAD under a trap, and proved restoration by git diff HEAD being empty and the blob matching 12ec6b3955b4e6fdff880705eee5a67c9b457bf6.

Ablation --self-test census
widen tolerance, forgiven: false to true on the @objectstack/ branch exit 1, 2 failures exit 1 — refuses, naming all three specifiers as forgiven=true
drop the five roster rows exit 1, 6 failures, floor reports "declares 30 batteries, below the pinned 35" not exercised
drop it from controlUnits() not exercised exit 1 — "UNPUBLISHED_SUBPATH_CONTROL did not extract to a block"

DARK — nothing else moved. --self-test 30 cases / 30 batteries before, 35 / 35 after, exit 0; a roster diff against the base proves 0 of the original 30 batteries were dropped. FIRING_CONTROL is byte-identical in behaviour across both censuses: "reports 5 diagnostic(s) including TS2341 at block line 13", elision marker still present. GREEN_CONTROL compiles clean in both.

Census, before and after (full build first — both readings share one build, so only the document differs):

before after
unpublished-subpath family 8 diagnostics in 7 blocks 6 diagnostics in 6 blocks
this file's share of that 2 (@objectstack/core/errors, @objectstack/core/plugin, both in the block at line 72) 0
V3_MIGRATION_GUIDE.md 7 blocks / 5 RAW / 5 TOLERANT 7 blocks / 5 RAW / 5 TOLERANT
hand-written stratum 282 blocks / 195 RAW / 76 TOLERANT unchanged

The dispatch expected 5 TOLERANT to fall. It did not, and that is the correct outcome — measured per block rather than asserted. The repaired block went from 11 diagnostics to 3: both TS2307 gone, and all five TS2300 "duplicate identifier" gone too, since those were an artefact of the ❌ and ✅ lines importing the same names into one block. What remains is TS2724 + TS2305 x2 — "no exported member" against @objectstack/spec/api and @objectstack/spec/kernel — which is the block correctly reporting that it depicts symbols v3.0 removed. Every one of this file's five failing blocks is a ❌ example, and failing is what a ❌ example does.

The remaining 6 in the family are all packages/spec/CHANGELOG.md naming @objectstack/spec/cloud — release-owned history, out of scope here.

Gates. Derived with scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack from the merge base, re-derived after git fetch origin main and identical: 65 families, 65 run, 65 exit 0, reconciled back through --ran with exit codes recorded (a derived zero, not a claimed one). pnpm --filter @objectstack/spec typecheck exit 0.

Lint. Not narrowed — the repo-wide scan fitted in budget: eslint . --no-inline-config --format json linted 6848 files with 0 messages, exit 0, at 8ac750cfe9. (Type-aware linting is not enabled in eslint.config.mjs, so the narrowing argument was available and turned out to be unnecessary.)

Publish surface. V3_MIGRATION_GUIDE.md is matched by 0 files[] entries in any package manifest (positive control: README.md is in @objectstack/spec's files[]), and scripts/ belongs to the private root package. So nothing this diff touches publishes, which is the skip-changeset criterion, and lint.yml names this exact case in its own prose: "this PR edits a CI-internal script is the textbook skip-changeset case — such a PR releases nothing". ⚠️ The Clause-②: yes (widening) line above is the dispatching seat's mechanical-floor declaration, carried verbatim as instructed; it is a routing declaration, not this PR's measurement, and the measurement above reads the other way. Flagged for the seat's in-seat re-review rather than changed here.

Acceptance notes

Observed while measuring, ⛔ not filed and ⛔ not repaired here:

⛔ packages/spec/package.json and packages/core/package.json were not opened for editing. Route (2) was never needed: it is impossible for two of the three specifiers, since a module that does not exist cannot be declared in an exports map.


Generated by Claude Code

…markdown TS census

The census has no standing control for the `unpublished-subpath` family.
FIRING_CONTROL is a TS2341, so widening `classifyDiagnostic` until a
`@objectstack/*` TS2307 is forgiven would silence every unresolvable
documented import in the repository with nothing able to notice.

UNPUBLISHED_SUBPATH_CONTROL reconstructs, line for line, the three
specifiers `packages/spec/V3_MIGRATION_GUIDE.md` carried before its repair.
It is synthetic for the same reason FIRING_CONTROL is: a control that IS the
live document disarms itself the moment the document is fixed.

It joins the census refusal list, so a widened tolerance rule stops the
census rather than quietly shrinking its numbers. Five self-test batteries
register against it and SELF_TEST_BATTERY_FLOOR rises 30 -> 35.

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

Section 2 told a reader to import `createErrorResponse`,
`getHttpStatusForCategory` and `definePlugin` from `@objectstack/core/errors`
and `@objectstack/core/plugin`, and its checklist ticked both as done.

Measured: `466f32ea22` DELETED all three from spec -- 25 removed lines, zero
added, and it created neither destination. `@objectstack/core` publishes
exactly `.` and `./logger`, and the three symbols appear in no `.ts`/`.tsx`
file in the repository (bright control: `defineStack` reads 368 files). The
guide was written one day before that commit and predicted a move that was
never made.

So section 2 now states the removal without a destination, the two checklist
items are unticked, and the note drops `PluginDefinitionSchema`, which is
exported from no entrypoint either. The v2.x blocks keep their unresolvable
specifiers on purpose: they are what a reader is being told to delete, and
repointing them at the entrypoints that DO resolve would make the guide claim
the current import was the removed one.

Claude-Session: https://claude.ai/code/session_01JbZnqu8bt6YqfJsr9vaFb3
Co-authored-by: Claude <noreply@anthropic.com>
@os-bill os-bill added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 18, 2026 — with Claude
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 1 changed file(s) yielded no anchor (packages/spec/V3_MIGRATION_GUIDE.md), 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
  • 1 changed file(s) yielded no anchor (packages/spec/V3_MIGRATION_GUIDE.md) — 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.

Coarse fallback — 136 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 96fdac21ee7182f52c1326fc1f29166231b3a8e8 → packageMentionDocs.

os-bill commented Sep 18, 2026

Copy link
Copy Markdown
Collaborator Author

Contract review

Served-tier: 82/82 CONTRACT_REVIEW_TIER
Head-sha: 8ac750cfe9620a837e29adc8f2d5727b890b5d51

Reviewed against merge-base 62b114f8b8 (PR branch claude/issue-18753-guide-unpublished-subpaths) with every rule read from origin/main at 96fdac21ee and every tree reading taken there or at the PR head; nothing was read from the working tree. Diff face: 2 files, +230 / -19, exactly the two files the card claim declared.

Evidence discipline. The card's comment fetch returned the dispatching seat's claim (5723792315), its self-correction (5723878949) and its review reply (5724220495); all three are seat conclusions and are disregarded here. The os-dev-report (5724178265) was used only as the source of the two open_questions, which the PR body restates verbatim. The triage comment (5719698425, triage seat) is treated as the standing ruling that the card must become a fixture of the census instrument, which is what puts half (B) in scope. Every number below is my own measurement.

① Derived judgments

  1. packages/spec/V3_MIGRATION_GUIDE.md is not a published surface. @objectstack/spec files[] on origin/main is dist, json-schema, liveness, prompts, llms.txt, README.md, src/**/*.zod.ts, CHANGELOG.md, api-surface, spec-changes.json; evaluated against every package.json in the tree (83), the guide matches 0 files[] entries. Positive control on the same evaluator: packages/spec/README.md reads true and packages/spec/dist/index.js reads true. No *.zod.ts, ledger, registry or exports map is touched. Judged: no accept set moves; correct.

  2. The document edit removes three claims of a WIDER published surface than exists and adds no claim of anything unpublished. Measured on origin/main: @objectstack/core exports has exactly . and ./logger; packages/spec/package.json has no ./hub entry and packages/spec/src/hub does not exist; Hub does not appear in packages/spec/src/index.ts; PluginDefinitionSchema appears in 0 of the api-surface/*.json files (only in benchmark.bench.ts:120 behind as any); 466f32ea22 (2026-02-12) removed createErrorResponse, getHttpStatusForCategory (api/errors.zod.ts) and definePlugin (kernel/plugin.zod.ts) and added no file under packages/core/src named errors or plugin, then or since (git log --all over those paths is empty); the guide was created by 097c4d8c0e on 2026-02-11. Every sentence the edit now makes was checked against the tree: ErrorResponseSchema is exported (errors.zod.ts:489, re-exported by api/index.ts:42, listed at api-surface/api.json:364); Plugin with init / start? / destroy? is at core/src/types.ts:155-215 and reaches @objectstack/core through index.ts:21 export * from './types.js'; TenantSchema (system/tenant.zod.ts:178) and PluginRegistryEntrySchema (kernel/plugin-registry.zod.ts:147) exist; the five Full Mapping files exist; the checklist's surviving names (PresenceStatus, RealtimeRecordAction, RateLimitConfigSchema, EventBusConfigSchema, EventSchema, EventPriority) are all in api-surface/*.json and the three removed aliases are not; action.zod.ts:972 declares locations, not location; no inbound anchor names the renamed section "Runtime Logic Extraction" anywhere in the tree. "The three symbols themselves exist nowhere in the codebase" is true of code identifiers: a repo-wide grep over .ts/.tsx/.js/.mjs/.json returns only one prose string (.claude/workflows/docs-accuracy-audit.js:228, which itself says there is no definePlugin), so the grep was live; the names also survive as prose in CHANGELOG.md:2289-2290, packages/spec/DEVELOPMENT_PLAN.md:463-465 and ZOD_SCHEMA_AUDIT_REPORT.md:37,439, which are outside this PR's fence. Judged: this is a correction of documentation toward the published contract, not a narrowing of any published contract, because the subpaths it stops promising were never in any exports map.

  3. scripts/measure-markdown-ts-blocks.mjs gains two module-level exports (UNPUBLISHED_SUBPATH_SPECIFIERS, UNPUBLISHED_SUBPATH_CONTROL). This is not public surface. The root package.json is private: true with no files[]; npm files[] cannot reach above a package's own directory, so no published package can carry scripts/; git grep measure-markdown-ts-blocks on origin/main returns only the file itself (no importer, no test, no workflow, no package.json script, nothing under skills/**). scripts/pm/check-widening-tells.mjs --declaration no on the PR diff exits 0 with both files NOT MEASURED ("no declared surface covers it"); the T3 tell (a new row in a published entry point's export listing) is defined over packages/spec/api-surface/*.json, which is untouched. The mechanical floor's sentence "a new exported symbol is always yes" (contract-review.md) is scoped by SKILL.md:515 ("Clause ② refers only to the published contract surface") and by the tell implementation; the seat's conservative yes was permitted and is not a fault (spec.md:20), but the reviewed direction is not a widening.

  4. The census gains a third control on the refusal list. This changes the behaviour of a repo-internal instrument, which no consumer can observe; it is not a contract surface. Behaviour verified rather than read: --self-test at head passes 35 cases / 35 batteries (exit 0); at base 30 / 30. A programmatic roster diff of SELF_TEST_BATTERIES base vs head: 0 of the original 30 dropped, 5 added, weight sum 30 to 35, SELF_TEST_BATTERY_FLOOR 30 to 35 (:977). Ablation on a scratch copy (the @objectstack/ branch of classifyDiagnostic flipped to forgiven: true, 1 occurrence): --self-test exit 1 with 2 failures; --controls-only exit 1, refusing and naming all three specifiers as forgiven=true plus the outright-forgiven line. That ablated census run is also the LIT reading for the real compile path: the three TS2307s were produced and classified through extractBlocks and tsc in this container with no dist/ built, because the paths map is generated from each package's exports map and an unlisted subpath is TS2307 regardless. The unablated --controls-only refuses only on GREEN_CONTROL (unbuilt workspace, a precondition), and its refusal text names no UNPUBLISHED_SUBPATH problem. The fixture is line-for-line the three specifiers the base guide carried at lines 28, 77 and 78.

  5. Arm. Under SKILL.md:477 ("does this card widen the accept set or expand the public surface") and spec.md:19-20, this diff widens no accept set and expands no public surface, and it breaks nothing published, so no (narrowing) would also be wrong. The declaration should carry no with no parenthetical. The standing yes (widening) on both carriers is overturned by this review; per spec.md:20 and contract-review.md that overturn is by design and not a seat fault. A re-declaration to no would clear the C5 tell row (measured above: NOT MEASURED, exit 0).

② Semver level

None. Nothing this diff touches is delivered to any consumer (item ① 1 and 3). The PR carries skip-changeset, the diff holds no .changeset/*.md, and the Check Changeset job defines that label as "this PR declares no release of its own"; lint.yml:3266-3272 names a CI-internal script edit as the textbook case. Precedent in the same shape: PR #18712 (packages/core/PHASE2_IMPLEMENTATION.md, outside files[]) merged 2026-09-17 with skip-changeset, Clause-②: no and no changeset. The lane default "text face changeset is always patch" (spec.md:15) presumes text that ships in the package (describe, JSDoc, error prose reach dist/); a root markdown outside files[] ships nothing, and a patch on the fixed group would version every package for a change no consumer receives. Consistent. One coherence note, not a defect: scripts/check-changeset-no-major.mjs reads a PR-level Clause-②: yes as implying at least one moved package graded minor or above, so yes (widening) beside "releases nothing" is self-contradictory in writing and is masked only because skip-changeset exempts that job wholesale; carrying no (① 5) makes the record coherent.

③ Boundary flags

Flag 1, open question 1 (line 28 keeps @objectstack/spec/hub in the v2.x block; options A keep / B repoint to /system / C de-fence to prose). Answer: A, as shipped. B would make the v2.x and v3.0 blocks identical and have the guide assert that the currently supported import is the one v3.0 removed, which is a new falsehood. C removes an input to a measurement instead of repairing anything. Under A the block is a depiction of removed code under an explicit do-not-copy comment; it makes no contract claim, and the { ... } at line 30 is a TS1109 syntax error, so the block never reaches type-check and produces no TS2307 today (the card's "three measured TS2307" was two, core/errors and core/plugin). Answered, not escalated.

Flag 2, open question 2 (which arm enters the queue). Answer: no, per ① 5. The seat records the reviewed arm on the card in the same stroke that strips the carriers; nothing in the diff needs to change.

Flag 3, the refusal-list placement and its stated cost. Agreed, with the cost measured rather than assumed: on origin/main neither the census nor its --self-test is invoked by any workflow or package.json script (0 hits in .github/, root package.json, packages/*/package.json). scripts/check-self-test-wired.mjs defines its population as "every script CI runs that ships a --self-test", so this script is outside that population and the dev's "covered by check:self-test-wired, green" is true only vacuously. Consequently the day one of the three subpaths is genuinely published, the refusal costs one manual census run and prints its own remedy; it blocks no CI. Such a publication is itself an exports-map edit and therefore a Clause-②: yes PR whose own contract review is where the fixture repoint gets caught. The gap that matters is not this PR's: the census and its batteries execute only by hand until #18715's wiring decision, and that caveat belongs beside #18715's number. Answered, escalated to the seat only as an input to #18715.

Flag 4, "every sentence the document now makes is true today". Verified for every edited sentence (① 2). One untouched sentence becomes false by this edit: the footer Last Updated: 2026-02-11 (the header's Target Release: Q2 2026 was already stale and is noted by the PR). Not a contract matter, does not move the verdict; a one-token follow-up for the seat to fold into this file's next touch.

Flag 5, the dev's noted-not-filed items (family totals are a lower bound because a syntax error hides a block from pass 2; migration guides sit in the handwritten stratum whose contract does not fit a before/after document; benchmark.bench.ts:120 reaches an unexported schema through as any; DEVELOPMENT_PLAN.md:463-465, ZOD_SCHEMA_AUDIT_REPORT.md and root CHANGELOG.md:2289-2290 restate the never-performed relocation). None touches a published accept set or surface and none is in this PR's fence. Escalated to the seat as filing items: the first two to #18715, the last two as new cards; not blocking.

Flag 6, PR checks. At my last poll (2026-09-18 about 02:37Z) 0 check runs had failed; 6 were still in progress (Test Core 1/6, 3/6, 5/6, 6/6; Type Check workspace; Lint and Repo Gates). All-green is the seat's own pre-enqueue read at enqueue time, not this record's. --pair 18866 reads: derivation closing-keyword (Fixes #18753), head 8ac750cfe9, claim and PR body both yes (widening), needs:contract-review on both card and PR.

Implemented-by: claude/issue-18753-guide-unpublished-subpaths
Reviewed-by: session_01JbZnqu8bt6YqfJsr9vaFb3

VERDICT: PASS


Generated by Claude Code

os-bill commented Sep 18, 2026

Copy link
Copy Markdown
Collaborator Author

席位采信记录 —— 达档契约复核 PASS,双载体已清

⏱️ 2026-09-18T02:43Z。

复核记录 本 PR 评论 5724363952
所判 head 8ac750cfe9620a837e29adc8f2d5727b890b5d51
采信时 head ⏱️ 2026-09-18T02:43Z 现读 同值,⇒ head 未动
档位证据 82/82 —— 本席对该隔离子代理自身 transcript 逐 type:"assistant" 行读 harness 的 message.model,82 条全等于 CONTRACT_REVIEW_TIER(⏱️ 2026-09-18T02:43Z 自 origin/main:scripts/pm/dispatch-gates.mjs:11899 实时取值),其他模型 0 条。⛔ get_session 未调用 —— 它在 mode:subagent 里量的是派发会话,在这里无效
采信方式 逐字。本席对复核者自写的记录文件只做两处替换,并用 unified diff 证明只有这两行不同:Served-tier: 前缀加 82/82 的盖章控制、Reviewed-by: 由占位改成本席 session。⛔ 无改写、⛔ 无润色
载体 卡 #18753 与本 PR 两侧的 needs:contract-review 同轮剥除,各自四步写入并回读
剥后机读 PM_SWEEP_REPO=… check-clause2-carriers --pair 18866 ⇒ exit 0;其 C6-RECORD 行自行读到本记录、确认它命名了该 head 并带 Reviewed-by:,且读到了 82/82 的盖章控制,所以「strip stands on C7 as well」

⭐ 复核把本席的申报翻了,而那是设计之内

本席按机械地板申报 Clause-②: yes (widening)。复核的裁定是 no,不带括号臂 —— 理由是它测出既不放宽接受集也不扩大公开面,而也不是收窄(那三个子路径本来就不在任何 exports map 里,所以文档停止承诺它们并没有拉回任何东西)。

⇒ 章程 references/lanes/spec.md:20 写得很直白:「收窄不触发条款②,但按 yes 申报恒不是错误」。⇒ ⛔ 这不是返工、⛔ 不是 dev 的错、⛔ 也不是一次失败的申报 —— 申报是临时路由,而这次复核就是它该被结掉的地方。

⛔ 本席不回头改那条认领评论:重写一条已发出的声明会把它变成一份没人能对账的历史。⇒ 被翻的臂记在这里。⚠️ 机械面无需跟着动:本 PR 带 skip-changeset 且 diff 里没有 changeset,而 check-changeset-no-major 读的正是 changeset 里那一行;PR 正文那一行按机读自述是「stated as an INPUT only」。

本席另外自验过的三项(⛔ 不继承复核者的数字)

  • ⏱️ 2026-09-18T02:43Z head 未动:8ac750cfe9…,现读与所判同值。
  • 采信副本与复核者原文的差异:恰两行,已用 unified diff 打出。
  • 档位:82/82,逐请求读的是子代理自己的 transcript,⛔ 不是本席会话。

⚠️ 复核点名要本席接手的事项,逐条记下(⛔ 不在本 PR 处理)

  1. ③ Flag 3 —— 该普查与其 --self-test 在 origin/main 上不被任何 workflow 或 package.json script 调用(0 命中),所以「被 check:self-test-wired 覆盖」只是空洞地成立。⇒ 这条是 [finding] packages/core/PHASE2_IMPLEMENTATION.md's fenced TypeScript blocks are in no tsc program — a block that has NEVER compiled survived two sweeps, and the gate #15931 proposed would not have caught it #18715 接线信该带的注脚,由本席转达。
  2. ③ Flag 4 —— 该文档页脚 Last Updated: 2026-02-11 被本次编辑弄成了假话。⛔ 不动本 PR,由本席在该文件下次被碰时并入。
  3. ③ Flag 5 —— dev 的两条 to file 与两条 noted:前两条归 [finding] packages/core/PHASE2_IMPLEMENTATION.md's fenced TypeScript blocks are in no tsc program — a block that has NEVER compiled survived two sweeps, and the gate #15931 proposed would not have caught it #18715,DEVELOPMENT_PLAN.md:463-465 / ZOD_SCHEMA_AUDIT_REPORT.md / 根 CHANGELOG.md:2289-2290 那批另立卡。均由本席立,⛔ 不由 dev。

⏱️ 2026-09-18T02:43Z · domain:spec seat 2 · 座位贴 #18549


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/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants