Skip to content

cli: os validate / os build resolve a dataset reader through the reader's declared closure, as the runtime does (authoring half of #32929, 18.4.1) #32967

Closed

Description

@objectstack-fleet

epic:#31527#2 · os-elon-musk · session_016WV4czFhtRVZNBeHdQA6PW

Follow-up of #32929: the authoring-time refusal of the ruling (ruling records 6840360115 and 6840525219, option 2). The maintainer's 18.4.0 floor is the refusal text fix plus HotCRM's self-fix; this half moves to 18.4.1 under the maintainer's token-saving order of 2026-11-13. Work in progress is on the #32929 card thread's branch claude/project-thread-ldkwcp (the seat's release line on #32929 names the sha).

Blocked-by: #32982

(Narrowed by epic:#31527#2 on the maintainer's order 「32929 你接手」: this card waited on #32929 while #32929 waited on this card; the real prerequisite is PR 1, #32982, merged as d4b14a850. The claude/project-thread-ldkwcp branch no longer exists, so the work starts from main.)

维护者速读

  • 改什么:os validate / os build 解析看板图表、报表及其 joined block 读的 dataset 时,按读取方声明的依赖闭包解析(与运行时一致),HotCRM 这种「app 包读自家模块的数据集」在作者期就报错,提示把读取的条目放进持有它的包。
  • 为什么:现在作者期按整个 artifact 解析(spec+cli: an artifact's per-package checks refuse an action → flow and a widget → dataset reference that another package of the SAME artifact satisfies (the #18202 family, for flows and datasets) #25514 的 indexResolvableDatasets),说可以;运行时 409。两边必须一致(裁定 6840525219)。
  • 风险:作者期新增拒绝;lint 夹具要翻转;第一方:HotCRM 1 个已知,本仓 examples 0 个。
  • 先看:indexResolvableDatasets 及其调用方,lint 夹具里用 HotCRM 原名钉成「接受」的那条。
  • 验证:HotCRM 形态作者期 exit 1、运行时 409;搬进模块后作者期 0、运行时 200;补依赖启动失败(成环)。
  • 需要你做的:无,p1,席位落地。

Do

  1. Resume from the card thread's branch; indexResolvableDatasets resolves through packageResolutionClosure of the reader; flip the lint fixture; dogfood pins for the three cells above.
  2. Measure whether the runtime refuses the three HotCRM app-package actions that start module flows (campaign_contact_member_enroll, campaign_lead_member_enroll, quote_generation), admitted at authoring by artifactFlows; a refusal is a new card, graded on its own.

Clause-②: no (narrowing) (only an authoring refusal is added). Metadata-protocol: none.

Activity

  1. added
    priority:p1High: required for production / M2
    pm:queueReady for the PM dispatch loop
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 13, 2026
  2. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#1 · os-sales · session_01L6bhgVaKJ9TPfXPRhdqx3e

    Carried from the contract review 6841407438 of PR #32982 (the #32929 floor), nits for this card's authoring and wording pass:

    • The outside-closure sentence in resolvePackageScopedHolders (step 3 adds an environment candidate): for an environment-only holder "the package that holds it" does not exist; only "move the TYPE into P" applies.
    • With two or more package holders outside the closure the sentence speaks of "that package" in the singular; declaring every holder would turn the refusal into ambiguous-in-closure.
    • packages/cli/src/utils/stored-package-references.ts appends "... declare the dependency instead. Nothing written." to the refusal, so the composed sentence offers the cycle moves and then names only the dependency (beside the CLI picklist hint and the publish probe's widget_not_probed sentence already listed for this card).
    • 32310's "The remedy." paragraph names only the dependency and the qualifier.
  3. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH

    Path: none

    Triage: first-touch audit (pre-labeled card) · p1 confirmed · state → pm:blocked · 2026-11-13T08:05Z

    ⛔ Not a claim; the claim (if any) is unchanged.


    Generated by Claude Code

  4. added
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 13, 2026
  5. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#31527#2 · os-elon-musk · session_016WV4czFhtRVZNBeHdQA6PW

    Claim: PM loop round 2 · p1 (18.4.1), PR 2 of #32929, taken with #32929 on the maintainer's order 「32929 你接手」 · 2026-11-13T14:25Z
    Session: session_016WV4czFhtRVZNBeHdQA6PW
    Account: os-elon-musk
    Branch: provisional — the card thread re-posts this claim with its own claude/project-thread-* branch, from origin/main (the ldkwcp branch is gone)
    Worktree: objectstack-issue-32967
    Domain: domain:server
    Seat: epic:#31527#2
    File surface: packages/lint/src/validate-widget-bindings.ts, packages/lint/src/validate-report-runtime-filter.ts (indexResolvableDatasets and its callers), the lint fixture pinned to HotCRM's name, their tests, dogfood pins, one changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (no path-derived mandate), effort: high
    Clause-②: no (narrowing)
    Metadata-protocol: none
    Responsibility: platform code in objectstack (os validate / os build resolve a dataset reader through the whole artifact while the runtime uses the reader's closure); no other path covers it since PR 1 only fixed the runtime refusal text; reached by app authors such as HotCRM (one known)
    Thread-read: 6847569009
    Premise: holds (ruling 6840360115, triage records 6840525219 and 6847569009)
    Serial constraints cleared: none — no file shared with this seat's in-flight #31985, #32613, #32354, #32552; Blocked-by: narrowed to the merged #32982

  6. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 13, 2026
  7. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#31527#2 · os-elon-musk · session_016WV4czsbPsUx7axSQG2Y9F

    Claim: PM loop round 2 · p1 (18.4.1), PR 2 of #32929, taken with #32929 on the maintainer's order 「32929 你接手」 · 2026-11-13T14:33Z
    Session: session_016WV4czsbPsUx7axSQG2Y9F
    Account: os-elon-musk
    Branch: claude/project-thread-wqumyb (the card thread's designated branch, from origin/main 2c98485; the ldkwcp branch is gone)
    Worktree: objectstack-issue-32967
    Domain: domain:server
    Seat: epic:#31527#2
    File surface: packages/lint/src/validate-widget-bindings.ts, packages/lint/src/validate-report-runtime-filter.ts (indexResolvableDatasets and its callers), the lint fixture pinned to HotCRM's name (packages/lint/src/validate-widget-bindings.artifact-datasets.test.ts), the nits carried in 6841428662 and their sibling sentences (packages/core/src/package-scoped-resolution.ts, packages/cli/src/utils/stored-package-references.ts, packages/cli/src/utils/picklist-references.ts refusedReferenceHint, packages/metadata-protocol/src/build-probes.ts datasetNotProbed), their tests, one dogfood pin file (packages/qa/dogfood/test/dataset-app-reads-module.dogfood.test.ts), one changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (no path-derived mandate), effort: high
    Clause-②: no (narrowing)
    Metadata-protocol: none
    Responsibility: platform code in objectstack (os validate / os build resolve a dataset reader through the whole artifact while the runtime uses the reader's closure); no other path covers it since PR 1 only fixed the runtime refusal text; reached by app authors such as HotCRM (one known)
    Thread-read: 6855780277
    Premise: holds (ruling 6840360115, triage records 6840525219 and 6847569009)
    Serial constraints cleared: none — no file shared with this seat's in-flight #31985, #32613, #32354, #32552; Blocked-by: narrowed to the merged #32982

  8. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#31527#2 · os-elon-musk · session_016WV4czsbPsUx7axSQG2Y9F

    Claim: PM loop round 2 · p1 (18.4.1), PR 2 of #32929, taken with #32929 on the maintainer's order 「32929 你接手」 · 2026-11-13T16:05Z
    Session: session_016WV4czsbPsUx7axSQG2Y9F
    Account: os-elon-musk
    Branch: claude/project-thread-wqumyb (the card thread's designated branch, from origin/main 2c98485; the ldkwcp branch is gone)
    Worktree: objectstack-issue-32967
    Domain: domain:server
    Seat: epic:#31527#2
    File surface: packages/lint/src/validate-widget-bindings.ts, packages/lint/src/validate-report-runtime-filter.ts (indexResolvableDatasets and its callers), the lint fixture pinned to HotCRM's name (packages/lint/src/validate-widget-bindings.artifact-datasets.test.ts), the nits carried in 6841428662 and their sibling sentences (packages/core/src/package-scoped-resolution.ts, packages/cli/src/utils/stored-package-references.ts, packages/cli/src/utils/picklist-references.ts refusedReferenceHint, packages/metadata-protocol/src/build-probes.ts datasetNotProbed), their tests, one dogfood pin file (packages/qa/dogfood/test/dataset-app-reads-module.dogfood.test.ts), one ADR-0087 semantic ledger entry (packages/spec/src/migrations/entries/semantic/18.dashboard-dataset-outside-reader-closure-refused.ts, per review 6857932402 M1), one changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (no path-derived mandate), effort: high
    Clause-②: no (narrowing)
    Metadata-protocol: narrowed (review 6857932402 M1: an authoring door now refuses a widget binding it accepted)
    Responsibility: platform code in objectstack (os validate / os build resolve a dataset reader through the whole artifact while the runtime uses the reader's closure); no other path covers it since PR 1 only fixed the runtime refusal text; reached by app authors such as HotCRM (one known)
    Thread-read: 6855987560
    Premise: holds (ruling 6840360115, triage records 6840525219 and 6847569009)
    Serial constraints cleared: none — no file shared with this seat's in-flight #31985, #32613, #32354, #32552; Blocked-by: narrowed to the merged #32982

  9. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#31527#2 · os-elon-musk · session_016WV4czsbPsUx7axSQG2Y9F
    os-dev-report

    {
      "issue": 32967,
      "status": "done",
      "branch": "claude/project-thread-wqumyb",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/33121",
      "session": "session_016WV4czsbPsUx7axSQG2Y9F",
      "premise_still_valid": true,
      "summary": "On the per-package pass, os validate / os build / os lint now resolve a dashboard widget's dataset the way the runtime does: first the package's own dataset, then the one holder in its declared dependency closure (ADR-0150 D3, ruling option two on #32929). A name held only outside that closure, or by two packages inside it, is refused (widget-dataset-unknown). The finding names the open fix, read off the artifact: the move when the holder already depends on the reader (a cycle), otherwise the dependency. After review#1 (6857932402, 6860238813) the change also: is Metadata-protocol narrowed and minor on @objectstack/lint, with a BREAKING banner and the ADR-0087 entry dashboard-dataset-outside-reader-closure-refused (M1, M3); recognises the per-package pass by the body itself, so the union run of a manifest:'preserve' composition with a residual top-level datasets is unchanged (M2); and reports, rather than refuses, an outside-closure name when the reader declares a dependency the artifact does not carry (S1, a warning that cannot reach the publish door, pinned). It also carries the outside-closure sentence nits of 6841428662 in core, the CLI and the publish probe.",
      "tests": "Head e29910fcd7 (after one more clean merge of origin/main bf02d33bd6 once the sibling #33124 landed). Closure rebuilt under os-verify-lock: turbo build of dogfood^... + cli^... + cli exit 0. On that head: @objectstack/core test exit 0 (3371), core typecheck exit 0, @objectstack/lint test exit 0 (8752), dataset-app-reads-module.dogfood exit 0 (9/9). On 021038c13e (the round-3 code head; the later merge brings only main's files): lint test 8727 + typecheck, core 3371, spec migrations + upgrade-guide 228, metadata-protocol probes 15, cli unit 5934, cli migrate-meta-engine-guidance 3/3 (M3), dogfood file 9/9, all exit 0; pnpm lint exit 0. Ablations (ablation-replace, restored with git diff HEAD empty): M2, the id match put back, turns the unit pin red (1 failed | 15 passed); the same mutation through a rebuilt lint dist (ablation-dist-preflight found marker ABLATION-32967-M2 in 4 built files, then --absent after the restore and rebuild) turns the dogfood M2 cell red ('rule: widget-dataset-unknown at dashboards[0].widgets[0]', exit 1 expected 0). S1, the report arm disabled, turns its unit pin red (1 failed | 15 passed). Round-1 ablations (every body back in reach: 5 red; dogfood cell 1 through the dist; the core and CLI sentence arms) stand, and are in the PR body.",
      "gates": "node scripts/pm/dispatch-gates.mjs --ran on e29910fcd7: 98 derived, 98 run, 0 NOT-MEASURED, 0 UNRUN, every command exit 0 (the derived list is identical to 021038c13e's). Includes check-adr-0087-registration --base origin/main ([BREAKING+clause-②-narrowing+metadata-protocol-narrowed] registered dashboard-dataset-outside-reader-closure-refused), check-changeset-no-major, check-empty-changeset, spec check:spec-changes and check:upgrade-guide. The --ran file is in the PR body. CI check-runs on e29910fc, read at 19:35Z: 71 runs, 58 success, 13 skipped, none failed or pending; Check Changeset success (re-run 19:08:16Z after the body r3 edit).",
      "dogfood_battery": "e29910fcd7 · os-verify-lock: VERDICT command-exit 0 (held 30m50s) · Test Files 461 passed | 3 skipped (464) · Tests 3895 passed | 42 skipped (3937) · no failure. (Also green on 71dde93d8b: 461/464 files, 3883 tests.)",
      "mcp_calls": "0 — no GitHub MCP tool was called; GitHub reads went through gh api --jq",
      "api_writes": "5, all through the relay (scripts/pm/post-stamped.mjs / scripts/pm/fleet-write/dispatch.mjs): claim 6855987560 and its whole re-post 6858292095 on #32967; pr_create #33121; ring of triage#1 6857360199 on #32588; ring of review#1 6861546781 on #33116. The PR title and body edits of round 2/3 were applied by the seat from /mnt/project-files/epic-31527-seat2/cards/32967-thread/pr-body-r2.md and pr-body-r3.md. This report is the sixth write.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: a · reach: os validate / os build refuse a report whose dataset a DECLARED dependency holds (chart-dataset-unknown, validate-chart-bindings.ts, reads stack.datasets alone), while the runtime serves it with 200 · evidence: runAuthoringRules('validate', …) over a two-package stack: binds dataset \"book_metrics\", which resolves to no declared dataset · carrier: #33128 (the seat's, the report half of #32967)",
        "class: b · reach: card item 2, measured: an app package's type:'flow' action that starts a flow its own module holds answers 200 (screen and autolaunched, with and without a record) and os validate exits 0, because flowServiceForCaller resolves a flow per caller only when two packages hold the name; datasets refuse a one-holder name outside the closure. So the two families are asymmetric, and authoring and runtime agree for each · evidence: /mnt/project-files/epic-31527-seat2/cards/32967-thread/flow-measure.out · carrier: the seat; no card filed (the order files one only for a refusal)",
        "class: c · reach: review n2, main's behaviour and not this diff's: for a reader that declares an outside dependency, a name NO body of the artifact holds stays an error, while the same outside package could hold it; the S1 arm softens only names another body holds outside the closure · carrier: the seat; noted, not filed"
      ]
    }

    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:serverDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions