Uh oh!
There was an error while loading. Please reload this page.
feat(spec): refuse ${…} placeholder syntax in memory persistence.path / persistence.key at publish (#8495) - #8666
Conversation
…stence.key (#8495) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E5tUwGM3LQoqErTfkvRW7W
…under protocol 18, with changeset Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E5tUwGM3LQoqErTfkvRW7W
…ory-persistence-placeholder
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckThis PR changes 1 package(s): 106 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
⛔ 7 release-owned page(s) also reference the affected code. These are read-only:
|
Fixes#8495
The #8336 defect one surface over: a
${…}placeholder in the memory driver'spersistence.path(file persistence and theautooverride) orpersistence.key(localStorage and theautooverride) is resolved by nothing — the driver would create and write a literal./${DATA_DIR}/…path, or write under the literal placeholder-bearing localStorage key, with no error naming the unresolved placeholder. Inherited parent adjudication from #8336 (recorded by the triage comment on the card): refuse loudly at authoring time; these two keys are config-material like the connection keys, not record data.What changed
packages/spec/src/data/driver/memory.zod.ts: the sharedplaceholderFreejudgment (the${...}placeholders in authored metadata resolve to nothing and reach the consumer verbatim — the masked-failure escape #8078 measured, now load-bearing for two refusal messages #8336 single-mechanism construction fromcommon.zod.ts) applied to the four persistence string keys —file.path,local.key,auto.path,auto.key— labelledpersistence.path/persistence.keyso the refusal message names the authored key. Same helper, same error-prose class as PR feat(spec): refuse${…}placeholder syntax in connection-material driver config keys at publish (#8336) #8457.initialDatastays deliberately unjudged (the mother ruling's exclusion reached exactly as far as its reason: record values, where a literal${…}may be legitimate data) — now pinned by a test so the exclusion cannot erode silently.driver-placeholder-refusal.test.ts(the family's home): 4-way refusal pins (pathed atpersistence.path/persistence.key,code: 'custom', message substance), byte-identical acceptance pins for literal paths/keys, near-miss pins ($VAR,{name}, unclosed${), theinitialDataunjudged pin, and aDatasourceSchemare-path pin (config.persistence.path).Changeset class and ADR-0087 (the post-cut fork, resolved)
Sibling precedent #8336 / PR #8457 shipped as
@objectstack/spec: minorwith a voluntary D3 semantic entry under step 17 — its refusal first shipped exactly at the v17.0.0 major boundary, so plain minor was semver-honest. This card lands after the v17.0.0 cut (commit24c1b91), so the same narrowing first ships on the 17.x line: the changeset isminor(the launch-window no-major guard is active; no pre-mode) with aBREAKINGbody annotation, which makescheck-adr-0087-registrationdemand a disposition — satisfied byregistered memory-persistence-placeholder-refused.The semantic entry goes under a new protocol 18 step (this refusal is NOT in v17.0.0):
composeMigrationChainfiltersm ≤ toMajor(defaultPROTOCOL_MAJOR= 17), so the step is inert for every default caller until the major reaches 18, andcheck:generatedconfirms all 13 artifacts (spec-changes.json, upgrade guide included) are current with the step present — the v17 projections deliberately exclude it. The step block follows the generator's own prescription for a first entry under a new major.Verification (union re-run at head
d016ab89f, after the final commit — the merge of origin/main)@objectstack/specfull suite: 397 files / 10541 tests passed (includes the new pins).@objectstack/driver-memory(consumer, ⛔ not modified — investment freeze respected, tests only run): 25 files / 752 tests passed.pnpm --filter @objectstack/spec typecheck: green.check:generated: all 13 artifacts up to date.d016ab89f:check:cross-package-test-inputs(pnpm + node forms),check:merge-driver,check:spec-parsed-alias,check:type-source-resolution,check:doc-formula-expressions,check:dev-prereqs,check:objectui-changeset,check:query-options-erasure,check:type-check-coverage,check:type-check-debt --re-measure(none above recorded),check-adr-0087-registration(1 declared-breaking changeset, disposition valid),check-changeset-no-major,check-empty-changeset,check:nul-bytes.check:changeset-gate-self-testsfails on pristine origin/main (56724c5) because today's v17 cut emptied the.changesetstock and removedpre.json, which the self-test's control assertions require — tracked as finding:check-changeset-no-major --self-testgoes red repo-wide after a release exits pre mode — its control requires major-declaring changesets AND apre.jsonthat no longer exists #8654 (and sibling check-adr-0087-registration is red on every PR after a release cut — its input assertion needs a breaking changeset in the real stock (sibling of #8654) #8658), both already filed. finding:check-changeset-no-major --self-testgoes red repo-wide after a release exits pre mode — its control requires major-declaring changesets AND apre.jsonthat no longer exists #8654 is not addressed here; it remains open.${…}inside persistence config anywhere inexamples/or fixtures (the only${hits are TS template literals in code).Generated by Claude Code
Generated by Claude Code