Skip to content

docs(spec): the field.valueDomain liveness note stops claiming the settings door is unchanged - #16990

Merged
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-15568-value-domain-note-settings-door
Sep 9, 2026
Merged

docs(spec): the field.valueDomain liveness note stops claiming the settings door is unchanged#16990
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-15568-value-domain-note-settings-door

Conversation

@claude

@claude claude Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Fixes #15568

Clause-②: no
One sentence of a liveness-ledger note — a single JSON string value. No accept set moves, no
export is added, no schema arm, bound or behaviour changes, and the row's status is untouched.
Prose pulled back onto an already-declared contract, so it takes the ordinary lane.

The defect

packages/spec/liveness/field.json, the valueDomain row's note, ended on a sentence written
while the settings-door re-point was still in the future:

The settings door (service-settings/value-domains.ts) re-points onto the shared predicate in
its own follow-up card and is unchanged until then.

Both halves of the maintainer's 2026-09-02 ruling have since landed, and their order is the
whole defect:

half PR commit landed (UTC)
services — the settings door #15434 6b8c67778 2026-09-04 23:39:24
engine — the write path #15316 fa125f3bf 2026-09-05 01:43:41

The engine half landed second and rewrote this note wholesale while carrying the sentence
forward verbatim, so unchanged until then reached main describing a door that had already
re-pointed one commit earlier. Both are ancestors of 2bdabe60e (git merge-base --is-ancestor
exit 0 for each; this checkout is not shallow, --is-shallow-repository = false).

The replacement, and how it was established

Read off packages/services/service-settings/src/value-domains.ts at 2bdabe60e — a reading,
not an inference from the PR title:

  • It imports from @objectstack/spec/shared and nothing else (:43-47).
  • firstRejectedDomainMember calls isValueDomainMember (:94) — the same predicate
    packages/objectql/src/validation/record-validator.ts calls at :712, both importing it from
    @objectstack/spec/shared.
  • Its second copy of all three definitions is gone. Every surviving mention of
    Intl.supportedValuesOf / Intl.DateTimeFormat in that file is at :22, :23 and :35
    all inside the header prose that describes the removal, none of it live code.
  • What is left there is the door's own business: knownValueDomain, firstRejectedDomainMember,
    valueDomainPhrasing.
  • A re-added local table reddens value-domains.shared-predicate.pin.test.ts, the ratchet that
    file's own header names.

Before (final sentence of the note):

The settings door (service-settings/value-domains.ts) re-points onto the shared predicate in
its own follow-up card and is unchanged until then.

After:

The settings door (service-settings/value-domains.ts) has re-pointed onto that same predicate
(#15434, the services half of the same ruling): its second copy of all three definitions is
deleted and firstRejectedDomainMember asks isValueDomainMember, so a value Settings admits
is the value a field admits and vice versa; what is left on that side is the door's own business
(which declarations it agrees to enforce, how a multi-value carrier is walked, the fragments the
env-override log line needs), and a re-added local table reddens
packages/services/service-settings/src/value-domains.shared-predicate.pin.test.ts.

Both red lines held, and measured rather than asserted

① The row's status is untouched. A structural JSON diff of the whole file, before vs. after,
reports exactly one changed key:

semantic diffs: [('CHANGED', '/props/valueDomain/note')]

status reads live on both sides — it tracks the engine write path, and this card does not move it.

state-counts.md is not adjusted from here, and nothing moved it under me. check:liveness
prints its own verdict line:

✓ packages/spec/liveness/state-counts.md is current — the same 36 row(s), no count column left in the README.

and pnpm --filter @objectstack/spec run check:generated reports all 15 generated artifacts up to
date, check:liveness liveness/state-counts.md among them. After the entire gate sweep at the final
commit, git status --short is empty. No generator asked to move a derived count, so there was
nothing to stop and report.

Verification

At 702544eb0, with packages/spec built first (pnpm --filter @objectstack/spec build, VERDICT
command-exit 0 under scripts/pm/os-verify-lock.sh).

node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran reconciles the sweep:

Run reconciliation — 54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN.
✓ dispatch-gates --ran: 54 derived famil(ies) accounted for — 54 run, 0 NOT-MEASURED.

All 54 exited 0 except two, which exited 3 — their own NOT MEASURED code, not a failure:

  • check:dual-build-cjs-loadsPREREQUISITE NOT MET — this gate reads built output, and some package has no dist/. (82 packages unbuilt; only spec is built here.)
  • check:lean-entry-closurePREREQUISITE NOT MET … This is NOT MEASURED. It is neither a pass nor a failure, and exits 3 so nothing reads it as either.

Both need a whole-monorepo build and neither can be reached by a JSON data file. Declared to CI.

Named gates: check:liveness · check:generated (15/15) · check:empty-state ·
check:variant-docs · check:strictness-ledger · check:spec-changes ·
check:error-code-provenance · check-reference-carrier-shape · check:nul-bytes ·
check:published-files · check:changeset-gate-self-tests · check:empty-changeset ·
check:changeset-no-major · check:objectui-changeset · check:doc-authoring ·
check-affected-docs · check-drift-comment · check:cross-package-test-inputs ·
check:test-source-alias · check:type-source-resolution · check:dts-closure — all exit 0.

The three roster gates the derivation flagged as keeping their allowlist under a directory one of my
paths is in — so their silence is evidence in neither direction — were run, not assumed:
check:spec-changes, check:authz-resolver, check:error-code-casing, check:filter-alias-parity
— all exit 0.

Tests — the four suites that read this ledger, under the shared lock:

pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 \
  scripts/liveness/{check-liveness,evidence,proof-registry,verification}.test.ts
Test Files  4 passed (4)
     Tests  136 passed (136)

Lint, narrowed and measured (not skipped). ESLint's own config decides the population, and it
puts neither changed file in it — --format json returns 2 file entries, 0 errors, each
carrying File ignored because no matching configuration was supplied. Invariance for untouched
files: this repo runs one eslint.config.mjs which never enables type-aware linting (no parserOptions.project, no typed @typescript-eslint rules) for ANY file (its own comment at :327,
confirmed by grep — no parserOptions.project anywhere), so a .json data file and a .md
changeset cannot move the verdict on any file they do not contain. The repo-wide pnpm lint run
stays CI's.

Changeset — both halves, and which tree decided it

Half 1: packages/spec's files[] includes liveness — yes.

Half 2 was measured against the real artifact rather than assumed, because dist does not
discriminate for this shape of text. npm pack was unpacked and grepped:

probe in the published tarball
the new sentence 1
the old sentence (discriminating control) 0
a nonsense string (negative control) 0
the new sentence anywhere in dist/ 0
any liveness/ text in dist/ (positive control for dist) 0

liveness/field.json ships verbatim as one of 38 liveness/ entries in the tarball, and the old
sentence is absent from it — so the grep reflects this edit rather than a stale copy. The
published liveness/ directory is the deciding tree; dist decides nothing here
(both its probes
are 0, including the positive control). Published content moved ⇒ a changeset is owed, and
.changeset/value-domain-note-settings-door-repointed.md declares @objectstack/spec: patch.

验收备注

Out of scope, noted, not filed — the same row's evidence field carries the same tense defect
this card exists to correct, one field over. It reads:

the ONE membership predicate the write path will call — shared with the settings door

The write path now does call it, and the very same evidence string already quotes that call
(!isValueDomainMember(def.valueDomain, s)). This is the same "prose that outlived its subject"
family triage counted to nine instances on this card. It is outside the dispatched file surface —
this card is scoped to the note's final sentence only — so it is reported rather than ridden along.
Successor: #15540 is declared serial behind this PR on this same file, so a hand is already
booked here. ⛔ No card filed by this seat.


Generated by Claude Code

…ttings door is unchanged

The `valueDomain` row's note ended on a sentence written while the settings-door
re-point was still ahead of it: "The settings door (`service-settings/value-domains.ts`)
re-points onto the shared predicate in its own follow-up card and is unchanged until
then." Both halves of the 2026-09-02 ruling have since landed — the services half
(#15434, 2026-09-04T23:39Z) and the engine half (#15316, 2026-09-05T01:43Z) — and the
engine half, landing second, rewrote this note wholesale while carrying that sentence
forward verbatim. It survived onto `main` describing a state that had already ended one
commit earlier.

The replacement is read off `packages/services/service-settings/src/value-domains.ts` on
this ref rather than off a PR title: its second copy of all three definitions is deleted,
it imports from `@objectstack/spec/shared` and nothing else, and
`firstRejectedDomainMember` asks `isValueDomainMember` — the same call
`record-validator.ts` makes at :712. What remains on that side is the door's own business
(which declarations it agrees to enforce, how a multi-value carrier is walked, the
fragments the env-override log line needs), and a re-added local table reddens
`value-domains.shared-predicate.pin.test.ts`.

Note text only, one JSON string value: the row's `status` is untouched — it tracks the
engine write path — and `liveness/state-counts.md` is not adjusted from here.
`check:liveness` reports the counts file current and `git status` stayed clean apart from
the two files in this commit, so no generator moved a derived count under this change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016N6xmWt5hYm94ffVEwGH8x
@github-actions github-actions Bot added the size/s label Sep 8, 2026
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

Coarse fallback — 131 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 b834b48e7a6ca1786be5731a1a46945216007c92packageMentionDocs.

@github-actions github-actions Bot added documentation Improvements or additions to documentation tooling labels Sep 8, 2026
@zhuangjianguo
zhuangjianguo marked this pull request as ready for review September 9, 2026 00:17
@zhuangjianguo
zhuangjianguo added this pull request to the merge queue Sep 9, 2026
Merged via the queue into main with commit 7cd5874 Sep 9, 2026
36 checks passed
@zhuangjianguo
zhuangjianguo deleted the claude/issue-15568-value-domain-note-settings-door branch September 9, 2026 00:39
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

2 participants