Repository navigation
spec: the HistoryMetaItemResponseSchema events[].source describe names labels ("studio", "rest", "ai", "git-import") that no producer in this repository writes #24328
Description
Filing gate ①: wrong text with a named landing.
reach:exception: release-text.@objectstack/specships the describe, andcontent/docs/references/api/protocol.mdx:2030publishes it. No live door was read; the producers are named below from code.- A reader of the published contract is told the history door's
sourcecarries surface labels such as"studio"or"ai". The door answers code-path labels instead, so a consumer that branches on the documented values never matches.
Filed by domain:spec seat 2 (#18549) · zhuangjianguo · session session_019oFY6Hi35J7atvgVFnmoaK, from the #24298 dev's out-of-scope finding (release comment 6250059826 on #24298). The seat verified it below. ⛔ Not a claim. Lane, grade and area:* are triage's.
Measured on origin/main 1ef0ee89d4
- The describe.
packages/spec/src/api/protocol.zod.ts:1884–:1887,HistoryMetaItemResponseSchema→events[].source:z.string().describe('Origin label of the write: "fs", "studio", "rest", "ai", "git-import", …').content/docs/references/api/protocol.mdx:2030carries the same sentence. - What the producers write (non-test code):
packages/metadata-protocol/src/protocol.ts:22655: a save defaults to'protocol.saveMetaItem'. The publish paths pass'protocol.publishMetaItem'(:24927and others), and the package publish passes'protocol.publishPackageDrafts'.packages/metadata-protocol/src/sys-metadata-repository.ts:1121and:1150default to'sys-metadata-repo';:1467and:1619default to'sys-metadata-repo.publish'and'sys-metadata-repo.revert'. The history projection at:1821passes the stored value through, defaulting to'sys-metadata-repo'.- The internal migration writes
'migrate-stored'.protocol.ts:7329filters on that label. packages/metadata-fs/src/repository.ts:674writes'fs', the one listed label that a producer writes.
- The other listed labels. A
git grepoverpackages/**(tests excluded) forsource: 'studio','rest','ai'and'git-import'finds no producer. Agit grepfor a consumer comparingsourceagainst'studio','rest','ai'or'git-import'finds none. - Not read: cloud's writers (no read access from this seat). The copilot's draft path goes through
saveMetaItem, which stamps'protocol.saveMetaItem'unless a caller passessource. Whether cloud passes one is NOT MEASURED.
The work
One PR on packages/spec, describe text only:
- Make the describe say what the label is: an open code-path label naming the write path (for example
'protocol.saveMetaItem','protocol.publishMetaItem','sys-metadata-repo','migrate-stored','fs'). Say that it is not an authoring-surface enum. - Regenerate
content/docs/references/api/protocol.mdxwith the spec's own generator, never by hand. - The schema stays
z.string(): no accepted value changes. Apatchchangeset on@objectstack/specwithClause-②: no.
Reader who acts: the domain:spec seat, one PR. protocol.zod.ts is also touched by #24298's held branch (claude/issue-24298-draft-key-provenance, the GetMetaItemResponseSchema region, not this one). Read the live claims first.
Grade (a suggestion; triage's call)
p3. Describe and docs wording only; the door's behaviour and the accepted shape do not change.
Dedupe
Two semantic searches of this repository's issues:
- "metadata history event source label describe fs studio rest ai git-import": 0 hits.
- "HistoryMetaItemResponseSchema source origin label of the write": 2 hits, both closed and unrelated. [#5563 附带裁决] SaveMetaItemResponseSchema 补齐实现实际返回的字段(version / seq / state / projectionApplied) #5745 is about
SaveMetaItemResponseSchema's fields; Rebind the history-door consumers to the newly declared HistoryMetaItem schemas (route-ledger row + client.meta.getHistory inline return) — #12038 class #13523 rebinds the history-door consumers.
Dedupe words: history events source describe origin label studio rest ai git-import; HistoryMetaItemResponseSchema source code-path label.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 18, 2026
Claim: PM loop round 1 · 2026-10-18T12:49Z · the
HistoryMetaItemResponseSchemaevents[].sourcedescribe inpackages/spec/src/api/protocol.zod.ts, describe text only, and the reference page it generatesSession:
session_019oFY6Hi35J7atvgVFnmoaK(the seat; the dev is anos-devsubagent of this session)Account:
zhuangjianguo(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-24328-history-source-describeWorktree:
objectstack-issue-24328Domain:
domain:specSeat:
domain:spec#2(seat post #18549)File surface (paths on
origin/main1ef0ee89d4or later; stop on a breach and explain it in the report):packages/spec/src/api/protocol.zod.ts: theevents[].source.describe()insideHistoryMetaItemResponseSchemaonly (:1884–:1887);content/docs/references/api/protocol.mdxand any other artefactcheck:generatedproves stale, regenerated by the spec's own generators, never by hand;.changeset/24328-*.md(patchon@objectstack/spec,Clause-②: no).z.string(). ⛔ No producer code inpackages/metadata-protocol/**orpackages/metadata-fs/**.Container & model:
S,mode:subagent,model: default tier(dispatch-gates --tier: no path-derived mandate; the describe is judged against the producers' labels, so it is not mechanical). The review before the queue runs atCONTRACT_REVIEW_TIER(a published.describe()in non-testpackages/spec/src/**).Clause-②: no
Responsibility: n/a — not a defect card (a documentation correction)
Thread-read: none
Serial constraints cleared:
packages/spec/src/api/protocol.zod.tsorcontent/docs/references/api/protocol.mdx.claude/issue-24298-draft-key-provenance, no PR, released6250059826) edits theGetMetaItemResponseSchemaregion of the same file and regenerates the same page. Whichever lands second regenerates the page after a merge ofmain.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
os-dev-report
{ "issue": 24328, "status": "done", "branch": "claude/issue-24328-history-source-describe", "pr": "https://github.com/objectstack-ai/objectstack/pull/24334", "session": "session_019oFY6Hi35J7atvgVFnmoaK", "premise_still_valid": true, "summary": "The HistoryMetaItemResponseSchema events[].source describe (packages/spec/src/api/protocol.zod.ts:1884) no longer lists \"fs\", \"studio\", \"rest\", \"ai\", \"git-import\". It now reads: 'Which code path wrote the event: an open label the server stamps, not an enum an author or client picks from (e.g. `protocol.saveMetaItem`, `protocol.publishMetaItem`, `migrate-stored`). The history row's stored value is passed through; `sys-metadata-repo` is the repository's own default and the answer for a row that stored none.' The field stays z.string(); content/docs/references/api/protocol.mdx:2030 was regenerated by gen:docs, the one artifact check:generated proved stale. Premise held on base 1ef0ee89d4 (G1 exact: 1 hit in packages/spec/src at :1885, 1 in content/docs at protocol.mdx:2030; 0 on the final head). G2 re-read on merge base 117301705: the door (protocol.ts:24594) reads only getOverlayRepo() (:8215, always a SysMetadataRepository), i.e. sys_metadata_history rows, projected at sys-metadata-repository.ts:1821 with fallback 'sys-metadata-repo'; protocol.saveMetaItem :22655 → repo.put :23890/:23896; protocol.publishMetaItem via promoteDraftForPublish :25012 → repo.promoteDraft :25338-:25342 (also the package publish's path); migrate-stored :24536 and service-automation flow-credential-migration.ts:228; repository default 'sys-metadata-repo' at :1121 (put) and :1271 (delete). Two corrections to the card's measurement, both in the PR body: (1) 'protocol.publishPackageDrafts' is an audit-row label only (protocol.ts :26390, :26754, :26774, :26863 are all recordMetadataAudit / recordPendingDenialAudit); a package publish's history rows carry 'protocol.publishMetaItem'. (2) 'fs' is written by @objectstack/metadata-fs's FileSystemRepository into its own JSONL change log and broker events (repository.ts :421 :483 :674 :1045), attached as 'a supplementary event source ... No write mirroring yet' (packages/metadata/src/plugin.ts:852-:855); no non-test code passes source 'fs' into saveMetaItem or a SysMetadataRepository, so the history door never answers it. I therefore left 'fs' out of the examples, which differs from the card's 'for example' list; the ruling's intent (name what the label is, with labels a producer writes for this door) is kept. Seat may override. G4: no test, ledger row or snapshot pinned the old sentence (repo-wide git grep: protocol.zod.ts and protocol.mdx only). G5: #24298's region untouched. files_changed: .changeset/24328-history-source-describe.md (patch on @objectstack/spec, Clause-②: no); content/docs/references/api/protocol.mdx (1 line, generated); packages/spec/src/api/protocol.zod.ts (the one describe, +5/-2). deviations: (a) 'fs' omitted from the describe's examples, as above. (b) main merged once before the PR opened (8deed12d3 = merge of 117301705, AGENTS.md section 10); it brought packages/spec/src/kernel/public-auth-features.ts, so build, check:generated, tests and typecheck were re-run on the merged head. main has since moved to ec749fbb4 (objectql + protocol.ts:15847, no source label); not merged, no conflict. (c) @objectstack/formula, lint, objectql, client and client-react were built under the lock so five derived gates could measure. (d) I fetched #24298's held branch read-only into a private ref (refs/os-dev-24328/peek-24298) to read its file list (it does not touch protocol.test.ts or this region), then deleted that ref; the branch itself was not touched. (e) Commit trailers use AGENTS.md's model-free pair, and the PR body ends with AGENTS.md's session-URL footer, not the harness reminder's lines. No labels written. The PR body was written once at create and read back byte-identical (9661 sent = 9661 stored). The worktree is removed after this comment posts.", "tests": "All heavy runs through scripts/pm/os-verify-lock.sh with OS_VERIFY_LOCK_SLOT set; every exit code captured before any pipe. On the merged final head 8deed12d3: (1) pnpm --filter @objectstack/spec build: 'VERDICT command-exit 0'. (2) pnpm --filter @objectstack/spec check:generated: exit 0, '✓ All 14 generated artifacts are up to date' (before gen:docs on de5b01674 it was exit 1, '✗ 1 of 14 artifact(s) stale: content/docs/references/** / pnpm --filter @objectstack/spec gen:docs'; gen:docs exit 0, '✅ Generated 227 files', diff = protocol.mdx 1 line). (3) pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2: 'VERDICT command-exit 0', 'Test Files 694 passed (694)', 'Tests 21041 passed | 1 todo (21042)'. (4) pnpm --filter @objectstack/spec typecheck: 'VERDICT command-exit 0', ending 'check:test-typecheck: OK'. (1)-(4) also passed with identical counts on the pre-merge head e5d91992a. Control-byte self-scan (grep -naP over the three changed files): 0 hits. Old sentence: git grep 'Origin label of the write' = 0 hits on HEAD, 2 on base. No ablation and no reverse verification: no tested behaviour or type changed (describe text only). test:repo not run locally (declared to CI's Test Core); packages/spec has no workspace deps, so the closure step is the spec build itself.", "gates": "Local, final head 8deed12d3: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) derived 104 commands from 3 paths vs merge base 117301705 (the PM's lead had 96; the 8 extra are changeset-driven families now that a .changeset exists). Run by a while-read loop recording each exit before any pipe: 98 exit 0 first pass, 6 exit 3 PREREQUISITE NOT MET; after a locked turbo build of formula/lint/objectql/client/client-react ('VERDICT command-exit 0', 35 tasks), check:doc-formula-expressions, check:doc-security-posture, check:skill-examples, check:docs-transcript-drift and check:lean-entry-closure re-ran exit 0. --ran exit 0: 'Run reconciliation — 104 derived, 103 run, 1 NOT-MEASURED, 0 UNRUN' / '✓ dispatch-gates --ran: 104 derived famil(ies) accounted for — 103 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. Verdict lines: check:docs '✅ 227 generated files in sync with packages/spec'; check:doc-authoring '✓ ... 19016 customer-facing string(s) across 1429 spec sources clean'; check-spec-docblock-symbol-anchors '✅ 4972 anchors across 2121 spec sources resolve'; check:nul-bytes 'OK (scanned 12185 text file(s) ... no raw ASCII control bytes)'; check-adr-0087-registration '✓ this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen)'; check-empty-changeset '✓ No empty-frontmatter changeset introduced by this diff'. NOT MEASURED: check:dual-build-cjs-loads, reason: exit 3 PREREQUISITE NOT MET (92 package entries without dist); no whole-repo build locally, a declared narrowing; CI Lint & Repo Gates runs it. check-platform-checklist not owed (no export renamed or removed). Local-only families: NOT MEASURED: check:dev-prereqs, reason: exit 1 with '✗ The workspace is not built — 1 unmet precondition, not a list of problems' (35 of 70 workspace packages have no dist; its self-test passed, 19 batteries / 76 cases); it judges pnpm dev readiness of the whole workspace and I ran no whole-repo build; the spec dist half is covered by check:generated's 'declaration stamp match'. check:skill-frame-freshness not owed (no four-axis frame file touched). CI, PR #24334 check-runs on 8deed12d3, read once just before this report: 38 runs; success: Auto Label, Check Documentation Links, Check PR Size, Dogfood Regression Gate, No other open PR may claim the same issue, No other open PR may claim the same single-writer path, Part-of PR must not also close its card, Spec property liveness, The card this PR closes must claim this branch, filter; skipped: Console Pin Gate, Dogfood Regression Gate (matrix), Dogfood Verify CLI, Packed-tarball smoke (opt-in), Temporal Conformance; in_progress: Build Core, Build Docs, Check Changeset, Flag docs affected by code changes, Governed Surface Queue Guard, the eight Lint lanes, Test Core 1/6-6/6, the four Type Check lanes; 0 failure. in_progress is the honest value; not waited on, per the report contract.", "mcp_calls": "0 — no MCP GitHub tool used", "api_writes": "3 — REST writes executed as objectstack-fleet[bot] by 2 fleet-write relay strokes (scripts/pm/fleet-write/dispatch.mjs and scripts/pm/post-stamped.mjs; each stroke one POST /repos/objectstack-ai/objectstack/dispatches): stroke 1, run 39132413315 success = POST /repos/objectstack-ai/objectstack/pulls (draft, #24334) + POST /repos/objectstack-ai/objectstack/issues/24334/assignees (zhuangjianguo, read back); stroke 2 = POST /repos/objectstack-ai/objectstack/issues/24328/comments (this os-dev-report). git push x4 of the branch (empty probe, de5b01674, e5d91992a, 8deed12d3) is not a REST write. Reads only otherwise: card + comments, PR #24310, #24291's comments (report format), check-runs, PR #24334 read-back, the relay's route read.", "open_questions": [], "out_of_scope_findings": [ "class: a (wrong published text; same family as #24328, one package down) · reach: exception: release-text — @objectstack/metadata-core is published (files: dist, README.md, CHANGELOG.md), and its built dist/index.js and dist/index.cjs (built from 8deed12d3) carry the string, with the positive control 'Set on op=\"rename\"' in the same two files · evidence: packages/metadata-core/src/types.ts:148, MetadataEventSchema.source .describe('Origin label: \"fs\", \"studio\", \"rest\", \"ai\", \"git-import\", …'); no non-test writer in packages/** stamps 'studio', 'rest', 'ai' or 'git-import'. This schema is shared by both repositories, so the right text there is not the spec's: 'fs' is real for the FileSystemRepository (metadata-fs repository.ts :421 :483 :674 :1045), and the SysMetadataRepository side stamps sys-metadata-repo* defaults and protocol.* / migrate-stored labels. Riders in the same package, code comments: objects/sys-metadata-history.object.ts :35-:36 and :136-:137 (list 'studio', 'api'). Landing: packages/metadata-core, a patch changeset on @objectstack/metadata-core. Outside this card's claimed file surface, so not fixed here; #24328 closes with this PR, so the seat files it (follow-up card, or the family's closing card if one exists) · dedupe words: MetadataEventSchema source describe origin label; metadata-core event source studio rest ai git-import; sys_metadata_history source producer comment studio api", "class: observation (not a/b/c) · carrier: none · noted in PR #24334 Acceptance notes, not filed · docs/adr/0008-metadata-repository-and-change-log.md:226, the §2.4 interface sketch comments source: string with 'fs', 'studio', 'rest', 'ai', 'git-import'. The ADR decides the type (string), which this PR keeps; the list is illustration, on a Tier H surface", "class: observation (not a/b/c; test-only, unpublished) · carrier: none · noted in PR #24334 Acceptance notes, not filed · packages/spec/src/api/protocol.test.ts:2141-:2162 calls its fixture 'a verbatim-shaped capture of a real historyMetaItem return' while its update event carries source: 'studio'; a real save stamps 'protocol.saveMetaItem'. The test stays correct (z.string() accepts both); the file is outside the claim's file surface" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
ACCEPT → PR #24334 comment 6250650493 ·
domain:specseat 2 · sessionsession_019oFY6Hi35J7atvgVFnmoaK· 2026-10-18T13:46Z · theCONTRACT_REVIEW_TIERreview runs on head8deed12d34; it lands after a PASS there and a fully green head. The card's measurement named'protocol.publishPackageDrafts'as a history label; it is an audit label only (correction in the ACCEPT).Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Landed · PR #24334 →
ba5bfe96e5·domain:specseat 2 ·zhuangjianguo· sessionsession_019oFY6Hi35J7atvgVFnmoaK· 2026-10-18T14:41Zba5bfe96e5e7396ce039db716ffa5bf786e54a45on parent51ad8e4fbaorigin/maingit merge-base --is-ancestor ba5bfe96e5 origin/main→ exit 0git diff 51ad8e4fba ba5bfe96e5and the reviewed head8deed12d34over its merge base1173017052sharegit patch-id --stable548f9613(ACCEPT6250650493, contract review PASS6250757746, adopted6250764534)gh-readonly-queue/main/pr-24334-*ref remainsFixes #24328; the lane's open set is the expected one, less this cardWhat now holds on
main: theHistoryMetaItemResponseSchemaevents[].sourcedescribe andcontent/docs/references/api/protocol.mdx:2030say that the label is an open code-path label the server stamps, not an enum a client picks from. The examples areprotocol.saveMetaItem,protocol.publishMetaItemandmigrate-stored, andsys-metadata-repois the repository default. They no longer list"studio","rest","ai"or"git-import". Apatchchangeset on@objectstack/spec,Clause-②: no.The rest of the family: #24336 (
domain:engine):@objectstack/metadata-core'sMetadataEventSchema.sourceand the riders this PR's Acceptance notes name.State: this card was closed
completedby the merge;pm:dispatchedis removed in this act. The claim (6250117196) ends here. Theos-devsubagent's run ended with its report.Generated by Claude Code