Skip to content

fix(engine): six user-facing strings say "authored in this system", not "this environment" - #24401

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-24360-engine-copy-this-system
Oct 18, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-24360-engine-copy-this-system

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #24360

Clause-②: no (copy only: no accept set or public surface moves; owes the seat's review of record at TIER_DEFAULT before the queue)

What changed

objectstack-ai/cloud#3002 ruling A, read per string as triage 6250167038 does: inside the running system, a user-facing string names the system the user is in as "this system". A string that means "made here, not from a package" reads "authored in this system". Six strings in the domain:engine lane said "authored in this environment":

package site (by symbol) now reads
@objectstack/objectql describeDefaultRecordPageHolder (default-record-page.ts) page "NAME", authored in this system
@objectstack/objectql describeSecurityCatalogHolder, the environment case (security-catalog-namespace.ts) the environment catalog (an item authored in this system, not shipped by a package)
@objectstack/metadata-protocol protectionBlockRefusal (protocol.ts) "... is authored in this system (ADR-0010 §3.5) ..."
@objectstack/metadata-protocol the lock-family-key refusal (protocol.ts) "an item saved here is authored in this system (ADR-0010 §3.5) ..."
@objectstack/metadata-protocol the default-record-page conflict's describe holder text (protocol.ts) page 'NAME', authored in this system
@objectstack/platform-objects sys_metadata_activation, package_id field description "... Empty when no package ships it: an item authored in this system."

Also sys_metadata_activation's object description (the claim's optional line, about :75): "Packaged artifacts and positions or permission sets authored in this system are both recorded here." It is user-facing: it is the object's schema text shown wherever the object is described, and the comment above it (ADR-0126 §4) already treats it as copy, not reference. The phrase means "made here, not from a package", so it follows row 1.

"The environment catalog" stays. It is the documented name of that holder: ADR-0048 lists it as a holder by that name, the namespace's own docblock names it, the published @objectstack/objectql changelog uses it, and the envelope's existingHolder.kind is 'environment'. Only the parenthesis changes, per triage row 6.

No code, status, error code or envelope field changes. Three patch changesets, one per published package.

Pins

  • default-record-page-save-door.test.ts (two assertions) and registry-default-record-page.test.ts (one helper) pin the refusal's first sentence, on top of code + status + the structured existing / incoming holders. That sentence names both holders, which is the refusal's stated contract, so the pins move with the text rather than being loosened.
  • The flipped pins carry weight. Reverse verification on the committed fix 2c06b1a, each leg a mutation through scripts/ablation-replace.mjs that put "authored in this environment" back:
    • default-record-page.ts (src-resolved): registry-default-record-page.test.ts went 1 failed | 21 passed; restored blob equals the HEAD blob (508f9a49e1ef).
    • protocol.ts (resolved through @objectstack/metadata-protocol's dist/): rebuilt, ablation-dist-preflight confirmed the marker in dist/, default-record-page-save-door.test.ts went 4 failed | 30 passed; restored (blob 6abd847e4dfa equals HEAD), rebuilt, preflight --absent exit 0, 34 passed.
  • No test, fixture, platform-checklist item or docs page pins or quotes the other four strings. The lock-refusal tests pin substrings that survive (Remove the \protection` block, code package's source, They would ...`). No i18n bundle or reference page carries any of the six, so nothing was regenerated.

Verification (head 6ec1757, after merging origin/main d8e11b5)

  • Build: --filter closure of the three packages, VERDICT command-exit 0, on the pre-merge head and again on the merged head. Full pnpm build --concurrency=2: 76 successful, 76 total.
  • Typecheck, merged head: @objectstack/objectql exit 0 (check:test-typecheck: OK), @objectstack/metadata-protocol exit 0, @objectstack/platform-objects exit 0 (check:test-typecheck: OK).
  • Tests, on 2c06b1a (the merge brought no file in these packages or packages/spec):
    • @objectstack/platform-objects: Test Files 76 passed (76), Tests 1176 passed (1176).
    • @objectstack/metadata-protocol: Test Files 246 passed | 3 skipped (249), Tests 20655 passed | 19 skipped (20674).
    • @objectstack/objectql (all vitest projects): Test Files 445 passed (445), Tests 8359 passed (8359).
  • Gates: node scripts/pm/dispatch-gates.mjs --commands (no paths) on 6ec1757 derived 71 commands; all 71 exit 0. check:dual-build-cjs-loads and check:i18n first exited 3 (PREREQUISITE NOT MET, unbuilt packages) and exit 0 after the full build. --ran: Run reconciliation — 71 derived, 71 run, 0 NOT-MEASURED, 0 UNRUN (all 71 carry a recorded exit code).
  • pnpm exec eslint --no-inline-config over the six changed .ts files: exit 0. check-nul-bytes: exit 0.
  • test:repo not run locally (CI Test Core).

Acceptance notes

Durable attribution: os-dev run for #24360, cloud session session_01Vp3Ze7Vv9L1PuejcRQC2bK, dispatched by the domain:engine seat 1 PM (session_01JtSQQ3EWsbNPzyYMug1tXy).


Generated by Claude Code

…ot "this environment"

Inside the running system, user-facing copy names the system the user is in
as "this system"; an item made here rather than shipped by a package reads
"authored in this system".

- objectql: the default-record-page holder text and the security-catalog
  environment holder's parenthesis ("the environment catalog" stays: it is
  the holder's documented name in ADR-0048 and the namespace docblock).
- metadata-protocol: the protection-block and lock-family-key refusals and
  the default-record-page conflict's holder text.
- platform-objects: sys_metadata_activation's object description and its
  package_id field description.

The two objectql tests that pin the refusal's first sentence move with it.
No code, status, error code or envelope field changes.

Claude-Session: https://claude.ai/code/session_01Vp3Ze7Vv9L1PuejcRQC2bK
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tests tooling labels Oct 18, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

6 anchor(s) derived from 3 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run.

What this run could not see
  • 1 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 54 of 206 client-bound route-ledger rows — the other 152 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 152: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 97 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • 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.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 26 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 d79dc4883c5698cf05680a545758bdbba0d8a7a2 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 63bb38fb8971153e5538b18dc08237fa883b9a9d — the merge of head 6ec17574837b617925bd708d8b4c5fd4c00705d5 into base d79dc4883c5698cf05680a545758bdbba0d8a7a2, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 63bb38fb8971153e5538b18dc08237fa883b9a9d && git checkout 63bb38fb8971153e5538b18dc08237fa883b9a9d
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin d79dc4883c5698cf05680a545758bdbba0d8a7a2 6ec17574837b617925bd708d8b4c5fd4c00705d5 && git checkout -B drift-repro d79dc4883c5698cf05680a545758bdbba0d8a7a2 && git merge --no-ff 6ec17574837b617925bd708d8b4c5fd4c00705d5

node scripts/docs-audit/affected-docs.mjs --json d79dc4883c5698cf05680a545758bdbba0d8a7a2

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: TIER_DEFAULT
Head-sha: 6ec17574837b617925bd708d8b4c5fd4c00705d5
Local-runs: none

What this record read:

① Derived judgments

The change: copy only, right. Every hunk under packages/ changes text inside a string literal and nothing else: the diff's changed lines carry no token other than the moved phrase. The seven strings now read "authored in this system":

  • metadata-protocol: the protection-block refusal, the lock-family-key refusal, and the default-record-page conflict's holder text;
  • objectql: describeDefaultRecordPageHolder, and describeSecurityCatalogHolder's environment case;
  • platform-objects: sys_metadata_activation's object description and its package_id field description.

Each is user-visible: a refusal message on the save door, a holder named in a DEFAULT_RECORD_PAGE_CONFLICT / NAMESPACE_CONFLICT message, or schema text shown wherever the object is described. Each means "made here, not from a package", the reading cloud#3002 ruling A prescribes. No error code, status, issues[] entry, envelope field (existingHolder: { kind: 'environment' } included) or stored value moves.

"The environment catalog" kept: right (open question 1, A). It is the holder's documented name in ADR-0048 (:816) and the namespace docblock, and the envelope's kind: 'environment' spells the same holder. Renaming one string would fork the vocabulary from the ADR and the wire. Only its parenthesis moves.

The object description: in scope, right (open question 2, A). The claim allowed it if user-facing. It is the object's schema text, its ADR-0126 §4 comment already treats it as copy, and it carries the same sense.

The pins: flipped, not loosened, and they bear load (open question 3, A). The three first-sentence pins assert the refusal's text beside the code and the structured holders, which stay. Reverse verification on the committed fix:

  • default-record-page.ts back to the old phrase: registry-default-record-page.test.ts 1 failed;
  • protocol.ts's holder back, rebuilt and preflighted through the dist: default-record-page-save-door.test.ts 4 failed.
    Each restore read back as the HEAD blob.

What stays on the head with the old phrase, none of it this card's:

  • code comments (default-record-page.ts:33, security-catalog-namespace.ts:32), ruled out by the claim;
  • .changeset/pre/* and CHANGELOG lines for releases already cut;
  • ADR-0048's prose;
  • content/docs/permissions/permission-sets.mdx (:369, :422) and the refusal in packages/spec/src/security/permission-set-owner-binding.ts:127, both in #24368's family;
  • the uninstall refusal at protocol.ts:27354 ("… removes every row bound to the package in this environment …"). It sits outside this card's table, and #24368's body does not list it (③).

② Semver level

Three patch changesets, one per touched package (metadata-protocol, objectql, platform-objects), each Clause-②: no. That matches the claim and the PR body. Message wording moves no accept set, declaration or door answer: the codes and envelopes a consumer branches on are byte-identical. Right.

③ Boundary flags

  • Deviations, all accepted.
    • The gate list was re-derived on the merged head as 71 commands (the dispatch's 54 were on an older tree with four paths), and all 71 were run.
    • A full build met the prerequisite of check:dual-build-cjs-loads and check:i18n, which first exited 3 (PREREQUISITE NOT MET); both then exited 0.
    • objectql's full suite ran over every vitest project, a superset of its script.
    • The model-free trailer pair from AGENTS.md was used.
  • open_questions: the three, each settled A as above.
  • out_of_scope_findings:
    • The uninstall refusal (protocol.ts:27354) is a client-visible string in this seat's file, outside #24368's listed set. Its "environment" contrasts the deployment with an organisation scope, so the reading is the family card's call. The seat points #24368 at it; it is not filed.
    • The operator log at :28804 and the two docblocks are not user-facing; ruled out.
  • CI: 40 check-runs on 6ec1757, 34 success, 6 skipped (the rostered path and opt-in skips), 0 failed.

Implemented-by: claude/issue-24360-engine-copy-this-system
Reviewed-by: session_01JtSQQ3EWsbNPzyYMug1tXy

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · domain:engine seat 1 · session_01JtSQQ3EWsbNPzyYMug1tXy · 2026-10-18T22:35Z · ACCEPT

Head: 6ec1757483 (the fix and its pins, then a merge of main). Card #24360 (p2, area:i18n), claim 6255137971, dispatch 6255164609. Dev report: 6255699134.

Item Reading
Shape Draft PR → main. The body opens Fixes #24360. 9 files, +40 / −10. Not governed (check-governed-merges.mjs --pr 24401: 0 of 9 paths hit the register).
Scope Seven user-visible strings say "authored in this system": two lock refusals and a holder text in metadata-protocol/src/protocol.ts; two holder texts in objectql (default-record-page.ts, security-catalog-namespace.ts); and sys_metadata_activation's object and package_id descriptions. Two objectql test files flip their pins. Three patch changesets. Nothing in packages/runtime (#24327) or in protocol.ts's duplicatePackage region (#23561).
Seat's own read The record's own: every hunk under packages/ changes text inside a string literal only. No code, error code, status or envelope field moves. existingHolder.kind stays 'environment'.
Review TIER_DEFAULT record of record 6256001058 on this head: PASS, in-seat.
Declaration Clause-②: no on the claim, the PR body and all three changesets. Copy only.
Pins and ablation The three first-sentence pins stay on top of the code and holder assertions. Reverse verification turned registry-default-record-page.test.ts red (1) and, through the dist, default-record-page-save-door.test.ts red (4). Each restore read back as the HEAD blob.
Gates Dev at 6ec1757483: 71 derived, 71 run, 0 NOT MEASURED. Typecheck exit 0 for objectql, metadata-protocol and platform-objects.
CI 40 check-runs on 6ec1757483: 34 success, 6 skipped, 0 failed. The skips are the rostered path and opt-in skips. Test Core 1/6–6/6, every Type Check lane, Lint & Repo Gates, Check Changeset and Governed Surface Queue Guard are green.

Disposition:

Landing: ordinary queue (pr_ready + automerge_enable through the relay). Fixes #24360 then closes the card.


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 18, 2026 22:36
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 18, 2026 22:36
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 18, 2026
Merged via the queue into main with commit cf540a7 Oct 18, 2026
41 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-24360-engine-copy-this-system branch October 18, 2026 23:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tests tooling

Projects

None yet

2 participants