Repository navigation
fix(spec): one homeAmount refusal names both faults of a home or rate field - #29533
Conversation
A home or rate field that lacks `readonly: true` and declares an `expression` was told only the readonly fault; the issue now names both faults and both remedies. Single-fault messages are unchanged. Claude-Session: https://claude.ai/code/session_01JQwxbY25z4BbXRWy1LD8NX Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run. What this run could not see
Coarse fallback — 168 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 2c9891be406c1bbe86cd5a4765b6149f15982c7b && git checkout 2c9891be406c1bbe86cd5a4765b6149f15982c7b
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 5651647d82dea5ce18ad537d629c18e3dd27f613 29af940fde182fd480eb8c328f34b9e597e452a3 && git checkout -B drift-repro 5651647d82dea5ce18ad537d629c18e3dd27f613 && git merge --no-ff 29af940fde182fd480eb8c328f34b9e597e452a3
node scripts/docs-audit/affected-docs.mjs --json 5651647d82dea5ce18ad537d629c18e3dd27f613 |
|
domain:spec#3 · os-warren · session_01JQwxbahe4v7GBD94QeSnir Contract reviewServed-tier: Inputs: card #28205 body and its five comments (triage p3, unblocked, ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgmentpackages/spec/src/data/object.zod.ts — judged against the card's ruling (triage: "one refusal names both faults", p3), ADR-0144 D5 as the test file cites it, and the first consumer (
Implemented-by: VERDICT: PASS Generated by Claude Code |
|
domain:spec#3 · os-warren · session_01JQwxbahe4v7GBD94QeSnir 维护者速读
席位核对ACCEPT ·
Generated by Claude Code |
|
domain:spec#3 · os-warren · session_01JQwxbahe4v7GBD94QeSnir Landed · 2026-11-02T19:07Z
State change: Generated by Claude Code |
Requested by Warren · project thread
Fixes #28205
Clause-②: no
Metadata-protocol: none
维护者速读
homeAmount的 home / rate 字段同时缺readonly: true又带expression时,一条拒收文案同时点名两个毛病和两个处方。packages/spec/src/data/object.zod.ts的refuseUnlessPlatformWritten;currency-config-home-amount.test.ts新增用例。pnpm --filter @objectstack/spec exec vitest run src/data/currency-config-home-amount.test.ts,预期 32/32 通过。What changes
refuseUnlessPlatformWritten(thecurrencyConfig.homeAmountjudge inpackages/spec/src/data/object.zod.ts) used to pick ONE fault: a target withoutreadonly: truewas told only that, even when it also declared anexpression. It now computes both faults; when both hold, the one issue atfields.AMOUNT.currencyConfig.homeAmount.field(or.rateField) names both and both remedies: "Addreadonly: truetoTARGETand delete itsexpression." A target with one fault gets exactly the message it got before.A
patchchangeset for@objectstack/speccarries the two declaration lines.Why
Triage 6528487750: one refusal names both faults (p3). The author otherwise fixes the readonly fault and meets the expression fault on the next parse.
Tests
it.eachoveramount_home/amount_ratebeside the existinghomeAmountplatform-written refusals: one issue at the pointer,code: custom, both fault fragments and the joint remedy.scripts/ablation-replace.mjsreplaced the both-faults condition withfalse, so the old single-fault branch answered; the anchor hit 1 → 0, blob 7a8be354 → 9df9b598; the file went 2 failed / 30 passed; restore put the blob back to 7a8be354 andgit diff HEADcame back empty.Acceptance notes
Verification
All on head 29af940 (this branch merged with
origin/mainc88467d).Local runs
pnpm exec turbo run buildfor the spec, formula, lint and objectql closures, thenpnpm --filter @objectstack/spec check:generated: "All 14 generated artifacts are up to date", thenpnpm --filter @objectstack/spec test: Test Files 792 passed (792), Tests 23524 passed, 1 todo. Lock VERDICT command-exit 0.pnpm --filter @objectstack/spec typecheck: exit 0 (round 1, on a3fcb30; the round-2 merge did not touch the changed file).node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 80 families derived. 79 run, every one exit 0.pnpm check:dual-build-cjs-loadsis NOT MEASURED: it needs every package built, so it is left to CI.--ranreconciliation: 80 derived, 79 run, 1 UNRUN (that gate).!in the title and no(narrowing)arm.Human Minimum
packages/specholds no runtime logic.pnpm lintwas not run locally (a repo-wide scan, owned by CI'sLint & Repo Gates).main, one pull request.packages/spectouched: its generated artifacts are regenerated and committed (none stale).content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.Dev session:
session_01JQwxbY25z4BbXRWy1LD8NX(card thread), dispatched bydomain:spec#3 · os-warren · session_01JQwxbahe4v7GBD94QeSnir.Generated by Claude Code