docs(spec): the field.valueDomain liveness note stops claiming the settings door is unchanged - #16990
Merged
zhuangjianguo merged 1 commit intoSep 9, 2026
Conversation
…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
Contributor
📓 Docs Drift Check
What this run could not see
Coarse fallback — 131 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
zhuangjianguo
marked this pull request as ready for review
September 9, 2026 00:17
zhuangjianguo
enabled auto-merge
September 9, 2026 00:17
This was referenced Sep 9, 2026
zhuangjianguo
deleted the
claude/issue-15568-value-domain-note-settings-door
branch
September 9, 2026 00:39
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
statusis untouched.Prose pulled back onto an already-declared contract, so it takes the ordinary lane.
The defect
packages/spec/liveness/field.json, thevalueDomainrow'snote, ended on a sentence writtenwhile the settings-door re-point was still in the future:
Both halves of the maintainer's 2026-09-02 ruling have since landed, and their order is the
whole defect:
6b8c67778fa125f3bfThe engine half landed second and rewrote this note wholesale while carrying the sentence
forward verbatim, so
unchanged until thenreachedmaindescribing a door that had alreadyre-pointed one commit earlier. Both are ancestors of
2bdabe60e(git merge-base --is-ancestorexit 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.tsat2bdabe60e— a reading,not an inference from the PR title:
@objectstack/spec/sharedand nothing else (:43-47).firstRejectedDomainMembercallsisValueDomainMember(:94) — the same predicatepackages/objectql/src/validation/record-validator.tscalls at:712, both importing it from@objectstack/spec/shared.Intl.supportedValuesOf/Intl.DateTimeFormatin that file is at:22,:23and:35—all inside the header prose that describes the removal, none of it live code.
knownValueDomain,firstRejectedDomainMember,valueDomainPhrasing.value-domains.shared-predicate.pin.test.ts, the ratchet thatfile's own header names.
Before (final sentence of the note):
After:
Both red lines held, and measured rather than asserted
① The row's
statusis untouched. A structural JSON diff of the whole file, before vs. after,reports exactly one changed key:
statusreadsliveon both sides — it tracks the engine write path, and this card does not move it.②
state-counts.mdis not adjusted from here, and nothing moved it under me.check:livenessprints its own verdict line:
and
pnpm --filter @objectstack/spec run check:generatedreports all 15 generated artifacts up todate,
check:liveness liveness/state-counts.mdamong them. After the entire gate sweep at the finalcommit,
git status --shortis empty. No generator asked to move a derived count, so there wasnothing to stop and report.
Verification
At
702544eb0, withpackages/specbuilt first (pnpm --filter @objectstack/spec build, VERDICTcommand-exit 0 under
scripts/pm/os-verify-lock.sh).node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ranreconciles the sweep:All 54 exited 0 except two, which exited 3 — their own
NOT MEASUREDcode, not a failure:check:dual-build-cjs-loads—PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/.(82 packages unbuilt; onlyspecis built here.)check:lean-entry-closure—PREREQUISITE 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:
Lint, narrowed and measured (not skipped). ESLint's own config decides the population, and it
puts neither changed file in it —
--format jsonreturns 2 file entries, 0 errors, eachcarrying
File ignored because no matching configuration was supplied.Invariance for untouchedfiles: this repo runs one
eslint.config.mjswhichnever 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.projectanywhere), so a.jsondata file and a.mdchangeset cannot move the verdict on any file they do not contain. The repo-wide
pnpm lintrunstays CI's.
Changeset — both halves, and which tree decided it
Half 1:
packages/spec'sfiles[]includesliveness— yes.Half 2 was measured against the real artifact rather than assumed, because
distdoes notdiscriminate for this shape of text.
npm packwas unpacked and grepped:dist/liveness/text indist/(positive control fordist)liveness/field.jsonships verbatim as one of 38liveness/entries in the tarball, and the oldsentence is absent from it — so the grep reflects this edit rather than a stale copy. The
published
liveness/directory is the deciding tree;distdecides nothing here (both its probesare 0, including the positive control). Published content moved ⇒ a changeset is owed, and
.changeset/value-domain-note-settings-door-repointed.mddeclares@objectstack/spec: patch.验收备注
Out of scope, noted, not filed — the same row's
evidencefield carries the same tense defectthis card exists to correct, one field over. It reads:
The write path now does call it, and the very same
evidencestring 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