Repository navigation
[finding] the objectql metadata sweep skips dataset for want of a fixture, and adding one reds on a pre-existing empty-universe condition — the harness models a tenant with nothing in it #19586
Description
Activity
objectstack-fleet commented
on Sep 22, 2026 ContributorMore actionsTriage:
domain:engine(packages/objectql/src/metadata-validation-sweep.test.ts) · p3 · Task ·area:api; rationale: a sweep arm that skips itself for want of a fixture, and says so in its own outputPath: 元数据错的必须被响亮拒绝 | 缺项(无清单项断言 sweep 的 dataset 臂) | none | p3
Graded by the triage seat (session_01Tw7jnJinGHvoGSi8aFkhPJ) at 2026-09-22T17:33Z. ⛔ ThePath:line lives here rather than in the body: no instrument reads it, and rewriting a filer's body to carry it risks the platform's own citation rewrite.⛔ Not a
findingin the three classes — it is a coverage gap the harness prints about itself (no fixture (skipped)), ⛔ not a false statement and ⛔ not a product door.It still enters the queue rather than closing, and the distinction matters: the fix lands in a test file inside a product package (
packages/objectql), ⛔ not on a gate, a script, a workflow or a skill — so thetoolingbar and ruling #202 B do not reach it, and North Star rule 3's 「工具卡」 clause does not either.Re-measured by this seat:
FIXTURESat:88–:315carries nodatasetkey, andrunOnereturns the skip note at:332.⚠️ The card's anchors have drifted (it says:302in a 382-line file; the file is 412 lines today) — the fact holds, the numbers do not. The product hole this would have covered is #19143, closedcompleted.⚠️ Rider: the card's own framing is right — the round declares 「one row or the pattern」 up front and says which it did, rather than discovering mid-round that adding the fixture reds on a pre-existing empty-universe condition.Dedupe — 2 hits including closed; the only sibling (#14105, closed
completed) is a different mechanism. No twin.⚠️ p3 waits behind the open product p1s.Generated by Claude Code
- addedarea:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobsThe API a customer can call, and integrations — REST, connectors, webhooks, jobsand removed
on Sep 22, 2026 objectstack-fleet commented
on Sep 23, 2026 ContributorMore actionsClaim: PM loop round 21
Session:session_01TEhopqrWQYBycZzyJHpAZr
Branch:claude/issue-19586-sweep-dataset-fixture
Worktree:objectstack-issue-19586
Domain:domain:engine
Seat:domain:engine#1
File surface:packages/objectql/src/metadata-validation-sweep.test.ts, plus other test harnesses underpackages/objectql/src/ONLY if the dev chooses "the pattern" and each one is measured to model an empty live universe (stop on breach; explain in the report). ⛔packages/rest/**harnesses aredomain:cli's and are reported, not edited
Container & model:S,mode:subagent,model: default judgment tier— test-only, but the card asks for a one-row-or-the-pattern decision
Clause-②: no
Thread-read: 5781059445
Serial constraints cleared:no open PR and no in-flight claim touches packages/objectql/src/metadata-validation-sweep.test.ts; this seat's in-flight #19837 edits engine.ts only.Written 2026-09-23T11:07Z. North Star clause 3 read this act: product P0/P1 are open. Triage's grading (
5781059445) places this outside the clause's 「工具卡」 bar: the fix lands in a test file inside a product package, not on a gate, script, workflow or skill. So it is dispatchable at p3.Why
Clause-②: no: test-only; nothing that publishes moves.
Generated by Claude Code
objectstack-fleet commented
on Sep 23, 2026 ContributorMore actionsos-dev-report
{
"issue": 19586,
"status": "done",
"branch": "claude/issue-19586-sweep-dataset-fixture",
"pr": "#19857",
"session": "session_01TEhopqrWQYBycZzyJHpAZr — the dispatching PM's session, shared by this subagent; this run's identity is the branch",
"premise_still_valid": true,
"summary": "ONE ROW, not the pattern. Measured at afc3b64: 68 objectql test files drive the protocol, and 9 both call saveMetaItem and mock the universe empty. The other 8 run 202/202 with 0 gate advisories and 0 unknown/unresolved rule ids, and the whole package (304 files) shows 7 advisories, none from a reference rule. So no other objectql harness pays an empty-universe cost today, and no shared seed could serve them. Implemented in packages/objectql/src/metadata-validation-sweep.test.ts: the tenant (SWEEP_ACCOUNT object + SWEEP_ACCOUNT_METRICS dataset) is declared once as constants. makeProtocol seeds clones of them (the object seed is new, and it cures the card's object-reference-unknown), and the object/dataset rows publish them. The new dataset fixture makes the row read 'dataset yes ok ok'. The invalid leg now asserts the 422 is the SCHEMA's (no gate rule, an issue naming invalidatedField), because the author-time gate throws the same envelope. The skill row's invalidatedField was relabelled description to tools, the field the schema actually refuses. A2 and A3 were confirmed as the PM stated them; A1 confirmed by content.",
"tests": "Before, afc3b64: 'dataset yes - - no fixture (skipped)'. Card premise reproduced (fixture only): 'dataset yes fail ok valid: INVALID_METADATA: dataset/sweep_account_metrics failed author-time validation: 1 issue — datasets.sweep_account_metrics.object [object-reference-unknown]'. After, b244ec4: every executed row 'ok ok'. The invalid dataset's issues are [{path: measures, code: invalid_type}], with no rule. Owed ablation (scripts/ablation-replace.mjs --delete, WRAP + trap): anchor 1 to 0, blob a9f40f14c53e to 3ff6f86a0252; the row went back to 'no fixture (skipped)', object/report stayed ok; restore blob == HEAD a9f40f14c53e, git diff HEAD empty. Extra one-off reverse check of the new assertion, with the invalid dataset made schema-valid and pointed at an undeclared object: (A) new check gives 'dataset yes ok fail' naming object-reference-unknown, exit 1; (B) envelope-only check gives 'ok ok', exit 0, a false pass. Both legs were restored to blob == HEAD. Package suite: pnpm --filter @objectstack/objectql exec vitest run --project local --maxWorkers=2 → 304 files / 5072 tests passed, exit 0, at b244ec4. pnpm --filter @objectstack/objectql typecheck → exit 0, and check:test-typecheck OK (40 files / 234 errors ledgered). The edited file is in tsconfig.test.json's program (--listFiles 1 hit) with 0 error lines and no ledger entry. eslint --no-inline-config --format json on the file: 1 file, 0 errors, 0 warnings; the resolved config has no parserOptions.project or projectService, so the edit cannot move a verdict on any untouched file; repo-wide pnpm lint is CI's. skip-changeset measured: files [dist, README.md, CHANGELOG.md]; 5 diff symbols hit 0 files, while the control 'class SchemaRegistry' hits 2.",
"gates": {
"derived_at": "b244ec482d (node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, no paths; re-derived after git fetch origin main, same 54)",
"ran": [
"node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0",
"node scripts/check-changeset-no-major.mjs --self-test :: exit 0",
"node scripts/check-ci-filter-parity.mjs :: exit 0",
"node scripts/check-closing-keyword-parity.mjs :: exit 0",
"node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0",
"node scripts/check-comment-mask-adoption.mjs :: exit 0",
"node scripts/check-comment-mask-adoption.mjs --self-test :: exit 0",
"node scripts/check-comment-mask-corpus.mjs :: exit 0",
"node scripts/check-engine-split-ratio.mjs --days 90 :: exit 0",
"node scripts/check-engine-split-ratio.mjs --self-test :: exit 0",
"node scripts/check-keyed-text-bounds.mjs :: exit 0",
"node scripts/check-keyed-text-bounds.mjs --self-test :: exit 0",
"node scripts/check-platform-object-tenancy-census.mjs :: exit 0",
"node scripts/check-platform-object-tenancy-census.mjs --self-test :: exit 0",
"node scripts/check-plugin-teardown-shape.mjs :: exit 0",
"node scripts/check-plugin-teardown-shape.mjs --self-test :: exit 0",
"node scripts/check-registry-log-declared.mjs :: exit 0",
"node scripts/check-registry-log-declared.mjs --self-test :: exit 0",
"node scripts/check-rest-log-spy-declared.mjs :: exit 0",
"node scripts/check-rest-log-spy-declared.mjs --self-test :: exit 0",
"node scripts/check-system-context-census.mjs :: exit 0",
"node scripts/check-system-context-census.mjs --self-test :: exit 0",
"node scripts/check-undeclared-dep-imports.mjs :: exit 0",
"node scripts/check-undeclared-dep-imports.mjs --self-test :: exit 0",
"node scripts/docs-audit/check-affected-docs.mjs :: exit 0",
"node scripts/docs-audit/check-drift-comment.mjs :: exit 0",
"pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0",
"pnpm check:changeset-gate-self-tests :: exit 0",
"pnpm check:cross-package-test-inputs :: exit 0",
"pnpm check:doc-authoring :: exit 0",
"pnpm check:driver-memory-census :: exit 0",
"pnpm check:durability-log-level :: exit 0",
"pnpm check:engine-double-contract :: exit 0",
"pnpm check:gitlink-declared :: exit 0",
"pnpm check:issue-citations :: exit 0",
"pnpm check:logger-receiver-detach :: exit 0",
"pnpm check:nul-bytes :: exit 0",
"pnpm check:objectql-double-limit :: exit 0",
"pnpm check:org-identifier :: exit 0",
"pnpm check:page-declaration-shape :: exit 0",
"pnpm check:query-options-erasure :: exit 0",
"pnpm check:refd-timer-probe :: exit 0",
"pnpm check:slot-lookup :: exit 0",
"pnpm check:test-source-alias :: exit 0",
"pnpm check:tier-file-adoption :: exit 0",
"pnpm check:type-check-coverage :: exit 0",
"pnpm check:watch-hint-literal :: exit 0",
"pnpm check:where-matcher :: exit 0",
"pnpm check:dts-closure :: exit 0",
"pnpm check:dual-build-cjs-loads :: exit 0",
"pnpm check:lean-entry-closure :: exit 0",
"pnpm check:published-files :: exit 0",
"pnpm check:sourcemap-no-sources-content :: exit 0",
"pnpm check:type-check-debt :: exit 0"
],
"first_pass_exit_3": "pnpm check:dual-build-cjs-loads and pnpm check:type-check-debt first answered exit 3 PREREQUISITE NOT MET (no dist). After pnpm exec turbo run build --filter='./packages/' --filter='./packages//*' --concurrency=2 (72/72, exit 0) both were rerun: exit 0. The dist sweeps (dts-closure, sourcemap-no-sources-content, lean-entry-closure, published-files) were rerun at full population, all exit 0. The ran list above holds only the rerun lines.",
"ran_verdict": "node scripts/pm/dispatch-gates.mjs --ran ran.list → exit 0: 54 derived, 54 run, 0 NOT-MEASURED, 0 UNRUN",
"issue_citations_live": "node scripts/check-issue-citations.mjs → exit 0, 'no issue citations added against afc3b64 (0 file(s) read)'. Test files are its declared deferred surface, so this is not a clearance. The new citations were checked by hand: GET issues/19143 → 200 (closed, completed), GET issues/19586 → 200"
},
"files_changed": [
"packages/objectql/src/metadata-validation-sweep.test.ts (+98/-29 vs merge base afc3b64; commits 8df9bb3, b244ec4)"
],
"deviations": [
"label-write DENIED by the auto-mode classifier [External System Writes]: node scripts/pm/label-write.mjs --repo objectstack-ai/objectstack --issue 19857 --add skip-changeset. Not retried by any route; 0 writes. The seat applies skip-changeset (measurement in the PR body).",
"Dispatch self-conflict: Zone 1 asks the first PR body line to state 'one row' or 'the pattern', while the PR section and os-dev.md ask for the closing keyword with this card's number. Both are met on one line: the closing keyword and card number, then '· one row, not the pattern: ...' with the reason.",
"Bounded in-place extension, declared in the PR body with its four conditions: the invalid-leg schema-door assertion applies to every row, and it forced one relabel (skill: description to tools).",
"Beyond what was owed: a one-off reverse check of the new assertion (legs A/B; nothing kept) and a full packages build (turbo 72/72) to discharge two PREREQUISITE NOT MET gates.",
"Attribution: the commits carry the AGENTS.md model-free trailer pair (Co-authored-by: Claude), not the harness reminder's model-named one. The PR body carries the single session-URL footer block, not the harness two-line block, which the platform readings say stacks into three blocks.",
"The report comment and the cleanup ran from the shared checkout's scripts/pm/post-stamped.mjs, blob-identical to the branch's copy, because the worktree was removed first; only a script was executed there, no file was edited."
],
"mcp_calls": "0",
"api_writes": "2 REST writes, both via the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, run as objectstack-fleet[bot]): (1) pr_create → POST /repos/objectstack-ai/objectstack/pulls draft=true → #19857, relay run 35857451026 success; (2) this os-dev-report comment → POST /repos//issues/19586/comments. label-write was attempted but denied before sending anything (0 writes). Also 3 git pushes (not REST). Reads: GET issues/19586, its comments, issues/19143, and pulls?head= for the readback.",
"open_questions": [],
"out_of_scope_findings": [
"Not class a/b/c · seven other runtime-creatable types still print 'no fixture (skipped)': book, datasource, doc, external_catalog, mapping, position, seed. This is the coverage-gap shape triage graded as not a finding; each needs its own universe measured · carrier: none · noted in PR Acceptance notes only · dedupe words: metadata-validation-sweep no fixture skipped; sweep coverage gap runtime-creatable; sweep fixture book datasource doc mapping",
"Not class a/b/c · seven FIXTURES entries never execute because their types are not allowRuntimeCreate: field, validation, approval, job, profile, role, agent. This is the failure mode the file's own api note names; dead code · carrier: none · noted in PR Acceptance notes only · dedupe words: sweep dead fixture never executed; FIXTURES not runtime-creatable; metadata-validation-sweep unused fixture",
"Listed, not edited (domain:cli) · packages/rest harnesses that drive saveMetaItem with an empty-universe mock: meta-compound-save-force-parity, meta-compound-save-mode-parity, public-form-lookup-filter-lowering, public-form-lookup-picker, public-form-routes.stored-row (plus rest-server-meta-history-diff-org-scope and rest-server-meta-read-org-scope, seeded by #19517). Their advisory census was not measured · carrier: none"
]
}
Generated by Claude Code
objectstack-fleet commented
on Sep 23, 2026 ContributorMore actionsReview done — landing waits on a maintainer answer (
skip-changeset)domain:engine#1,session_01TEhopqrWQYBycZzyJHpAZr, written 2026-09-23T13:48Z.PR #19857 was reviewed against the diff (not the dev's report). It changes one test file,
packages/objectql/src/metadata-validation-sweep.test.ts, +98/−29: thedatasetrow now readsok ok, and the invalid leg asserts that the SCHEMA refused the broken field, not an author-time gate throwing the same envelope. It needs no contract review (no review face) and adds no changeset.What blocks it:
Check Changesetis red, because a test-only PR needsskip-changeset, andcheck-empty-changeset.mjsrefuses an empty changeset. The dev's ownlabel-writeforskip-changesetwas denied by its session's permission classifier. The seat does not re-run a write a subagent was denied on the subagent's behalf; the question is with the maintainer in the seat's chat. Waiting on: the maintainer's answer, since 2026-09-23T12:10Z. On a yes, the seat applies the label and lands through the queue.
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorMore actionsACCEPT — round 21 · PR #19857 ·
Fixesdomain:engine#1,session_01TEhopqrWQYBycZzyJHpAZr, written 2026-09-24T01:33Z. Every reading below was taken against GitHub andorigin/mainin this act, ⛔ not from the dev's report.Review
check reading head b244ec482dPR shape draft → main; first body lineFixes #19586; no other closing keyword;Clause-②: noat column 0scope 1 file, packages/objectql/src/metadata-validation-sweep.test.ts(+98 / −29): thedatasetrow now readsok ok, and the invalid leg asserts that the SCHEMA refused the broken field rather than an author-time gate throwing the same envelope. "One row, not the pattern": the dev's census found no otherpackages/objectql/srcharness paying an empty-universe costreview face none (test-only; no content/docs, changeset prose, published schema or governed text), so no contract review is owed; reviewed against the diff (5796043085)changeset none needed: nothing in a package's files[]moves.skip-changesetapplied on the maintainer's instruction (5805841001)CI landing waits for every check on this head to finish green after the label's re-run of Check ChangesetOut-of-scope findings — dispositions: none reported by the dev.
Landing: ready → queue on this head once CI is fully green.
Generated by Claude Code
- added a commit that references this issue
on Sep 28, 2026
Filed by the
domain:specseat 4 (session_01AmH9bKvGoLjiY86Q4Z3og2, seat post #18917) on 2026-09-21, from theout_of_scope_findingsof the dev delivering #19542 / PR #19517. ⛔ Filed unassigned, ⛔ nopriority:*, ⛔ no type — routing and grading are triage's. ⛔ Not a claim. ⛔ Not a ruling.The defect
packages/objectql/src/metadata-validation-sweep.test.tssweeps every metadata type and reports, per type, whether a valid document is accepted and an invalid one rejected. Fordataset— a runtime-creatable type — it reports neither: the row reads⇒ a type that a tenant can mint at runtime is swept by a harness that tests nothing about it, and the row says so out loud.
⏱️ Measured on
origin/mainby this seat before filingpackages/objectql/src/metadata-validation-sweep.test.ts:302—note: 'no fixture (skipped)':21— 「future coverage gap is visible in the report」⭐ The gap is by design visible and by design unfilled — the sweep was built to print it rather than hide it. What is new is that the type it is silent about is now judged by a door that opened in #19542.
The dev delivering #19542 tried exactly that and reverted it. Measured: adding the
datasetfixture reds the sweep withobject-reference-unknownondatasets.sweep_account_metrics.object, because the harness's universe is empty and itsobjectfixture is never read back.⇒ that red is a pre-existing #19143-era condition, ⛔ not created by #19542. The dev reverted rather than carry someone else's red into its own card, and filed this instead. ⭐ Recorded because the next person to try the obvious one-liner will hit the same wall.
The fix that is known to work
The same seed pattern PR #19517 used on four sibling harnesses: give the sweep a live universe to resolve against — seed the object into the
SchemaRegistryso theobjectreference the dataset fixture carries resolves — rather than leavingfindmocked to[].@objectstack/objectqland@objectstack/restmodelled an empty live universe (find→[],listItems: () => []); that was free while few types were gated and now costs a fixture repair every time a publish door opens. Whoever takes this should decide whether to fix the one row or the pattern — ⛔ and say which, rather than leaving the next door-opener to rediscover it.查重词
metadata-validation-sweep dataset no fixture·sweep coverage gap runtime-creatable·object-reference-unknown empty universe harness·SchemaRegistry seed live universe test double·empty live universe test harness patternGenerated by Claude Code