test(objectql): declare the recorded-by fixture's lookup with the canonical reference key - #14633

Merged
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling
Sep 2, 2026
Merged

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key#14633
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling

Conversation

@os-musk

Copy link
Copy Markdown
Collaborator

Fixes#14535

protocol-recorded-by-null.test.ts declared recorded_by as { type: 'lookup', referenceTo: 'sys_user', readonly: true } under a comment claiming it is "the real declaration". The rename is the last step of this change, not its point: the card ruled that what the file's second half has been proving had to be established first, with an instrument rather than a reading.

Step 1 — the instrument, and what it read

referenceTargetOf (packages/spec/src/data/field-value.zod.ts:141) is the single arbiter the #4441 write-path guard resolves a lookup's target through: assertReferencesResolve calls it at packages/objectql/src/engine.ts:5814 and skips the field at if (!target) continue when it answers nothing. It reads the reference key only (plus the implicit target of type: 'user').

Instrument. A temporary probe wrapped the engine's own assertReferencesResolve and referenceExists on this fixture's real protocol write path, and counted the target probe the guard performs. Control: the fourth row below — the same instrument does register a probe when a target resolves, so an empty count is a real absence rather than a blind instrument.

Reading, over the fixture's own writes (saveMetaItem with an actor and without one):

declaration under testguard enteredisSystemtarget probe
referenceTo + readonly: true (as written)yes, twicefalsenone
reference + readonly: true (after the rename)yes, twicefalsenone
referenceTo, readonly removedyes, twicefalsenone
reference, readonly removedyes, twicefalsereferenceExists('sys_user', 'usr_alice')

and directly: referenceTargetOf answers undefined for the referenceTo spelling and 'sys_user' for reference.

So the guard did run here — this is a non-system write, and recorded_by was present both in the caller-supplied payload and in the normalized data. It simply never looked at the field's target, because to the arbiter there was none. The readonly exemption the file's second half claims to exercise is not what admitted these writes; the target-less skip is. Row three is the proof: with the alias spelled, deleting the exemption changes nothing at all.

That is the triage's step 1 answered in its own terms — the exemption has been exercised against a field with no target, not against the case the file says it covers.

Steps 2 and 3 — the rename, and the assertions that had to change with it

Because the branch was never reached, this is not a rename. Two pins are added so the file proves what its header says:

  1. the declaration resolvesreferenceTargetOf(sysMetadataHistoryObject.fields.recorded_by) is 'sys_user'. This is the fidelity claim as an assertion instead of prose. A raw object literal handed to the registry is never parsed by FieldSchema, so the alias could never be refused where it was written ([finding] docs vs driver disagree on whether lookup columns get a real FOREIGN KEY — and the driver branch keys on reference_to, not reference #11567), and nothing in the suite could notice.
  2. an actor id no sys_user row matches is still admitted — the data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 exemption, at the protocol layer where the regression was found. This is not the sys_metadata_history.recorded_bylookup('sys_user') 却存哨兵字符串 'system'——声明的类型与实际存的值不是一回事 #4556 sentinel returning: 'system' was a string the platform minted for every actor-less write, which this suite still refuses; an actor the caller named is the caller's own value, and data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 deliberately does not police a readonly lookup (the residual is reported by the isSystem 写入仍可产生悬空 lookup 引用——需要一条只报告不拦截的巡检(#4441 残留) #4551 audit instead).

The file header now records the measurement in place of the claim it could not support.

Reverse verification — the 2x2

Each cell is the whole suite re-run; mutations were applied with an anchored edit whose landing was proved by counting the injected and the removed text, restored from HEAD under a trap, and both files verified byte-identical to their HEAD blobs afterwards (git hash-object compared to git rev-parse HEAD:path).

celldeclarationreadonly exemption in engine.tsresult
1reference (this PR)present7 passed — control
2referenceTo (rename reverted)presentpin 1 RED, pin 2 green
3reference (this PR)deletedpin 2 RED
4referenceTodeletedpin 2 green (only pin 1 fails, on the alias)

Cells 3 and 4 are the same engine ablation with opposite outcomes, and the only difference between them is the spelling. That is what the rename buys: the exemption becomes load-bearing for this fixture. Cell 2 is the reverse verification for pin 1.

The engine.ts mutation was a measurement only and is not part of this diff, which is one test file. The exemption's engine-layer coverage already exists and is spelled canonically — engine-lookup-referential-integrity.test.ts, "a READONLY lookup is not the caller's to answer for"; this file's protocol-layer half was the vacuous one.

Tests

All at 64f4383eb, the head of this branch. Heavy runs went through scripts/pm/os-verify-lock.sh; exit codes captured after a redirect, never through a pipe.

  • pnpm --filter @objectstack/objectql exec vitest run --maxWorkers=2 src/protocol-recorded-by-null.test.ts — exit 0, Test Files 1 passed (1) / Tests 7 passed (7).
  • pnpm --filter @objectstack/objectql typecheck — exit 0, including check:test-typecheck: OK — @objectstack/objectql's test layer compiles under packages/objectql/tsconfig.test.json; 44 file(s) / 242 error(s) / 69 pinned signature(s) held (the exact per-file ratchet: the new test file adds none).
  • pnpm lint (whole repo, eslint . --no-inline-config) — exit 0, no output. Not narrowed.
  • pnpm check:nul-bytesOK (scanned 7986 text file(s) ... no raw ASCII control bytes). pnpm check:error-status-conformance — exit 0.
  • The gate family re-derived on this tree with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (identical to the dispatch seed): 25 of 28 green, quoted in the report comment on the card.
  • Three answered exit 3, PREREQUISITE NOT MET — not measured, and not a finding: check-test-completeness.mjs ("running the family locally, record this gate as NOT MEASURED" — it grades a saved turbo run test log CI tees), check:dual-build-cjs-loads and check:type-check-debt (both need the whole built closure — "Run pnpm build first. This is NOT a pass: nothing was measured"). All three measure the built world, which a test-only diff does not move; CI runs them after the closure build.
  • node scripts/check-changeset-no-major.mjs — exit 0. skip-changeset: the diff is one test file, publishes nothing, and check:published-files is green with tests excluded from every whitelist.

🤖 Generated with Claude Code

https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68


Generated by Claude Code

…onical `reference` key
`protocol-recorded-by-null.test.ts` declared `recorded_by` as
`{ type: 'lookup', referenceTo: 'sys_user', readonly: true }` under a comment
claiming it is "the real declaration". `referenceTo` is an alias `FieldSchema`
refuses by name, and `referenceTargetOf` — the single arbiter the #4441
write-path referential check resolves through — does not read it, so the lookup
presented as target-less.
Measured on the fixture's own write path before renaming anything, by counting
the guard's target probe: with `referenceTo` spelled, no probe ran even with the
`readonly` exemption removed; with `reference` spelled, it runs. So the
exemption the file's second half claims to exercise had never admitted these
writes — the target-less skip did.
Renames the key and adds the two pins that keep the header's claim honest: the
declaration resolves through `referenceTargetOf`, and an actor id no `sys_user`
row matches is still admitted (which is the exemption, and is now red if the
exemption is deleted).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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 — 0 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 87ad30c103bb4e8c5d7b8a399634b59716f3c21fpackageMentionDocs.

@os-muskos-musk added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed tests labels Sep 2, 2026 — with Claude
@os-musk
os-musk marked this pull request as ready for review September 2, 2026 16:12
@os-musk
os-musk enabled auto-merge September 2, 2026 16:12
@os-muskClaude

Copy link
Copy Markdown
CollaboratorAuthor

Landing provenance (engine execution seat, session session_0112hMx9hjJ9BgB28X97DS68): flipped ready at 16:12Z and armed auto-merge (squash) at 16:12:28Z on head 64f4383eb.

  • Review: ACCEPT on the card, comment 5512386686. Clause-② no, self-read from the diff.
  • Governed-surface test on the one changed path: 0 of 1 governed — ordinary queue landing. skip-changeset, test-only.
  • Enqueue bar: every check run on 64f4383eb completed green or skipped (40 runs read at 16:12Z, perPage: 50). Last standing was Test Core (1/6), 15:49:47Z to 16:09:07Z — 19 minutes, the long shard again; Lint & Repo Gates finished 16:05Z.
  • The auto-merge echo reads method: MERGE — the known shape whatever was passed; the queue build ref is the reading.
  • Landing owed by the seat at MERGED: verify by content on origin/main that recorded_by spells reference: 'sys_user' and that both new pins are present, strip pm:dispatched from protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration" #14535, landing record on the card.

Generated by Claude Code

@os-musk
os-musk added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 1aba315Sep 2, 2026
42 checks passed
@os-musk
os-musk deleted the claude/issue-14535-recorded-by-reference-spelling branch September 2, 2026 18:06
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration"

2 participants

@os-musk@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key - #14633

Merged
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling
Sep 2, 2026
Merged

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key#14633
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling

Conversation

@os-musk

Copy link
Copy Markdown
Collaborator

Fixes#14535

protocol-recorded-by-null.test.ts declared recorded_by as { type: 'lookup', referenceTo: 'sys_user', readonly: true } under a comment claiming it is "the real declaration". The rename is the last step of this change, not its point: the card ruled that what the file's second half has been proving had to be established first, with an instrument rather than a reading.

Step 1 — the instrument, and what it read

referenceTargetOf (packages/spec/src/data/field-value.zod.ts:141) is the single arbiter the #4441 write-path guard resolves a lookup's target through: assertReferencesResolve calls it at packages/objectql/src/engine.ts:5814 and skips the field at if (!target) continue when it answers nothing. It reads the reference key only (plus the implicit target of type: 'user').

Instrument. A temporary probe wrapped the engine's own assertReferencesResolve and referenceExists on this fixture's real protocol write path, and counted the target probe the guard performs. Control: the fourth row below — the same instrument does register a probe when a target resolves, so an empty count is a real absence rather than a blind instrument.

Reading, over the fixture's own writes (saveMetaItem with an actor and without one):

declaration under testguard enteredisSystemtarget probe
referenceTo + readonly: true (as written)yes, twicefalsenone
reference + readonly: true (after the rename)yes, twicefalsenone
referenceTo, readonly removedyes, twicefalsenone
reference, readonly removedyes, twicefalsereferenceExists('sys_user', 'usr_alice')

and directly: referenceTargetOf answers undefined for the referenceTo spelling and 'sys_user' for reference.

So the guard did run here — this is a non-system write, and recorded_by was present both in the caller-supplied payload and in the normalized data. It simply never looked at the field's target, because to the arbiter there was none. The readonly exemption the file's second half claims to exercise is not what admitted these writes; the target-less skip is. Row three is the proof: with the alias spelled, deleting the exemption changes nothing at all.

That is the triage's step 1 answered in its own terms — the exemption has been exercised against a field with no target, not against the case the file says it covers.

Steps 2 and 3 — the rename, and the assertions that had to change with it

Because the branch was never reached, this is not a rename. Two pins are added so the file proves what its header says:

  1. the declaration resolvesreferenceTargetOf(sysMetadataHistoryObject.fields.recorded_by) is 'sys_user'. This is the fidelity claim as an assertion instead of prose. A raw object literal handed to the registry is never parsed by FieldSchema, so the alias could never be refused where it was written ([finding] docs vs driver disagree on whether lookup columns get a real FOREIGN KEY — and the driver branch keys on reference_to, not reference #11567), and nothing in the suite could notice.
  2. an actor id no sys_user row matches is still admitted — the data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 exemption, at the protocol layer where the regression was found. This is not the sys_metadata_history.recorded_bylookup('sys_user') 却存哨兵字符串 'system'——声明的类型与实际存的值不是一回事 #4556 sentinel returning: 'system' was a string the platform minted for every actor-less write, which this suite still refuses; an actor the caller named is the caller's own value, and data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 deliberately does not police a readonly lookup (the residual is reported by the isSystem 写入仍可产生悬空 lookup 引用——需要一条只报告不拦截的巡检(#4441 残留) #4551 audit instead).

The file header now records the measurement in place of the claim it could not support.

Reverse verification — the 2x2

Each cell is the whole suite re-run; mutations were applied with an anchored edit whose landing was proved by counting the injected and the removed text, restored from HEAD under a trap, and both files verified byte-identical to their HEAD blobs afterwards (git hash-object compared to git rev-parse HEAD:path).

celldeclarationreadonly exemption in engine.tsresult
1reference (this PR)present7 passed — control
2referenceTo (rename reverted)presentpin 1 RED, pin 2 green
3reference (this PR)deletedpin 2 RED
4referenceTodeletedpin 2 green (only pin 1 fails, on the alias)

Cells 3 and 4 are the same engine ablation with opposite outcomes, and the only difference between them is the spelling. That is what the rename buys: the exemption becomes load-bearing for this fixture. Cell 2 is the reverse verification for pin 1.

The engine.ts mutation was a measurement only and is not part of this diff, which is one test file. The exemption's engine-layer coverage already exists and is spelled canonically — engine-lookup-referential-integrity.test.ts, "a READONLY lookup is not the caller's to answer for"; this file's protocol-layer half was the vacuous one.

Tests

All at 64f4383eb, the head of this branch. Heavy runs went through scripts/pm/os-verify-lock.sh; exit codes captured after a redirect, never through a pipe.

  • pnpm --filter @objectstack/objectql exec vitest run --maxWorkers=2 src/protocol-recorded-by-null.test.ts — exit 0, Test Files 1 passed (1) / Tests 7 passed (7).
  • pnpm --filter @objectstack/objectql typecheck — exit 0, including check:test-typecheck: OK — @objectstack/objectql's test layer compiles under packages/objectql/tsconfig.test.json; 44 file(s) / 242 error(s) / 69 pinned signature(s) held (the exact per-file ratchet: the new test file adds none).
  • pnpm lint (whole repo, eslint . --no-inline-config) — exit 0, no output. Not narrowed.
  • pnpm check:nul-bytesOK (scanned 7986 text file(s) ... no raw ASCII control bytes). pnpm check:error-status-conformance — exit 0.
  • The gate family re-derived on this tree with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (identical to the dispatch seed): 25 of 28 green, quoted in the report comment on the card.
  • Three answered exit 3, PREREQUISITE NOT MET — not measured, and not a finding: check-test-completeness.mjs ("running the family locally, record this gate as NOT MEASURED" — it grades a saved turbo run test log CI tees), check:dual-build-cjs-loads and check:type-check-debt (both need the whole built closure — "Run pnpm build first. This is NOT a pass: nothing was measured"). All three measure the built world, which a test-only diff does not move; CI runs them after the closure build.
  • node scripts/check-changeset-no-major.mjs — exit 0. skip-changeset: the diff is one test file, publishes nothing, and check:published-files is green with tests excluded from every whitelist.

🤖 Generated with Claude Code

https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68


Generated by Claude Code

…onical `reference` key
`protocol-recorded-by-null.test.ts` declared `recorded_by` as
`{ type: 'lookup', referenceTo: 'sys_user', readonly: true }` under a comment
claiming it is "the real declaration". `referenceTo` is an alias `FieldSchema`
refuses by name, and `referenceTargetOf` — the single arbiter the #4441
write-path referential check resolves through — does not read it, so the lookup
presented as target-less.
Measured on the fixture's own write path before renaming anything, by counting
the guard's target probe: with `referenceTo` spelled, no probe ran even with the
`readonly` exemption removed; with `reference` spelled, it runs. So the
exemption the file's second half claims to exercise had never admitted these
writes — the target-less skip did.
Renames the key and adds the two pins that keep the header's claim honest: the
declaration resolves through `referenceTargetOf`, and an actor id no `sys_user`
row matches is still admitted (which is the exemption, and is now red if the
exemption is deleted).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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 — 0 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 87ad30c103bb4e8c5d7b8a399634b59716f3c21fpackageMentionDocs.

@os-muskos-musk added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed tests labels Sep 2, 2026 — with Claude
@os-musk
os-musk marked this pull request as ready for review September 2, 2026 16:12
@os-musk
os-musk enabled auto-merge September 2, 2026 16:12
@os-muskClaude

Copy link
Copy Markdown
CollaboratorAuthor

Landing provenance (engine execution seat, session session_0112hMx9hjJ9BgB28X97DS68): flipped ready at 16:12Z and armed auto-merge (squash) at 16:12:28Z on head 64f4383eb.

  • Review: ACCEPT on the card, comment 5512386686. Clause-② no, self-read from the diff.
  • Governed-surface test on the one changed path: 0 of 1 governed — ordinary queue landing. skip-changeset, test-only.
  • Enqueue bar: every check run on 64f4383eb completed green or skipped (40 runs read at 16:12Z, perPage: 50). Last standing was Test Core (1/6), 15:49:47Z to 16:09:07Z — 19 minutes, the long shard again; Lint & Repo Gates finished 16:05Z.
  • The auto-merge echo reads method: MERGE — the known shape whatever was passed; the queue build ref is the reading.
  • Landing owed by the seat at MERGED: verify by content on origin/main that recorded_by spells reference: 'sys_user' and that both new pins are present, strip pm:dispatched from protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration" #14535, landing record on the card.

Generated by Claude Code

@os-musk
os-musk added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 1aba315Sep 2, 2026
42 checks passed
@os-musk
os-musk deleted the claude/issue-14535-recorded-by-reference-spelling branch September 2, 2026 18:06
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration"

2 participants

@os-musk@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key - #14633

Merged
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling
Sep 2, 2026
Merged

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key#14633
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling

Conversation

@os-musk

Copy link
Copy Markdown
Collaborator

Fixes#14535

protocol-recorded-by-null.test.ts declared recorded_by as { type: 'lookup', referenceTo: 'sys_user', readonly: true } under a comment claiming it is "the real declaration". The rename is the last step of this change, not its point: the card ruled that what the file's second half has been proving had to be established first, with an instrument rather than a reading.

Step 1 — the instrument, and what it read

referenceTargetOf (packages/spec/src/data/field-value.zod.ts:141) is the single arbiter the #4441 write-path guard resolves a lookup's target through: assertReferencesResolve calls it at packages/objectql/src/engine.ts:5814 and skips the field at if (!target) continue when it answers nothing. It reads the reference key only (plus the implicit target of type: 'user').

Instrument. A temporary probe wrapped the engine's own assertReferencesResolve and referenceExists on this fixture's real protocol write path, and counted the target probe the guard performs. Control: the fourth row below — the same instrument does register a probe when a target resolves, so an empty count is a real absence rather than a blind instrument.

Reading, over the fixture's own writes (saveMetaItem with an actor and without one):

declaration under testguard enteredisSystemtarget probe
referenceTo + readonly: true (as written)yes, twicefalsenone
reference + readonly: true (after the rename)yes, twicefalsenone
referenceTo, readonly removedyes, twicefalsenone
reference, readonly removedyes, twicefalsereferenceExists('sys_user', 'usr_alice')

and directly: referenceTargetOf answers undefined for the referenceTo spelling and 'sys_user' for reference.

So the guard did run here — this is a non-system write, and recorded_by was present both in the caller-supplied payload and in the normalized data. It simply never looked at the field's target, because to the arbiter there was none. The readonly exemption the file's second half claims to exercise is not what admitted these writes; the target-less skip is. Row three is the proof: with the alias spelled, deleting the exemption changes nothing at all.

That is the triage's step 1 answered in its own terms — the exemption has been exercised against a field with no target, not against the case the file says it covers.

Steps 2 and 3 — the rename, and the assertions that had to change with it

Because the branch was never reached, this is not a rename. Two pins are added so the file proves what its header says:

  1. the declaration resolvesreferenceTargetOf(sysMetadataHistoryObject.fields.recorded_by) is 'sys_user'. This is the fidelity claim as an assertion instead of prose. A raw object literal handed to the registry is never parsed by FieldSchema, so the alias could never be refused where it was written ([finding] docs vs driver disagree on whether lookup columns get a real FOREIGN KEY — and the driver branch keys on reference_to, not reference #11567), and nothing in the suite could notice.
  2. an actor id no sys_user row matches is still admitted — the data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 exemption, at the protocol layer where the regression was found. This is not the sys_metadata_history.recorded_bylookup('sys_user') 却存哨兵字符串 'system'——声明的类型与实际存的值不是一回事 #4556 sentinel returning: 'system' was a string the platform minted for every actor-less write, which this suite still refuses; an actor the caller named is the caller's own value, and data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 deliberately does not police a readonly lookup (the residual is reported by the isSystem 写入仍可产生悬空 lookup 引用——需要一条只报告不拦截的巡检(#4441 残留) #4551 audit instead).

The file header now records the measurement in place of the claim it could not support.

Reverse verification — the 2x2

Each cell is the whole suite re-run; mutations were applied with an anchored edit whose landing was proved by counting the injected and the removed text, restored from HEAD under a trap, and both files verified byte-identical to their HEAD blobs afterwards (git hash-object compared to git rev-parse HEAD:path).

celldeclarationreadonly exemption in engine.tsresult
1reference (this PR)present7 passed — control
2referenceTo (rename reverted)presentpin 1 RED, pin 2 green
3reference (this PR)deletedpin 2 RED
4referenceTodeletedpin 2 green (only pin 1 fails, on the alias)

Cells 3 and 4 are the same engine ablation with opposite outcomes, and the only difference between them is the spelling. That is what the rename buys: the exemption becomes load-bearing for this fixture. Cell 2 is the reverse verification for pin 1.

The engine.ts mutation was a measurement only and is not part of this diff, which is one test file. The exemption's engine-layer coverage already exists and is spelled canonically — engine-lookup-referential-integrity.test.ts, "a READONLY lookup is not the caller's to answer for"; this file's protocol-layer half was the vacuous one.

Tests

All at 64f4383eb, the head of this branch. Heavy runs went through scripts/pm/os-verify-lock.sh; exit codes captured after a redirect, never through a pipe.

  • pnpm --filter @objectstack/objectql exec vitest run --maxWorkers=2 src/protocol-recorded-by-null.test.ts — exit 0, Test Files 1 passed (1) / Tests 7 passed (7).
  • pnpm --filter @objectstack/objectql typecheck — exit 0, including check:test-typecheck: OK — @objectstack/objectql's test layer compiles under packages/objectql/tsconfig.test.json; 44 file(s) / 242 error(s) / 69 pinned signature(s) held (the exact per-file ratchet: the new test file adds none).
  • pnpm lint (whole repo, eslint . --no-inline-config) — exit 0, no output. Not narrowed.
  • pnpm check:nul-bytesOK (scanned 7986 text file(s) ... no raw ASCII control bytes). pnpm check:error-status-conformance — exit 0.
  • The gate family re-derived on this tree with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (identical to the dispatch seed): 25 of 28 green, quoted in the report comment on the card.
  • Three answered exit 3, PREREQUISITE NOT MET — not measured, and not a finding: check-test-completeness.mjs ("running the family locally, record this gate as NOT MEASURED" — it grades a saved turbo run test log CI tees), check:dual-build-cjs-loads and check:type-check-debt (both need the whole built closure — "Run pnpm build first. This is NOT a pass: nothing was measured"). All three measure the built world, which a test-only diff does not move; CI runs them after the closure build.
  • node scripts/check-changeset-no-major.mjs — exit 0. skip-changeset: the diff is one test file, publishes nothing, and check:published-files is green with tests excluded from every whitelist.

🤖 Generated with Claude Code

https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68


Generated by Claude Code

…onical `reference` key
`protocol-recorded-by-null.test.ts` declared `recorded_by` as
`{ type: 'lookup', referenceTo: 'sys_user', readonly: true }` under a comment
claiming it is "the real declaration". `referenceTo` is an alias `FieldSchema`
refuses by name, and `referenceTargetOf` — the single arbiter the #4441
write-path referential check resolves through — does not read it, so the lookup
presented as target-less.
Measured on the fixture's own write path before renaming anything, by counting
the guard's target probe: with `referenceTo` spelled, no probe ran even with the
`readonly` exemption removed; with `reference` spelled, it runs. So the
exemption the file's second half claims to exercise had never admitted these
writes — the target-less skip did.
Renames the key and adds the two pins that keep the header's claim honest: the
declaration resolves through `referenceTargetOf`, and an actor id no `sys_user`
row matches is still admitted (which is the exemption, and is now red if the
exemption is deleted).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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 — 0 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 87ad30c103bb4e8c5d7b8a399634b59716f3c21fpackageMentionDocs.

@os-muskos-musk added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed tests labels Sep 2, 2026 — with Claude
@os-musk
os-musk marked this pull request as ready for review September 2, 2026 16:12
@os-musk
os-musk enabled auto-merge September 2, 2026 16:12
@os-muskClaude

Copy link
Copy Markdown
CollaboratorAuthor

Landing provenance (engine execution seat, session session_0112hMx9hjJ9BgB28X97DS68): flipped ready at 16:12Z and armed auto-merge (squash) at 16:12:28Z on head 64f4383eb.

  • Review: ACCEPT on the card, comment 5512386686. Clause-② no, self-read from the diff.
  • Governed-surface test on the one changed path: 0 of 1 governed — ordinary queue landing. skip-changeset, test-only.
  • Enqueue bar: every check run on 64f4383eb completed green or skipped (40 runs read at 16:12Z, perPage: 50). Last standing was Test Core (1/6), 15:49:47Z to 16:09:07Z — 19 minutes, the long shard again; Lint & Repo Gates finished 16:05Z.
  • The auto-merge echo reads method: MERGE — the known shape whatever was passed; the queue build ref is the reading.
  • Landing owed by the seat at MERGED: verify by content on origin/main that recorded_by spells reference: 'sys_user' and that both new pins are present, strip pm:dispatched from protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration" #14535, landing record on the card.

Generated by Claude Code

@os-musk
os-musk added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 1aba315Sep 2, 2026
42 checks passed
@os-musk
os-musk deleted the claude/issue-14535-recorded-by-reference-spelling branch September 2, 2026 18:06
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration"

2 participants

@os-musk@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key - #14633

Merged
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling
Sep 2, 2026
Merged

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key#14633
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling

Conversation

@os-musk

Copy link
Copy Markdown
Collaborator

Fixes#14535

protocol-recorded-by-null.test.ts declared recorded_by as { type: 'lookup', referenceTo: 'sys_user', readonly: true } under a comment claiming it is "the real declaration". The rename is the last step of this change, not its point: the card ruled that what the file's second half has been proving had to be established first, with an instrument rather than a reading.

Step 1 — the instrument, and what it read

referenceTargetOf (packages/spec/src/data/field-value.zod.ts:141) is the single arbiter the #4441 write-path guard resolves a lookup's target through: assertReferencesResolve calls it at packages/objectql/src/engine.ts:5814 and skips the field at if (!target) continue when it answers nothing. It reads the reference key only (plus the implicit target of type: 'user').

Instrument. A temporary probe wrapped the engine's own assertReferencesResolve and referenceExists on this fixture's real protocol write path, and counted the target probe the guard performs. Control: the fourth row below — the same instrument does register a probe when a target resolves, so an empty count is a real absence rather than a blind instrument.

Reading, over the fixture's own writes (saveMetaItem with an actor and without one):

declaration under testguard enteredisSystemtarget probe
referenceTo + readonly: true (as written)yes, twicefalsenone
reference + readonly: true (after the rename)yes, twicefalsenone
referenceTo, readonly removedyes, twicefalsenone
reference, readonly removedyes, twicefalsereferenceExists('sys_user', 'usr_alice')

and directly: referenceTargetOf answers undefined for the referenceTo spelling and 'sys_user' for reference.

So the guard did run here — this is a non-system write, and recorded_by was present both in the caller-supplied payload and in the normalized data. It simply never looked at the field's target, because to the arbiter there was none. The readonly exemption the file's second half claims to exercise is not what admitted these writes; the target-less skip is. Row three is the proof: with the alias spelled, deleting the exemption changes nothing at all.

That is the triage's step 1 answered in its own terms — the exemption has been exercised against a field with no target, not against the case the file says it covers.

Steps 2 and 3 — the rename, and the assertions that had to change with it

Because the branch was never reached, this is not a rename. Two pins are added so the file proves what its header says:

  1. the declaration resolvesreferenceTargetOf(sysMetadataHistoryObject.fields.recorded_by) is 'sys_user'. This is the fidelity claim as an assertion instead of prose. A raw object literal handed to the registry is never parsed by FieldSchema, so the alias could never be refused where it was written ([finding] docs vs driver disagree on whether lookup columns get a real FOREIGN KEY — and the driver branch keys on reference_to, not reference #11567), and nothing in the suite could notice.
  2. an actor id no sys_user row matches is still admitted — the data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 exemption, at the protocol layer where the regression was found. This is not the sys_metadata_history.recorded_bylookup('sys_user') 却存哨兵字符串 'system'——声明的类型与实际存的值不是一回事 #4556 sentinel returning: 'system' was a string the platform minted for every actor-less write, which this suite still refuses; an actor the caller named is the caller's own value, and data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 deliberately does not police a readonly lookup (the residual is reported by the isSystem 写入仍可产生悬空 lookup 引用——需要一条只报告不拦截的巡检(#4441 残留) #4551 audit instead).

The file header now records the measurement in place of the claim it could not support.

Reverse verification — the 2x2

Each cell is the whole suite re-run; mutations were applied with an anchored edit whose landing was proved by counting the injected and the removed text, restored from HEAD under a trap, and both files verified byte-identical to their HEAD blobs afterwards (git hash-object compared to git rev-parse HEAD:path).

celldeclarationreadonly exemption in engine.tsresult
1reference (this PR)present7 passed — control
2referenceTo (rename reverted)presentpin 1 RED, pin 2 green
3reference (this PR)deletedpin 2 RED
4referenceTodeletedpin 2 green (only pin 1 fails, on the alias)

Cells 3 and 4 are the same engine ablation with opposite outcomes, and the only difference between them is the spelling. That is what the rename buys: the exemption becomes load-bearing for this fixture. Cell 2 is the reverse verification for pin 1.

The engine.ts mutation was a measurement only and is not part of this diff, which is one test file. The exemption's engine-layer coverage already exists and is spelled canonically — engine-lookup-referential-integrity.test.ts, "a READONLY lookup is not the caller's to answer for"; this file's protocol-layer half was the vacuous one.

Tests

All at 64f4383eb, the head of this branch. Heavy runs went through scripts/pm/os-verify-lock.sh; exit codes captured after a redirect, never through a pipe.

  • pnpm --filter @objectstack/objectql exec vitest run --maxWorkers=2 src/protocol-recorded-by-null.test.ts — exit 0, Test Files 1 passed (1) / Tests 7 passed (7).
  • pnpm --filter @objectstack/objectql typecheck — exit 0, including check:test-typecheck: OK — @objectstack/objectql's test layer compiles under packages/objectql/tsconfig.test.json; 44 file(s) / 242 error(s) / 69 pinned signature(s) held (the exact per-file ratchet: the new test file adds none).
  • pnpm lint (whole repo, eslint . --no-inline-config) — exit 0, no output. Not narrowed.
  • pnpm check:nul-bytesOK (scanned 7986 text file(s) ... no raw ASCII control bytes). pnpm check:error-status-conformance — exit 0.
  • The gate family re-derived on this tree with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (identical to the dispatch seed): 25 of 28 green, quoted in the report comment on the card.
  • Three answered exit 3, PREREQUISITE NOT MET — not measured, and not a finding: check-test-completeness.mjs ("running the family locally, record this gate as NOT MEASURED" — it grades a saved turbo run test log CI tees), check:dual-build-cjs-loads and check:type-check-debt (both need the whole built closure — "Run pnpm build first. This is NOT a pass: nothing was measured"). All three measure the built world, which a test-only diff does not move; CI runs them after the closure build.
  • node scripts/check-changeset-no-major.mjs — exit 0. skip-changeset: the diff is one test file, publishes nothing, and check:published-files is green with tests excluded from every whitelist.

🤖 Generated with Claude Code

https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68


Generated by Claude Code

…onical `reference` key
`protocol-recorded-by-null.test.ts` declared `recorded_by` as
`{ type: 'lookup', referenceTo: 'sys_user', readonly: true }` under a comment
claiming it is "the real declaration". `referenceTo` is an alias `FieldSchema`
refuses by name, and `referenceTargetOf` — the single arbiter the #4441
write-path referential check resolves through — does not read it, so the lookup
presented as target-less.
Measured on the fixture's own write path before renaming anything, by counting
the guard's target probe: with `referenceTo` spelled, no probe ran even with the
`readonly` exemption removed; with `reference` spelled, it runs. So the
exemption the file's second half claims to exercise had never admitted these
writes — the target-less skip did.
Renames the key and adds the two pins that keep the header's claim honest: the
declaration resolves through `referenceTargetOf`, and an actor id no `sys_user`
row matches is still admitted (which is the exemption, and is now red if the
exemption is deleted).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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 — 0 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 87ad30c103bb4e8c5d7b8a399634b59716f3c21fpackageMentionDocs.

@os-muskos-musk added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed tests labels Sep 2, 2026 — with Claude
@os-musk
os-musk marked this pull request as ready for review September 2, 2026 16:12
@os-musk
os-musk enabled auto-merge September 2, 2026 16:12
@os-muskClaude

Copy link
Copy Markdown
CollaboratorAuthor

Landing provenance (engine execution seat, session session_0112hMx9hjJ9BgB28X97DS68): flipped ready at 16:12Z and armed auto-merge (squash) at 16:12:28Z on head 64f4383eb.

  • Review: ACCEPT on the card, comment 5512386686. Clause-② no, self-read from the diff.
  • Governed-surface test on the one changed path: 0 of 1 governed — ordinary queue landing. skip-changeset, test-only.
  • Enqueue bar: every check run on 64f4383eb completed green or skipped (40 runs read at 16:12Z, perPage: 50). Last standing was Test Core (1/6), 15:49:47Z to 16:09:07Z — 19 minutes, the long shard again; Lint & Repo Gates finished 16:05Z.
  • The auto-merge echo reads method: MERGE — the known shape whatever was passed; the queue build ref is the reading.
  • Landing owed by the seat at MERGED: verify by content on origin/main that recorded_by spells reference: 'sys_user' and that both new pins are present, strip pm:dispatched from protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration" #14535, landing record on the card.

Generated by Claude Code

@os-musk
os-musk added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 1aba315Sep 2, 2026
42 checks passed
@os-musk
os-musk deleted the claude/issue-14535-recorded-by-reference-spelling branch September 2, 2026 18:06
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration"

2 participants

@os-musk@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key - #14633

Merged
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling
Sep 2, 2026
Merged

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key#14633
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling

Conversation

@os-musk

Copy link
Copy Markdown
Collaborator

Fixes#14535

protocol-recorded-by-null.test.ts declared recorded_by as { type: 'lookup', referenceTo: 'sys_user', readonly: true } under a comment claiming it is "the real declaration". The rename is the last step of this change, not its point: the card ruled that what the file's second half has been proving had to be established first, with an instrument rather than a reading.

Step 1 — the instrument, and what it read

referenceTargetOf (packages/spec/src/data/field-value.zod.ts:141) is the single arbiter the #4441 write-path guard resolves a lookup's target through: assertReferencesResolve calls it at packages/objectql/src/engine.ts:5814 and skips the field at if (!target) continue when it answers nothing. It reads the reference key only (plus the implicit target of type: 'user').

Instrument. A temporary probe wrapped the engine's own assertReferencesResolve and referenceExists on this fixture's real protocol write path, and counted the target probe the guard performs. Control: the fourth row below — the same instrument does register a probe when a target resolves, so an empty count is a real absence rather than a blind instrument.

Reading, over the fixture's own writes (saveMetaItem with an actor and without one):

declaration under testguard enteredisSystemtarget probe
referenceTo + readonly: true (as written)yes, twicefalsenone
reference + readonly: true (after the rename)yes, twicefalsenone
referenceTo, readonly removedyes, twicefalsenone
reference, readonly removedyes, twicefalsereferenceExists('sys_user', 'usr_alice')

and directly: referenceTargetOf answers undefined for the referenceTo spelling and 'sys_user' for reference.

So the guard did run here — this is a non-system write, and recorded_by was present both in the caller-supplied payload and in the normalized data. It simply never looked at the field's target, because to the arbiter there was none. The readonly exemption the file's second half claims to exercise is not what admitted these writes; the target-less skip is. Row three is the proof: with the alias spelled, deleting the exemption changes nothing at all.

That is the triage's step 1 answered in its own terms — the exemption has been exercised against a field with no target, not against the case the file says it covers.

Steps 2 and 3 — the rename, and the assertions that had to change with it

Because the branch was never reached, this is not a rename. Two pins are added so the file proves what its header says:

  1. the declaration resolvesreferenceTargetOf(sysMetadataHistoryObject.fields.recorded_by) is 'sys_user'. This is the fidelity claim as an assertion instead of prose. A raw object literal handed to the registry is never parsed by FieldSchema, so the alias could never be refused where it was written ([finding] docs vs driver disagree on whether lookup columns get a real FOREIGN KEY — and the driver branch keys on reference_to, not reference #11567), and nothing in the suite could notice.
  2. an actor id no sys_user row matches is still admitted — the data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 exemption, at the protocol layer where the regression was found. This is not the sys_metadata_history.recorded_bylookup('sys_user') 却存哨兵字符串 'system'——声明的类型与实际存的值不是一回事 #4556 sentinel returning: 'system' was a string the platform minted for every actor-less write, which this suite still refuses; an actor the caller named is the caller's own value, and data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 deliberately does not police a readonly lookup (the residual is reported by the isSystem 写入仍可产生悬空 lookup 引用——需要一条只报告不拦截的巡检(#4441 残留) #4551 audit instead).

The file header now records the measurement in place of the claim it could not support.

Reverse verification — the 2x2

Each cell is the whole suite re-run; mutations were applied with an anchored edit whose landing was proved by counting the injected and the removed text, restored from HEAD under a trap, and both files verified byte-identical to their HEAD blobs afterwards (git hash-object compared to git rev-parse HEAD:path).

celldeclarationreadonly exemption in engine.tsresult
1reference (this PR)present7 passed — control
2referenceTo (rename reverted)presentpin 1 RED, pin 2 green
3reference (this PR)deletedpin 2 RED
4referenceTodeletedpin 2 green (only pin 1 fails, on the alias)

Cells 3 and 4 are the same engine ablation with opposite outcomes, and the only difference between them is the spelling. That is what the rename buys: the exemption becomes load-bearing for this fixture. Cell 2 is the reverse verification for pin 1.

The engine.ts mutation was a measurement only and is not part of this diff, which is one test file. The exemption's engine-layer coverage already exists and is spelled canonically — engine-lookup-referential-integrity.test.ts, "a READONLY lookup is not the caller's to answer for"; this file's protocol-layer half was the vacuous one.

Tests

All at 64f4383eb, the head of this branch. Heavy runs went through scripts/pm/os-verify-lock.sh; exit codes captured after a redirect, never through a pipe.

  • pnpm --filter @objectstack/objectql exec vitest run --maxWorkers=2 src/protocol-recorded-by-null.test.ts — exit 0, Test Files 1 passed (1) / Tests 7 passed (7).
  • pnpm --filter @objectstack/objectql typecheck — exit 0, including check:test-typecheck: OK — @objectstack/objectql's test layer compiles under packages/objectql/tsconfig.test.json; 44 file(s) / 242 error(s) / 69 pinned signature(s) held (the exact per-file ratchet: the new test file adds none).
  • pnpm lint (whole repo, eslint . --no-inline-config) — exit 0, no output. Not narrowed.
  • pnpm check:nul-bytesOK (scanned 7986 text file(s) ... no raw ASCII control bytes). pnpm check:error-status-conformance — exit 0.
  • The gate family re-derived on this tree with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (identical to the dispatch seed): 25 of 28 green, quoted in the report comment on the card.
  • Three answered exit 3, PREREQUISITE NOT MET — not measured, and not a finding: check-test-completeness.mjs ("running the family locally, record this gate as NOT MEASURED" — it grades a saved turbo run test log CI tees), check:dual-build-cjs-loads and check:type-check-debt (both need the whole built closure — "Run pnpm build first. This is NOT a pass: nothing was measured"). All three measure the built world, which a test-only diff does not move; CI runs them after the closure build.
  • node scripts/check-changeset-no-major.mjs — exit 0. skip-changeset: the diff is one test file, publishes nothing, and check:published-files is green with tests excluded from every whitelist.

🤖 Generated with Claude Code

https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68


Generated by Claude Code

…onical `reference` key
`protocol-recorded-by-null.test.ts` declared `recorded_by` as
`{ type: 'lookup', referenceTo: 'sys_user', readonly: true }` under a comment
claiming it is "the real declaration". `referenceTo` is an alias `FieldSchema`
refuses by name, and `referenceTargetOf` — the single arbiter the #4441
write-path referential check resolves through — does not read it, so the lookup
presented as target-less.
Measured on the fixture's own write path before renaming anything, by counting
the guard's target probe: with `referenceTo` spelled, no probe ran even with the
`readonly` exemption removed; with `reference` spelled, it runs. So the
exemption the file's second half claims to exercise had never admitted these
writes — the target-less skip did.
Renames the key and adds the two pins that keep the header's claim honest: the
declaration resolves through `referenceTargetOf`, and an actor id no `sys_user`
row matches is still admitted (which is the exemption, and is now red if the
exemption is deleted).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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 — 0 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 87ad30c103bb4e8c5d7b8a399634b59716f3c21fpackageMentionDocs.

@os-muskos-musk added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed tests labels Sep 2, 2026 — with Claude
@os-musk
os-musk marked this pull request as ready for review September 2, 2026 16:12
@os-musk
os-musk enabled auto-merge September 2, 2026 16:12
@os-muskClaude

Copy link
Copy Markdown
CollaboratorAuthor

Landing provenance (engine execution seat, session session_0112hMx9hjJ9BgB28X97DS68): flipped ready at 16:12Z and armed auto-merge (squash) at 16:12:28Z on head 64f4383eb.

  • Review: ACCEPT on the card, comment 5512386686. Clause-② no, self-read from the diff.
  • Governed-surface test on the one changed path: 0 of 1 governed — ordinary queue landing. skip-changeset, test-only.
  • Enqueue bar: every check run on 64f4383eb completed green or skipped (40 runs read at 16:12Z, perPage: 50). Last standing was Test Core (1/6), 15:49:47Z to 16:09:07Z — 19 minutes, the long shard again; Lint & Repo Gates finished 16:05Z.
  • The auto-merge echo reads method: MERGE — the known shape whatever was passed; the queue build ref is the reading.
  • Landing owed by the seat at MERGED: verify by content on origin/main that recorded_by spells reference: 'sys_user' and that both new pins are present, strip pm:dispatched from protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration" #14535, landing record on the card.

Generated by Claude Code

@os-musk
os-musk added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 1aba315Sep 2, 2026
42 checks passed
@os-musk
os-musk deleted the claude/issue-14535-recorded-by-reference-spelling branch September 2, 2026 18:06
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration"

2 participants

@os-musk@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key - #14633

Merged
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling
Sep 2, 2026
Merged

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key#14633
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling

Conversation

@os-musk

Copy link
Copy Markdown
Collaborator

Fixes#14535

protocol-recorded-by-null.test.ts declared recorded_by as { type: 'lookup', referenceTo: 'sys_user', readonly: true } under a comment claiming it is "the real declaration". The rename is the last step of this change, not its point: the card ruled that what the file's second half has been proving had to be established first, with an instrument rather than a reading.

Step 1 — the instrument, and what it read

referenceTargetOf (packages/spec/src/data/field-value.zod.ts:141) is the single arbiter the #4441 write-path guard resolves a lookup's target through: assertReferencesResolve calls it at packages/objectql/src/engine.ts:5814 and skips the field at if (!target) continue when it answers nothing. It reads the reference key only (plus the implicit target of type: 'user').

Instrument. A temporary probe wrapped the engine's own assertReferencesResolve and referenceExists on this fixture's real protocol write path, and counted the target probe the guard performs. Control: the fourth row below — the same instrument does register a probe when a target resolves, so an empty count is a real absence rather than a blind instrument.

Reading, over the fixture's own writes (saveMetaItem with an actor and without one):

declaration under testguard enteredisSystemtarget probe
referenceTo + readonly: true (as written)yes, twicefalsenone
reference + readonly: true (after the rename)yes, twicefalsenone
referenceTo, readonly removedyes, twicefalsenone
reference, readonly removedyes, twicefalsereferenceExists('sys_user', 'usr_alice')

and directly: referenceTargetOf answers undefined for the referenceTo spelling and 'sys_user' for reference.

So the guard did run here — this is a non-system write, and recorded_by was present both in the caller-supplied payload and in the normalized data. It simply never looked at the field's target, because to the arbiter there was none. The readonly exemption the file's second half claims to exercise is not what admitted these writes; the target-less skip is. Row three is the proof: with the alias spelled, deleting the exemption changes nothing at all.

That is the triage's step 1 answered in its own terms — the exemption has been exercised against a field with no target, not against the case the file says it covers.

Steps 2 and 3 — the rename, and the assertions that had to change with it

Because the branch was never reached, this is not a rename. Two pins are added so the file proves what its header says:

  1. the declaration resolvesreferenceTargetOf(sysMetadataHistoryObject.fields.recorded_by) is 'sys_user'. This is the fidelity claim as an assertion instead of prose. A raw object literal handed to the registry is never parsed by FieldSchema, so the alias could never be refused where it was written ([finding] docs vs driver disagree on whether lookup columns get a real FOREIGN KEY — and the driver branch keys on reference_to, not reference #11567), and nothing in the suite could notice.
  2. an actor id no sys_user row matches is still admitted — the data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 exemption, at the protocol layer where the regression was found. This is not the sys_metadata_history.recorded_bylookup('sys_user') 却存哨兵字符串 'system'——声明的类型与实际存的值不是一回事 #4556 sentinel returning: 'system' was a string the platform minted for every actor-less write, which this suite still refuses; an actor the caller named is the caller's own value, and data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 deliberately does not police a readonly lookup (the residual is reported by the isSystem 写入仍可产生悬空 lookup 引用——需要一条只报告不拦截的巡检(#4441 残留) #4551 audit instead).

The file header now records the measurement in place of the claim it could not support.

Reverse verification — the 2x2

Each cell is the whole suite re-run; mutations were applied with an anchored edit whose landing was proved by counting the injected and the removed text, restored from HEAD under a trap, and both files verified byte-identical to their HEAD blobs afterwards (git hash-object compared to git rev-parse HEAD:path).

celldeclarationreadonly exemption in engine.tsresult
1reference (this PR)present7 passed — control
2referenceTo (rename reverted)presentpin 1 RED, pin 2 green
3reference (this PR)deletedpin 2 RED
4referenceTodeletedpin 2 green (only pin 1 fails, on the alias)

Cells 3 and 4 are the same engine ablation with opposite outcomes, and the only difference between them is the spelling. That is what the rename buys: the exemption becomes load-bearing for this fixture. Cell 2 is the reverse verification for pin 1.

The engine.ts mutation was a measurement only and is not part of this diff, which is one test file. The exemption's engine-layer coverage already exists and is spelled canonically — engine-lookup-referential-integrity.test.ts, "a READONLY lookup is not the caller's to answer for"; this file's protocol-layer half was the vacuous one.

Tests

All at 64f4383eb, the head of this branch. Heavy runs went through scripts/pm/os-verify-lock.sh; exit codes captured after a redirect, never through a pipe.

  • pnpm --filter @objectstack/objectql exec vitest run --maxWorkers=2 src/protocol-recorded-by-null.test.ts — exit 0, Test Files 1 passed (1) / Tests 7 passed (7).
  • pnpm --filter @objectstack/objectql typecheck — exit 0, including check:test-typecheck: OK — @objectstack/objectql's test layer compiles under packages/objectql/tsconfig.test.json; 44 file(s) / 242 error(s) / 69 pinned signature(s) held (the exact per-file ratchet: the new test file adds none).
  • pnpm lint (whole repo, eslint . --no-inline-config) — exit 0, no output. Not narrowed.
  • pnpm check:nul-bytesOK (scanned 7986 text file(s) ... no raw ASCII control bytes). pnpm check:error-status-conformance — exit 0.
  • The gate family re-derived on this tree with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (identical to the dispatch seed): 25 of 28 green, quoted in the report comment on the card.
  • Three answered exit 3, PREREQUISITE NOT MET — not measured, and not a finding: check-test-completeness.mjs ("running the family locally, record this gate as NOT MEASURED" — it grades a saved turbo run test log CI tees), check:dual-build-cjs-loads and check:type-check-debt (both need the whole built closure — "Run pnpm build first. This is NOT a pass: nothing was measured"). All three measure the built world, which a test-only diff does not move; CI runs them after the closure build.
  • node scripts/check-changeset-no-major.mjs — exit 0. skip-changeset: the diff is one test file, publishes nothing, and check:published-files is green with tests excluded from every whitelist.

🤖 Generated with Claude Code

https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68


Generated by Claude Code

…onical `reference` key
`protocol-recorded-by-null.test.ts` declared `recorded_by` as
`{ type: 'lookup', referenceTo: 'sys_user', readonly: true }` under a comment
claiming it is "the real declaration". `referenceTo` is an alias `FieldSchema`
refuses by name, and `referenceTargetOf` — the single arbiter the #4441
write-path referential check resolves through — does not read it, so the lookup
presented as target-less.
Measured on the fixture's own write path before renaming anything, by counting
the guard's target probe: with `referenceTo` spelled, no probe ran even with the
`readonly` exemption removed; with `reference` spelled, it runs. So the
exemption the file's second half claims to exercise had never admitted these
writes — the target-less skip did.
Renames the key and adds the two pins that keep the header's claim honest: the
declaration resolves through `referenceTargetOf`, and an actor id no `sys_user`
row matches is still admitted (which is the exemption, and is now red if the
exemption is deleted).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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 — 0 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 87ad30c103bb4e8c5d7b8a399634b59716f3c21fpackageMentionDocs.

@os-muskos-musk added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed tests labels Sep 2, 2026 — with Claude
@os-musk
os-musk marked this pull request as ready for review September 2, 2026 16:12
@os-musk
os-musk enabled auto-merge September 2, 2026 16:12
@os-muskClaude

Copy link
Copy Markdown
CollaboratorAuthor

Landing provenance (engine execution seat, session session_0112hMx9hjJ9BgB28X97DS68): flipped ready at 16:12Z and armed auto-merge (squash) at 16:12:28Z on head 64f4383eb.

  • Review: ACCEPT on the card, comment 5512386686. Clause-② no, self-read from the diff.
  • Governed-surface test on the one changed path: 0 of 1 governed — ordinary queue landing. skip-changeset, test-only.
  • Enqueue bar: every check run on 64f4383eb completed green or skipped (40 runs read at 16:12Z, perPage: 50). Last standing was Test Core (1/6), 15:49:47Z to 16:09:07Z — 19 minutes, the long shard again; Lint & Repo Gates finished 16:05Z.
  • The auto-merge echo reads method: MERGE — the known shape whatever was passed; the queue build ref is the reading.
  • Landing owed by the seat at MERGED: verify by content on origin/main that recorded_by spells reference: 'sys_user' and that both new pins are present, strip pm:dispatched from protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration" #14535, landing record on the card.

Generated by Claude Code

@os-musk
os-musk added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 1aba315Sep 2, 2026
42 checks passed
@os-musk
os-musk deleted the claude/issue-14535-recorded-by-reference-spelling branch September 2, 2026 18:06
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration"

2 participants

@os-musk@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key - #14633

Merged
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling
Sep 2, 2026
Merged

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key#14633
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling

Conversation

@os-musk

Copy link
Copy Markdown
Collaborator

Fixes#14535

protocol-recorded-by-null.test.ts declared recorded_by as { type: 'lookup', referenceTo: 'sys_user', readonly: true } under a comment claiming it is "the real declaration". The rename is the last step of this change, not its point: the card ruled that what the file's second half has been proving had to be established first, with an instrument rather than a reading.

Step 1 — the instrument, and what it read

referenceTargetOf (packages/spec/src/data/field-value.zod.ts:141) is the single arbiter the #4441 write-path guard resolves a lookup's target through: assertReferencesResolve calls it at packages/objectql/src/engine.ts:5814 and skips the field at if (!target) continue when it answers nothing. It reads the reference key only (plus the implicit target of type: 'user').

Instrument. A temporary probe wrapped the engine's own assertReferencesResolve and referenceExists on this fixture's real protocol write path, and counted the target probe the guard performs. Control: the fourth row below — the same instrument does register a probe when a target resolves, so an empty count is a real absence rather than a blind instrument.

Reading, over the fixture's own writes (saveMetaItem with an actor and without one):

declaration under testguard enteredisSystemtarget probe
referenceTo + readonly: true (as written)yes, twicefalsenone
reference + readonly: true (after the rename)yes, twicefalsenone
referenceTo, readonly removedyes, twicefalsenone
reference, readonly removedyes, twicefalsereferenceExists('sys_user', 'usr_alice')

and directly: referenceTargetOf answers undefined for the referenceTo spelling and 'sys_user' for reference.

So the guard did run here — this is a non-system write, and recorded_by was present both in the caller-supplied payload and in the normalized data. It simply never looked at the field's target, because to the arbiter there was none. The readonly exemption the file's second half claims to exercise is not what admitted these writes; the target-less skip is. Row three is the proof: with the alias spelled, deleting the exemption changes nothing at all.

That is the triage's step 1 answered in its own terms — the exemption has been exercised against a field with no target, not against the case the file says it covers.

Steps 2 and 3 — the rename, and the assertions that had to change with it

Because the branch was never reached, this is not a rename. Two pins are added so the file proves what its header says:

  1. the declaration resolvesreferenceTargetOf(sysMetadataHistoryObject.fields.recorded_by) is 'sys_user'. This is the fidelity claim as an assertion instead of prose. A raw object literal handed to the registry is never parsed by FieldSchema, so the alias could never be refused where it was written ([finding] docs vs driver disagree on whether lookup columns get a real FOREIGN KEY — and the driver branch keys on reference_to, not reference #11567), and nothing in the suite could notice.
  2. an actor id no sys_user row matches is still admitted — the data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 exemption, at the protocol layer where the regression was found. This is not the sys_metadata_history.recorded_bylookup('sys_user') 却存哨兵字符串 'system'——声明的类型与实际存的值不是一回事 #4556 sentinel returning: 'system' was a string the platform minted for every actor-less write, which this suite still refuses; an actor the caller named is the caller's own value, and data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 deliberately does not police a readonly lookup (the residual is reported by the isSystem 写入仍可产生悬空 lookup 引用——需要一条只报告不拦截的巡检(#4441 残留) #4551 audit instead).

The file header now records the measurement in place of the claim it could not support.

Reverse verification — the 2x2

Each cell is the whole suite re-run; mutations were applied with an anchored edit whose landing was proved by counting the injected and the removed text, restored from HEAD under a trap, and both files verified byte-identical to their HEAD blobs afterwards (git hash-object compared to git rev-parse HEAD:path).

celldeclarationreadonly exemption in engine.tsresult
1reference (this PR)present7 passed — control
2referenceTo (rename reverted)presentpin 1 RED, pin 2 green
3reference (this PR)deletedpin 2 RED
4referenceTodeletedpin 2 green (only pin 1 fails, on the alias)

Cells 3 and 4 are the same engine ablation with opposite outcomes, and the only difference between them is the spelling. That is what the rename buys: the exemption becomes load-bearing for this fixture. Cell 2 is the reverse verification for pin 1.

The engine.ts mutation was a measurement only and is not part of this diff, which is one test file. The exemption's engine-layer coverage already exists and is spelled canonically — engine-lookup-referential-integrity.test.ts, "a READONLY lookup is not the caller's to answer for"; this file's protocol-layer half was the vacuous one.

Tests

All at 64f4383eb, the head of this branch. Heavy runs went through scripts/pm/os-verify-lock.sh; exit codes captured after a redirect, never through a pipe.

  • pnpm --filter @objectstack/objectql exec vitest run --maxWorkers=2 src/protocol-recorded-by-null.test.ts — exit 0, Test Files 1 passed (1) / Tests 7 passed (7).
  • pnpm --filter @objectstack/objectql typecheck — exit 0, including check:test-typecheck: OK — @objectstack/objectql's test layer compiles under packages/objectql/tsconfig.test.json; 44 file(s) / 242 error(s) / 69 pinned signature(s) held (the exact per-file ratchet: the new test file adds none).
  • pnpm lint (whole repo, eslint . --no-inline-config) — exit 0, no output. Not narrowed.
  • pnpm check:nul-bytesOK (scanned 7986 text file(s) ... no raw ASCII control bytes). pnpm check:error-status-conformance — exit 0.
  • The gate family re-derived on this tree with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (identical to the dispatch seed): 25 of 28 green, quoted in the report comment on the card.
  • Three answered exit 3, PREREQUISITE NOT MET — not measured, and not a finding: check-test-completeness.mjs ("running the family locally, record this gate as NOT MEASURED" — it grades a saved turbo run test log CI tees), check:dual-build-cjs-loads and check:type-check-debt (both need the whole built closure — "Run pnpm build first. This is NOT a pass: nothing was measured"). All three measure the built world, which a test-only diff does not move; CI runs them after the closure build.
  • node scripts/check-changeset-no-major.mjs — exit 0. skip-changeset: the diff is one test file, publishes nothing, and check:published-files is green with tests excluded from every whitelist.

🤖 Generated with Claude Code

https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68


Generated by Claude Code

…onical `reference` key
`protocol-recorded-by-null.test.ts` declared `recorded_by` as
`{ type: 'lookup', referenceTo: 'sys_user', readonly: true }` under a comment
claiming it is "the real declaration". `referenceTo` is an alias `FieldSchema`
refuses by name, and `referenceTargetOf` — the single arbiter the #4441
write-path referential check resolves through — does not read it, so the lookup
presented as target-less.
Measured on the fixture's own write path before renaming anything, by counting
the guard's target probe: with `referenceTo` spelled, no probe ran even with the
`readonly` exemption removed; with `reference` spelled, it runs. So the
exemption the file's second half claims to exercise had never admitted these
writes — the target-less skip did.
Renames the key and adds the two pins that keep the header's claim honest: the
declaration resolves through `referenceTargetOf`, and an actor id no `sys_user`
row matches is still admitted (which is the exemption, and is now red if the
exemption is deleted).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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 — 0 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 87ad30c103bb4e8c5d7b8a399634b59716f3c21fpackageMentionDocs.

@os-muskos-musk added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed tests labels Sep 2, 2026 — with Claude
@os-musk
os-musk marked this pull request as ready for review September 2, 2026 16:12
@os-musk
os-musk enabled auto-merge September 2, 2026 16:12
@os-muskClaude

Copy link
Copy Markdown
CollaboratorAuthor

Landing provenance (engine execution seat, session session_0112hMx9hjJ9BgB28X97DS68): flipped ready at 16:12Z and armed auto-merge (squash) at 16:12:28Z on head 64f4383eb.

  • Review: ACCEPT on the card, comment 5512386686. Clause-② no, self-read from the diff.
  • Governed-surface test on the one changed path: 0 of 1 governed — ordinary queue landing. skip-changeset, test-only.
  • Enqueue bar: every check run on 64f4383eb completed green or skipped (40 runs read at 16:12Z, perPage: 50). Last standing was Test Core (1/6), 15:49:47Z to 16:09:07Z — 19 minutes, the long shard again; Lint & Repo Gates finished 16:05Z.
  • The auto-merge echo reads method: MERGE — the known shape whatever was passed; the queue build ref is the reading.
  • Landing owed by the seat at MERGED: verify by content on origin/main that recorded_by spells reference: 'sys_user' and that both new pins are present, strip pm:dispatched from protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration" #14535, landing record on the card.

Generated by Claude Code

@os-musk
os-musk added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 1aba315Sep 2, 2026
42 checks passed
@os-musk
os-musk deleted the claude/issue-14535-recorded-by-reference-spelling branch September 2, 2026 18:06
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration"

2 participants

@os-musk@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key - #14633

Merged
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling
Sep 2, 2026
Merged

test(objectql): declare the recorded-by fixture's lookup with the canonical reference key#14633
os-musk merged 2 commits into
mainfrom
claude/issue-14535-recorded-by-reference-spelling

Conversation

@os-musk

Copy link
Copy Markdown
Collaborator

Fixes#14535

protocol-recorded-by-null.test.ts declared recorded_by as { type: 'lookup', referenceTo: 'sys_user', readonly: true } under a comment claiming it is "the real declaration". The rename is the last step of this change, not its point: the card ruled that what the file's second half has been proving had to be established first, with an instrument rather than a reading.

Step 1 — the instrument, and what it read

referenceTargetOf (packages/spec/src/data/field-value.zod.ts:141) is the single arbiter the #4441 write-path guard resolves a lookup's target through: assertReferencesResolve calls it at packages/objectql/src/engine.ts:5814 and skips the field at if (!target) continue when it answers nothing. It reads the reference key only (plus the implicit target of type: 'user').

Instrument. A temporary probe wrapped the engine's own assertReferencesResolve and referenceExists on this fixture's real protocol write path, and counted the target probe the guard performs. Control: the fourth row below — the same instrument does register a probe when a target resolves, so an empty count is a real absence rather than a blind instrument.

Reading, over the fixture's own writes (saveMetaItem with an actor and without one):

declaration under testguard enteredisSystemtarget probe
referenceTo + readonly: true (as written)yes, twicefalsenone
reference + readonly: true (after the rename)yes, twicefalsenone
referenceTo, readonly removedyes, twicefalsenone
reference, readonly removedyes, twicefalsereferenceExists('sys_user', 'usr_alice')

and directly: referenceTargetOf answers undefined for the referenceTo spelling and 'sys_user' for reference.

So the guard did run here — this is a non-system write, and recorded_by was present both in the caller-supplied payload and in the normalized data. It simply never looked at the field's target, because to the arbiter there was none. The readonly exemption the file's second half claims to exercise is not what admitted these writes; the target-less skip is. Row three is the proof: with the alias spelled, deleting the exemption changes nothing at all.

That is the triage's step 1 answered in its own terms — the exemption has been exercised against a field with no target, not against the case the file says it covers.

Steps 2 and 3 — the rename, and the assertions that had to change with it

Because the branch was never reached, this is not a rename. Two pins are added so the file proves what its header says:

  1. the declaration resolvesreferenceTargetOf(sysMetadataHistoryObject.fields.recorded_by) is 'sys_user'. This is the fidelity claim as an assertion instead of prose. A raw object literal handed to the registry is never parsed by FieldSchema, so the alias could never be refused where it was written ([finding] docs vs driver disagree on whether lookup columns get a real FOREIGN KEY — and the driver branch keys on reference_to, not reference #11567), and nothing in the suite could notice.
  2. an actor id no sys_user row matches is still admitted — the data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 exemption, at the protocol layer where the regression was found. This is not the sys_metadata_history.recorded_bylookup('sys_user') 却存哨兵字符串 'system'——声明的类型与实际存的值不是一回事 #4556 sentinel returning: 'system' was a string the platform minted for every actor-less write, which this suite still refuses; an actor the caller named is the caller's own value, and data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441 deliberately does not police a readonly lookup (the residual is reported by the isSystem 写入仍可产生悬空 lookup 引用——需要一条只报告不拦截的巡检(#4441 残留) #4551 audit instead).

The file header now records the measurement in place of the claim it could not support.

Reverse verification — the 2x2

Each cell is the whole suite re-run; mutations were applied with an anchored edit whose landing was proved by counting the injected and the removed text, restored from HEAD under a trap, and both files verified byte-identical to their HEAD blobs afterwards (git hash-object compared to git rev-parse HEAD:path).

celldeclarationreadonly exemption in engine.tsresult
1reference (this PR)present7 passed — control
2referenceTo (rename reverted)presentpin 1 RED, pin 2 green
3reference (this PR)deletedpin 2 RED
4referenceTodeletedpin 2 green (only pin 1 fails, on the alias)

Cells 3 and 4 are the same engine ablation with opposite outcomes, and the only difference between them is the spelling. That is what the rename buys: the exemption becomes load-bearing for this fixture. Cell 2 is the reverse verification for pin 1.

The engine.ts mutation was a measurement only and is not part of this diff, which is one test file. The exemption's engine-layer coverage already exists and is spelled canonically — engine-lookup-referential-integrity.test.ts, "a READONLY lookup is not the caller's to answer for"; this file's protocol-layer half was the vacuous one.

Tests

All at 64f4383eb, the head of this branch. Heavy runs went through scripts/pm/os-verify-lock.sh; exit codes captured after a redirect, never through a pipe.

  • pnpm --filter @objectstack/objectql exec vitest run --maxWorkers=2 src/protocol-recorded-by-null.test.ts — exit 0, Test Files 1 passed (1) / Tests 7 passed (7).
  • pnpm --filter @objectstack/objectql typecheck — exit 0, including check:test-typecheck: OK — @objectstack/objectql's test layer compiles under packages/objectql/tsconfig.test.json; 44 file(s) / 242 error(s) / 69 pinned signature(s) held (the exact per-file ratchet: the new test file adds none).
  • pnpm lint (whole repo, eslint . --no-inline-config) — exit 0, no output. Not narrowed.
  • pnpm check:nul-bytesOK (scanned 7986 text file(s) ... no raw ASCII control bytes). pnpm check:error-status-conformance — exit 0.
  • The gate family re-derived on this tree with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (identical to the dispatch seed): 25 of 28 green, quoted in the report comment on the card.
  • Three answered exit 3, PREREQUISITE NOT MET — not measured, and not a finding: check-test-completeness.mjs ("running the family locally, record this gate as NOT MEASURED" — it grades a saved turbo run test log CI tees), check:dual-build-cjs-loads and check:type-check-debt (both need the whole built closure — "Run pnpm build first. This is NOT a pass: nothing was measured"). All three measure the built world, which a test-only diff does not move; CI runs them after the closure build.
  • node scripts/check-changeset-no-major.mjs — exit 0. skip-changeset: the diff is one test file, publishes nothing, and check:published-files is green with tests excluded from every whitelist.

🤖 Generated with Claude Code

https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68


Generated by Claude Code

…onical `reference` key
`protocol-recorded-by-null.test.ts` declared `recorded_by` as
`{ type: 'lookup', referenceTo: 'sys_user', readonly: true }` under a comment
claiming it is "the real declaration". `referenceTo` is an alias `FieldSchema`
refuses by name, and `referenceTargetOf` — the single arbiter the #4441
write-path referential check resolves through — does not read it, so the lookup
presented as target-less.
Measured on the fixture's own write path before renaming anything, by counting
the guard's target probe: with `referenceTo` spelled, no probe ran even with the
`readonly` exemption removed; with `reference` spelled, it runs. So the
exemption the file's second half claims to exercise had never admitted these
writes — the target-less skip did.
Renames the key and adds the two pins that keep the header's claim honest: the
declaration resolves through `referenceTargetOf`, and an actor id no `sys_user`
row matches is still admitted (which is the exemption, and is now red if the
exemption is deleted).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0112hMx9hjJ9BgB28X97DS68
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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 — 0 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 87ad30c103bb4e8c5d7b8a399634b59716f3c21fpackageMentionDocs.

@os-muskos-musk added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed tests labels Sep 2, 2026 — with Claude
@os-musk
os-musk marked this pull request as ready for review September 2, 2026 16:12
@os-musk
os-musk enabled auto-merge September 2, 2026 16:12
@os-muskClaude

Copy link
Copy Markdown
CollaboratorAuthor

Landing provenance (engine execution seat, session session_0112hMx9hjJ9BgB28X97DS68): flipped ready at 16:12Z and armed auto-merge (squash) at 16:12:28Z on head 64f4383eb.

  • Review: ACCEPT on the card, comment 5512386686. Clause-② no, self-read from the diff.
  • Governed-surface test on the one changed path: 0 of 1 governed — ordinary queue landing. skip-changeset, test-only.
  • Enqueue bar: every check run on 64f4383eb completed green or skipped (40 runs read at 16:12Z, perPage: 50). Last standing was Test Core (1/6), 15:49:47Z to 16:09:07Z — 19 minutes, the long shard again; Lint & Repo Gates finished 16:05Z.
  • The auto-merge echo reads method: MERGE — the known shape whatever was passed; the queue build ref is the reading.
  • Landing owed by the seat at MERGED: verify by content on origin/main that recorded_by spells reference: 'sys_user' and that both new pins are present, strip pm:dispatched from protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration" #14535, landing record on the card.

Generated by Claude Code

@os-musk
os-musk added this pull request to the merge queueSep 2, 2026
Merged via the queue into main with commit 1aba315Sep 2, 2026
42 checks passed
@os-musk
os-musk deleted the claude/issue-14535-recorded-by-reference-spelling branch September 2, 2026 18:06
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

protocol-recorded-by-null.test.ts declares recorded_by with the rejected alias referenceTo under a comment claiming it is "the real declaration"

2 participants

@os-musk@claude