Skip to content

Commit 9c93ce6

Browse files
test(spec): the six reader-bound needles move with their readers, naming each cited decision in words instead of a tracker number (stage 31) (#22511)
Part of #20749 Clause-②: no Stage 31 of this card, the needles stage: answer A in the seat's ACCEPT `6074213330`, under the claim `6084058576`. Six test strings carried a tracker id that a reader matches. Each one moves with its reader in this PR, and the match stays exactly as strong: the new words sit in the same reader places the old id did. Three class (e) strings that regrew since stage 30 drop a number: two titles that already explain it, and one ledger `why:` value that keeps its ruling record id (the claim amendment in ACCEPT `6085085283`). Text only: no schema shape, key, `.describe()` string or behaviour moves. ## Census, re-taken at the base Stage 28's `census28.cjs`, byte-identical (md5 `31d8488b…`), calibrated first against nine published readings, all reproduced exactly: 128/130, 191/200 and 73/76 (stages 27 to 28), 73/76 and 16/17 (stage 29's base and head), 17/18 and 10/10 (stage 30's base and head), 17/18 at `e75dceddd` and 10/10 at stage 30's landing `961d365f1`. At the base `e148ca984`: **13 messages / 13 ids in 10 files** (titles 2/2, other 11/11). - the 6 reader-bound strings (moved here); - the 4 CSS hex colours that stage 21's ACCEPT kept (`ui/dashboard-chart-structure-refusal.test.ts:94` x2, `ui/dashboard.test.ts:124` x2); - 3 regrown since stage 30's landing: - 2 titles from PR 22315 (`automation/end-node-outcome.test.ts:67`, `automation/io-node-config.test.ts:472`), rewritten here; - 1 ledger `why:` value from PR 22425 (`system/metadata-form-zod-reconciliation.test.ts:497`). The claim amendment in ACCEPT `6085085283` admitted it, and the patch round rewrote it: `#22211 A` becomes `letter A`, and the ruling record id it cites stays. At the head `a766d439f`: **4 / 4 in 2 files**, the 4 hex colours only, which is the card's end state. Titles 0/0. (`fbec38c32`, before the patch round, read 5 / 5 in 3 files.) No file is deferred. At 15:45Z there were 11 open PRs (418 file rows, each list complete against the PR's `changed_files`). None touches any of the 14 files in this diff, or the 3 files that still carry an id. The lit control, `ui/component.zod.ts`, is found in 2 of them (22421 and 22496). ## The six pairs Each needle and every reader place it matched move together, one span per line. "Places" are the reader lines where the needle matched inside the exact text the test reads. | pair | test string | reader | needle, base → head | reader places, base → head | |:--|:--|:--|:--|:--| | P1 | `ai/build-progress.test.ts:236` | `ai/build-progress.zod.ts`, the whole file (`SOURCE`) | `cloud#2172` → `the cloud build-progress card` | 8, 27, 77, 84, 108, 123, 177 → the same seven | | P2 | `ai/build-progress.test.ts:237` | the same file | `objectui#7388 block 2` → `block 2 of the objectui build-panel card` | 85 → 85 | | P3 | `contracts/approval-service.test.ts:274` | the `continueRestoredRun` docblock in `contracts/approval-service.ts` | `#16495` → `the automation-service contract` | 999 → 999 | | P4 | `ui/notification.test.ts:123`, plus its own anti-vacuity regex at `:134` | the tombstone note label in `ui/notification.zod.ts` | `// [#4610]` → `// [dual-source removal]` (and the regex `^\[#4610\]` → `^\[dual-source removal\]`) | 94 → 94 | | P5 | `ui/strictness-batch14.test.ts:395` | `ui/notification.zod.ts` and `ui/sharing.zod.ts`, each whole | `#5015` → `no-door retirement` | 48, 103 and 24, 114 → the same | | P6 | `ui/component-props-unknown-members.pin.test.ts:322` (the opaque line's `ruling`) | the assertion at `:417` | `#21704` → `the five members the last typing stage stopped on` (the regex follows) | the one `ruling` value → the same | What each number meant, now said in words: - **P1, P2.** The cloud card is the one that ruled the build-progress phase vocabulary in and owns where the emitter sits; the docblock says both. Block 2 of the objectui card is the piece that admits `verify` in `extractBuildProgress`, the consumer's strict parse. - **P3.** The sibling this verb copies is `IAutomationService.cancelRun` / `restoreConsumedSuspension`, as the automation-service contract declared them. - **P4.** The `./ui` `Notification` / `NotificationConfig` wrappers were removed as dual-source, and the note's label now says so. - **P5.** `NotificationActionSchema` and `EmbedConfigSchema` were retired because they had no authoring door (ADR-0049 enforce-or-remove). Both modules record that retirement in the same four places as before. - **P6.** The decision card is the one on the five `ComponentPropsMap` members the last typing stage stopped on. The record id `5979239990` stays. **Readers beyond the claim's "about" lines.** The claim lists `build-progress.zod.ts` about `:8`, `:27`, `:85` and `sharing.zod.ts` about `:24`. The old needles also matched `build-progress.zod.ts` 77, 84, 108, 123 and 177, and `sharing.zod.ts` 114. Leaving any of those would have made the new needle match fewer places than the old one, which is a stronger test, not the same one. So they move too, inside the two files the claim admits. Nothing outside the claim's files moves except the two generated pages, both written by `gen:docs` only: `ai/build-progress.mdx`, as the claim names, and `ui/sharing.mdx`, which renders the `sharing.zod.ts` module docblock. **Shipped text that moved.** This is listed for the review. - `build-progress.zod.ts`: the module docblock (lines 8, 27, 77, 84, 85), the `BUILD_PROGRESS_PHASES` docblock (108, 123) and the `hop` field docblock (177). - `approval-service.ts`: the `continueRestoredRun` docblock (999), which `dist/contracts/index.d.ts` carries. - `notification.zod.ts`: comment lines 48, 94 and 103. - `sharing.zod.ts`: module docblock line 24 and comment line 114. - The `ai/build-progress` reference page's `description:` front matter now ends with "(the cloud build-progress card, ruling A)". `page-description.ts` strips only a parenthetical that holds a tracker or ADR id, so the words now stay in the description. No `.describe()` string moves. **Ids that stay on those lines on purpose.** These are comment citations that no test matches, so they are not needles: `#15389` and decision batch `#106` beside P3, and the other ids in the same docblocks. ## Class (e) regrowth `(#22110)` is dropped from the two titles. Each already states that card's decision: a flow text slot reads `{{ }}` holes and refuses a single-brace token. Read with the card's 17 comments and its landing record. There is no reader: a `git grep -F` of each old title and of each distinctive head finds only the literal itself. The lit control `composeStacks` is found in `stack.zod.ts`; the dark control exits 1. ## Text only, proven - **Byte level, all 13 edited files.** `subst31.cjs` applies the plan to the base text and compares the result with the head. The plan was written at 15:48:21Z, before any edit: 31 spans, each required to occur exactly once on its base line. The result is 13/13 SAME, line counts unchanged, including both generated pages and the `description:` line exactly as predicted. Every old span carries an id, and no new span carries `#` plus digits. - **Controls, 9/9 as predicted.** One character in an unplanned comment, an id appended inside a new span, a reverted span, an inserted line, trailing whitespace, a generated page edited off-plan, a plan with an absent span and a plan with an id in a new span all go red. The unmodified copy reads SAME. - **Stage 28's `textonly28.cjs`, byte-identical**, on the 7 test files: 5 SAME (2 title, 5 declared changes). `notification.test.ts` and the component-props pin stop at their regex reader lines (134, 417), because that instrument masks string tokens, not regex literals. With only those two lines put back to base, both read SAME (1 declared change each). - **Per-file test counts and status sequences**, base vs head, 7 files, `--project local --project repo`, JSON reporter: 193 / 193, identical in 7/7. Two fullNames change (the two titles) and 0 differ from the plan. There are 0 duplicate fullNames on either side. Names carrying `#` plus digits: 2 at base, 0 at head. ## Same strength, proven **Places.** `sites31.cjs` finds every place each needle matches, inside the exact text its test reads. The old needles' places at base equal the new needles' places at head, pair by pair (the table above). Each new needle has 0 places at base, and each old needle has 0 at head. **Mutations.** Each leg goes through `scripts/ablation-replace.mjs`, which requires the anchor count, restores to `HEAD` and proves blob == HEAD after every leg. The test reads the source with `readFileSync` from `src`, so no build sits between the mutation and the test. The predictions were written at 15:55:52Z, before the first run. The same matrix ran at the head and, with the worktree detached at the base, at the base: | drift | base | head | |:--|:--|:--| | P1, every place | red | red | | P1, one place (84) of seven | green | green | | P2 | red | red | | P3 | red | red | | P4, the label (the anti-vacuity test and 4 more go red) | red | red | | P5, both places in `notification.zod.ts` | red | red | | P5, both places in `sharing.zod.ts` | red | red | | P5, one place (48) of two | green | green | | P6, the assertion text | red | red | | P6, the `ruling` value | red | red | - **Result:** 10/10 at the head and 10/10 at the base, as predicted. Every red fails on the needle assertion itself. - **The null legs:** the first P2 leg at the head never ran. `ablation-replace` refused it, because its replacement was a substring of the anchor. The base P2 leg as first written had the same defect and was not run. Both were re-anchored with a replacement that is not a substring, and that amendment was written down before the re-run, with the prediction unchanged. - **Restore:** after the matrix the worktree is back on the branch at `fbec38c32`, and `git status` is clean. ## Verification at `fbec38c32` All heavy runs went through `scripts/pm/os-verify-lock.sh`, slot `dev-20749-s31`. Each exit was written to a file or read from the lock's VERDICT line. - **Workspace build:** `pnpm turbo run build --concurrency=2` over `./packages/*` and `./packages/*/*` gives 71/71 tasks, exit 0. It is the prerequisite for the gates that read `dist`. - **Spec typecheck:** exit 0, and `check:test-typecheck` holds 52 files / 246 errors / 135 pinned signatures, unchanged. `tsc --listFilesOnly -p tsconfig.test.json` holds all 7 edited test files (617 test files in the program). - **Spec unit tier, `--project local`, in full:** 630 files passed, 18798 tests passed and 1 todo, exit 0. - **Spec repo tier, `--project repo`, in full:** 54 files passed, 915 tests passed, exit 0. - **`check:generated`:** all 15 generated artifacts are up to date. Before `gen:docs` ran, it named only `content/docs/references/**` as stale. - **Derived gates:** `dispatch-gates --commands` derives 109 commands from the merge base `e148ca984` (14 paths). All 109 exit 0, and `--ran` reconciles 109 derived, 109 run, 0 NOT-MEASURED, a derived zero. - **Roster families:** the 6 whose roster sits in a directory this diff touches also exit 0 (`check-changeset-fixed`, `check:meta-url-spelling`, `check:spec-changes`, `check:authz-resolver`, `check:error-code-casing`, `check:filter-alias-parity`). - **ESLint, a proven narrowing:** `--no-inline-config` over the 11 changed `.ts` files gives 0 errors and 0 warnings. ESLint's own config reports 11 configured, 0 ignored and 0 with type-aware parser options, so the diff cannot move a verdict on an untouched file. The 3 Markdown files are outside ESLint's config. - **Control bytes:** the scan over the 14 changed files finds 0. `check:nul-bytes` (in the derived set) exits 0. ## Patch round at `a766d439f` (open question answered A, ACCEPT `6085085283`) One span on one line, `system/metadata-form-zod-reconciliation.test.ts:497`: `(ruling record 6070963704, #22211 A):` becomes `(ruling record 6070963704, letter A):`. The commit is `a766d439f`, on top of `fbec38c32`, with no merge of `main` (the PR reported no conflict, and `git merge-tree` onto `origin/main` `446c8b2a6` is clean). - **Text only, byte level:** the one-span plan, written at 16:36:23Z before the edit, applied to `fbec38c32`, equals the head: SAME, 1616 lines on both sides. A control that re-adds an id inside the span reads DIFFERENT. Stage 28's `textonly28.cjs` with line 497 declared reads SAME (552 string tokens, 1 changed, declared); without the declaration it refuses the line, as it should. - **No reader:** a `git grep -F` of the old text, and of the value's opening words, finds only the literal itself. No assertion reads the text, only its length (more than 20). - **That file's tests:** 76 / 76 passed at base and head, under `--project local --project repo`. The status sequence is identical and no fullName changed. - **Census:** `census28.cjs` at the head reads **4 / 4 in 2 files**, the 4 named hex colours. The same instrument reads 5 / 5 at `fbec38c32` and 13 / 13 at the base `e148ca984`. - **Full runs at `a766d439f`:** - workspace build: 71/71; - spec typecheck: exit 0, with `check:test-typecheck` at 52 / 246 / 135 held, and the patched file is in the `tsconfig.test.json` program; - spec `--project local`: 630 files, 18798 passed, 1 todo; - spec `--project repo`: 54 files, 915 passed; - `check:generated`: all 15 up to date. - **Gates:** `dispatch-gates --commands` derives the same 109 commands, all exit 0, and `--ran` reads 109 / 109 / 0 NOT-MEASURED. The 6 directory-sharing roster families also exit 0. ESLint over the file: 0 / 0; it is configured, not ignored and not type-aware. - **CI on `a766d439f`** at 17:05Z: 33 success, 2 skipped, none red. On `fbec38c32`, the push of `a766d439f` cancelled 14 jobs, and the aggregate `TypeScript Type Check` job failed at its "Verify every type-check lane succeeded" step because its lanes were cancelled. That red is on the superseded head only. ## Changeset `@objectstack/spec` `patch`: shipped text moved. The package's `files` ships `src/**/*.zod.ts`, and the `continueRestoredRun` docblock is in `dist/contracts/index.d.ts`. `npm pack --dry-run`: 2069 files, 0 `*.test.ts`. The three edited `.zod.ts` sources ship, and `dist/contracts/index.d.ts` carries the new docblock words (the old ones are in 0 `dist` files). `Clause-②: no`: no accept-set change. ## Acceptance notes - **Kept, by ruling:** the 4 CSS hex colours (stage 21's ACCEPT). - **The regrown ledger `why:` value** (`system/metadata-form-zod-reconciliation.test.ts:497`, added by PR 22425 after stage 30) was admitted by the claim amendment and rewritten in the patch round. The census now reads only the 4 hex colours. - **Comment citations** in the four reader files that no test matches stay as they are (for example `cloud#1838`, `objectui#7388` in other sentences, `#4535`, `#5781`, `#15389`). - **An observation, not filed.** The build-progress liveness watch names the objectui card as one of two carriers. That card was closed on 2026-09-27 with its block 2 handed off and "not tracked here". The objectui changeset this repo now carries (`.changeset/console-f0268ad78485.md`) says the chat panel reads cloud's verification loop. The docblock's carrier sentence may be stale. This stage keeps what it says and only replaces the id. - **A wide reading, for the record.** Counting any `#` plus digits, 4 titles carry `PD #12` / `batch #58` (`conversions/conversions.test.ts`, `system/i18n-resolver.test.ts`). These are two-digit labels below the census id pattern, the same at base and head, and outside the census population. --- _Generated by [Claude Code](https://claude.ai/code/session_01DhTqaEHqPVSVnAkjG3jywn)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 4e9fe9f commit 9c93ce6

15 files changed

Lines changed: 48 additions & 32 deletions
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
---
2+
'@objectstack/spec': patch
3+
---
4+
5+
Source comments that cited a tracker number now say in words which decision they mean, and the pin tests that read those comments match the new words
6+
7+
Clause-②: no
8+
9+
The package ships its `src/**/*.zod.ts` sources, and `dist` carries the member docblocks. Four of those texts named a decision only by its tracker number. Each now names the decision in words. The pin test that reads each text matches the new words, at the places the old number stood:
10+
11+
- `ai/build-progress.zod.ts`: the cloud card that ruled the build-progress phase vocabulary in, and that owns where the emitter sits, is now "the cloud build-progress card" in all seven places. The consumer's strict-parse carrier is "block 2 of the objectui build-panel card". The `ai/build-progress` reference page is regenerated from the module docblock, so its description now ends with "(the cloud build-progress card, ruling A)".
12+
- `contracts/approval-service.ts`: the `IApprovalService.continueRestoredRun` docblock says the verb is declared "exactly as the automation-service contract declared" `IAutomationService.cancelRun` / `restoreConsumedSuspension`.
13+
- `ui/notification.zod.ts`: the tombstone note for the removed `./ui` `Notification` / `NotificationConfig` wrappers is labelled `[dual-source removal]`. The `NotificationAction` removal is called "the no-door retirement".
14+
- `ui/sharing.zod.ts`: `EmbedConfigSchema` is recorded as removed "at the no-door retirement (ADR-0049 enforce-or-remove)". The `ui/sharing` reference page is regenerated from the module docblock.
15+
16+
Comments and docblocks only. No key, type, default, accepted value, `.describe()` string or export changes.

‎content/docs/references/ai/build-progress.mdx‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
---
22
title: Build Progress schema — AI Protocol reference
33
navTitle: Build Progress
4-
description: "Build-progress PHASE vocabulary for the data-build-progress stream frame."
4+
description: "Build-progress PHASE vocabulary for the data-build-progress stream frame (the cloud build-progress card, ruling A)."
55
---
66

77
{/* ⚠️ AUTO-GENERATED — DO NOT EDIT. Run build-docs.ts to regenerate. Hand-written docs live in the module folders under content/docs/. */}
88

99
Build-progress PHASE vocabulary for the `data-build-progress` stream frame
10-
(cloud#2172 ruling A).
10+
(the cloud build-progress card, ruling A).
1111

1212
## How to read the claims in this module
1313

@@ -26,7 +26,7 @@ therefore carries exactly one of three labels, and none is left bare:
2626
## Producer
2727

2828
The cloud AI-studio **agent loop** — deliberately not the tool it just ran.
29-
**Declared by ruling**: cloud#2172 ruling A owns WHERE in the loop a frame is
29+
**Declared by ruling**: the cloud build-progress card's ruling A owns WHERE in the loop a frame is
3030
emitted; this module declares only what such a frame may SAY.
3131

3232
A build turn applies its change through `apply_blueprint` / `apply_edit` and
@@ -76,15 +76,15 @@ repository reachable from here they have zero emitters and zero readers
7676
(**measured on named reachable sources** — each reading is recorded in the
7777
source beside its surface: on `BUILD_PROGRESS_PHASES` for the phase, and on
7878
the `hop` / `tool` field declarations). They stand on a ruling instead
79-
(**declared by ruling**): cloud#2172 ruled the vocabulary in, and
79+
(**declared by ruling**): the cloud build-progress card ruled the vocabulary in, and
8080
objectui#7388 asked the panel to be able to name the phase. That is a good
8181
reason, and it is not a measurement.
8282

8383
⛔ No gate watches this. The ADR-0049 liveness ledger is rooted in the
8484
metadata-type registry, and `BuildProgressFrame` is not a registered
8585
metadata type, so the liveness job stays green however long these three go
86-
unused. Two named carriers are meant to close it — cloud#2172 for the
87-
emitter, objectui#7388 block 2 for the consumer's strict parse. If neither
86+
unused. Two named carriers are meant to close it — the cloud build-progress card for the
87+
emitter, block 2 of the objectui build-panel card for the consumer's strict parse. If neither
8888
lands, the three become enforce-or-remove candidates with nothing watching
8989
them, and the only thing that notices is a person reading this paragraph.
9090

‎content/docs/references/ui/sharing.mdx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ asymmetry survives as the reason this file reads the way it does:
2424
`@objectstack/metadata-core` re-exports to the server's doors). Both
2525
example apps author it (`app-showcase` `inquiry.view.ts`, `app-crm`
2626
`lead.view.ts`). It is `strictObject` as of #4001 批 14.
27-
- `EmbedConfigSchema` was **REMOVED** at #5015 (ADR-0049 enforce-or-remove) —
27+
- `EmbedConfigSchema` was **REMOVED** at the no-door retirement (ADR-0049 enforce-or-remove) —
2828
see the block below where it stood.
2929

3030
The ledger's classification question is *"who writes this schema's input?"*,

‎packages/spec/src/ai/build-progress.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ describe('module docblock provenance', () => {
233233
}
234234
// The point of the watch: no gate notices, so the paragraph is the notice.
235235
expect(SOURCE).toContain('ADR-0049');
236-
expect(SOURCE).toContain('cloud#2172');
237-
expect(SOURCE).toContain('objectui#7388 block 2');
236+
expect(SOURCE).toContain('the cloud build-progress card');
237+
expect(SOURCE).toContain('block 2 of the objectui build-panel card');
238238
});
239239
});

‎packages/spec/src/ai/build-progress.zod.ts‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { lazySchema } from '../shared/lazy-schema';
55

66
/**
77
* Build-progress PHASE vocabulary for the `data-build-progress` stream frame
8-
* (cloud#2172 ruling A).
8+
* (the cloud build-progress card, ruling A).
99
*
1010
* ## How to read the claims in this module
1111
*
@@ -24,7 +24,7 @@ import { lazySchema } from '../shared/lazy-schema';
2424
* ## Producer
2525
*
2626
* The cloud AI-studio **agent loop** — deliberately not the tool it just ran.
27-
* **Declared by ruling**: cloud#2172 ruling A owns WHERE in the loop a frame is
27+
* **Declared by ruling**: the cloud build-progress card's ruling A owns WHERE in the loop a frame is
2828
* emitted; this module declares only what such a frame may SAY.
2929
*
3030
* A build turn applies its change through `apply_blueprint` / `apply_edit` and
@@ -74,15 +74,15 @@ import { lazySchema } from '../shared/lazy-schema';
7474
* (**measured on named reachable sources** — each reading is recorded in the
7575
* source beside its surface: on `BUILD_PROGRESS_PHASES` for the phase, and on
7676
* the `hop` / `tool` field declarations). They stand on a ruling instead
77-
* (**declared by ruling**): cloud#2172 ruled the vocabulary in, and
77+
* (**declared by ruling**): the cloud build-progress card ruled the vocabulary in, and
7878
* objectui#7388 asked the panel to be able to name the phase. That is a good
7979
* reason, and it is not a measurement.
8080
*
8181
* ⛔ No gate watches this. The ADR-0049 liveness ledger is rooted in the
8282
* metadata-type registry, and `BuildProgressFrame` is not a registered
8383
* metadata type, so the liveness job stays green however long these three go
84-
* unused. Two named carriers are meant to close it — cloud#2172 for the
85-
* emitter, objectui#7388 block 2 for the consumer's strict parse. If neither
84+
* unused. Two named carriers are meant to close it — the cloud build-progress card for the
85+
* emitter, block 2 of the objectui build-panel card for the consumer's strict parse. If neither
8686
* lands, the three become enforce-or-remove candidates with nothing watching
8787
* them, and the only thing that notices is a person reading this paragraph.
8888
*/
@@ -105,7 +105,7 @@ import { lazySchema } from '../shared/lazy-schema';
105105
* `dda8f3815`; line numbers drift, the two symbols are the anchor.
106106
* - `verify` — **declared by ruling**, ⛔ not measured: the post-apply
107107
* verification window objectui#7388 asks the panel to be able to name, and
108-
* the reason cloud#2172 ruled this vocabulary into the spec. At objectui
108+
* the reason the cloud build-progress card ruled this vocabulary into the spec. At objectui
109109
* `dda8f3815` `packages/plugin-chatbot` has ZERO occurrences of `'verify'`
110110
* (bright control, same instrument: `'structure'` hits 4 files there), and
111111
* this repository emits no frame at all, so `verify` has no reachable
@@ -120,7 +120,7 @@ import { lazySchema } from '../shared/lazy-schema';
120120
* assuming every phase occurs. The two illustrations of a phase being skipped
121121
* — a turn that applies no seed data never reporting `data`, and `apply_edit`
122122
* turns not reporting `structure` — are **inferred**: no reachable repository
123-
* records either, and cloud#2172's emitter has not landed. ⛔ The guidance
123+
* records either, and the cloud build-progress card's emitter has not landed. ⛔ The guidance
124124
* does not rest on them; treat every phase as optional whatever a producer
125125
* turns out to do.
126126
*
@@ -174,7 +174,7 @@ export const BuildProgressFrameSchema = lazySchema(() => z.looseObject({
174174
*
175175
* Typed as a non-negative integer rather than pinned to a base: whether the
176176
* loop counts its first hop as 0 or 1 is part of the emitter's placement,
177-
* which cloud#2172 owns and this card does not decide. ⛔ Consumers render it
177+
* which the cloud build-progress card owns and this card does not decide. ⛔ Consumers render it
178178
* as progress, never as an index into anything here.
179179
*
180180
* ⛔ Zero emitters and zero readers in every reachable repository at this

‎packages/spec/src/automation/end-node-outcome.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ describe('EndConfigSchema — the `end` node contract: it may refuse the run wit
6464
expect(issue.message).toContain('{{ record.name }}');
6565
});
6666

67-
it('REFUSES a single-brace token in the `message` — a text slot reads `{{ }}` holes (#22110)', () => {
67+
it('REFUSES a single-brace token in the `message` — a text slot reads `{{ }}` holes', () => {
6868
const result = EndConfigSchema.safeParse({ outcome: 'refused', message: 'Refused: {record.name}' });
6969
expect(result.success).toBe(false);
7070
if (result.success) return;

‎packages/spec/src/automation/io-node-config.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ describe('NotifyConfigSchema — an unknown key is refused, not stripped', () =>
469469
}
470470
});
471471

472-
it('refuses a single-brace token left from the 17.x dialect, in either spelling, naming its hole spelling (#22110)', () => {
472+
it('refuses a single-brace token left from the 17.x dialect, in either spelling, naming its hole spelling', () => {
473473
for (const key of ['title', 'message'] as const) {
474474
for (const value of ['Deal {record.name} won', tmpl`Deal {record.name} won`]) {
475475
const label = `${key} = ${JSON.stringify(value)}`;

‎packages/spec/src/contracts/approval-service.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ describe('continueRestoredRun — the approvals operator repair verb, declared',
271271
const doc = source.slice(source.lastIndexOf('/**', at), at);
272272

273273
// The sibling this was ruled to copy, named where a later author reads it.
274-
expect(doc).toContain('#16495');
274+
expect(doc).toContain('the automation-service contract');
275275
// What the engine verb leaves undone, which is the whole reason this exists.
276276
expect(doc).toMatch(/the[\s*]+continuation[\s*]+must[\s*]+be[\s*]+re-issued/);
277277
// ⛔ It replays a recorded outcome; it does not re-decide.

‎packages/spec/src/contracts/approval-service.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -996,7 +996,7 @@ export interface IApprovalService {
996996
/**
997997
* **Operator verb — re-issue the continuation for a run an operator has
998998
* re-armed** (#15389; the maintainer ruling of 2026-09-09, decision batch
999-
* #106 item 3, declared here exactly as #16495 declared
999+
* #106 item 3, declared here exactly as the automation-service contract declared
10001000
* `IAutomationService.cancelRun` / `restoreConsumedSuspension`).
10011001
*
10021002
* The missing half of `IAutomationService.restoreConsumedSuspension`, for

‎packages/spec/src/system/metadata-form-zod-reconciliation.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ const LEDGER: ReadonlyArray<OmitEntry | SubsetEntry> = [
494494
type: 'object',
495495
path: ROOT_PATH,
496496
key: 'attachedOnRead',
497-
why: "not a form's to offer, by ruling (ruling record 6070963704, #22211 A): the blocks a service attaches to the rows it serves, computed per caller and never stored, which the ruling says no form reads; a block is declared in code beside the service that attaches it (plugin-approvals' `viewer` on `sys_approval_request`), because nothing authored in a designer can make a service attach a block, and its one reader is the shared build validator",
497+
why: "not a form's to offer, by ruling (ruling record 6070963704, letter A): the blocks a service attaches to the rows it serves, computed per caller and never stored, which the ruling says no form reads; a block is declared in code beside the service that attaches it (plugin-approvals' `viewer` on `sys_approval_request`), because nothing authored in a designer can make a service attach a block, and its one reader is the shared build validator",
498498
},
499499
{
500500
kind: 'omit',

0 commit comments

Comments
 (0)