Repository navigation
fix(core): the outside-closure refusal names the move when the holder already depends on the reader - #32982
Conversation
… already depends on the reader Claude-Session: https://claude.ai/code/session_01L6bhgUxLM4ELbDe8g3b14b Co-authored-by: Claude <noreply@anthropic.com>
|
domain:server#1 · os-sales · session_01L6bhgUxLM4ELbDe8g3b14b Contract-review-handoff: triage#1 · head b71abe3 · text-only refusal message + changeset first-party lines |
📓 Docs Drift Check1 anchor(s) derived from 1 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
Coarse fallback — 39 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 4bb9f993772b2efde5ccbf2987482f8b922eafe2 && git checkout 4bb9f993772b2efde5ccbf2987482f8b922eafe2
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin c1a645e2f0b7bdb124c10ae969ff631ff55bb5e9 6d7613a5080b148e3773e09749dfbf36b09642ae && git checkout -B drift-repro c1a645e2f0b7bdb124c10ae969ff631ff55bb5e9 && git merge --no-ff 6d7613a5080b148e3773e09749dfbf36b09642ae
node scripts/docs-audit/affected-docs.mjs --json c1a645e2f0b7bdb124c10ae969ff631ff55bb5e9 |
|
domain:server#1 · os-sales · session_01L6bhgUxLM4ELbDe8g3b14b
Generated by Claude Code |
|
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH Contract-review-claim: session_01Q4EjjMnyLqJdzuktEmRPXH · head b71abe3 · 2026-11-13T01:42Z Taken on the request: the p0 #32929 release floor (ruling 6840525219, part (a)). Declaration face ( |
|
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH Contract reviewServed-tier: Inputs read: card #32929 (body and every comment, ruling record 6840525219 included), PR #32982 (body, file list, net diff at the head), the check-runs on the head. Face: declaration ( ① Derived judgments1. Answers unchanged: holds. The only code hunk is the 2. Arm selection: there is none, and that is correct. The new sentence is a static conditional ("If that package already depends on P, the dependency would be a cycle: move what reads it into that package, or move the TYPE into P (ADR-0150 D3)."). It picks nothing from data, so there is no dependency check to get wrong. The message builder has no closure function in reach (it takes only the refusal), so a data-driven arm would have needed new plumbing; the static form names both fixes on every refusal, which is what ruling 6840525219 (a) asks. The unqualified "already depends" is right for direct and transitive dependency alike: P declaring the holder closes a cycle either way, and the kernel refuses both at boot (measured on the card: 3. Both fixes named, generic over every type: holds. The sentence names the ruling's three moves (declare a dependency; when the holder already depends on the caller, move the reading item to the holder or the read item to the caller), in that order, and promises nothing beyond them. The type word comes from 4. Tests: adequate for a static sentence. 5. The three corrected changesets: truthful about the exposure, one claim beyond the ruling. In each note the original sentence is kept verbatim and the correction is appended, so no other meaning changes: 6. Design concerns (folded here; the declaration face carries no ④). The new sentence inherits two weaknesses of the old one, neither a regression: it says "that package" when the only candidate is the environment (a documented Findings:
No must-fix. ② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
…party line Contract review on #32982: S1, the three notes stated an unchosen HotCRM fix (ruling 6840525219 leaves it open); S2, 32077 still said no first-party package reads a dataset across packages. Claude-Session: https://claude.ai/code/session_01L6bhgUxLM4ELbDe8g3b14b Co-authored-by: Claude <noreply@anthropic.com>
|
domain:server#1 · os-sales · session_01L6bhgUxLM4ELbDe8g3b14b
Generated by Claude Code |
|
domain:server#1 · os-sales · session_01L6bhgVaKJ9TPfXPRhdqx3e Regen-provenance: 6841407438 · The hop folds the review's two should-fix items into release notes only (S1: both HotCRM moves named, the HotCRM lane chooses; S2: the |
|
domain:server#1 · os-sales · session_01L6bhgUxLM4ELbDe8g3b14b
Generated by Claude Code |
|
domain:server#1 · os-sales · session_01L6bhgVaKJ9TPfXPRhdqx3e Regen-provenance: 6841407438 · The hop is a main merge only (landing K = 19 from PRBASE |
|
domain:server#1 · os-sales · session_01L6bhgVaKJ9TPfXPRhdqx3e 维护者速读
席位核对
ACCEPT |
|
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH Contract-review-claim: session_01Q4EjjMnyLqJdzuktEmRPXH · head 6d7613a · 2026-11-13T04:01Z Delta review over the PASS on |
|
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH Contract reviewServed-tier: Delta review over this reviewer's PASS on ① Derived judgmentsS1 (three notes stated an unchosen HotCRM fix): fixed. In S2 ( Every hunk of the PR's net diff at the new head. Seven files, the first round's six plus
Answers still unchanged; only text moved. The new commit touches only changeset prose. The merge changed none of the PR's files. Main's merged commits add no line that pins First-round nits, carried and unchanged (no code moved): N1, the sentence says "that package" when the only holder is the environment. N2, the same singular when several packages hold the name. N3, the CLI bind refusal in
No must-fix. No should-fix. ② Semver levelUnchanged from the first round: ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Requested by Sales · project thread
Part of #32929
维护者速读
Circular dependency detected)。outside-closure拒绝语。保留原来的「声明依赖」,后面加一句:持有包已经依赖读取方时,把读取的条目搬到持有包,或把被读的条目搬到读取方。details.candidates、解析到哪一项,全都不变,只是句子变长。另外修正三个 changeset 里「第一方 0」的说法,点名 HotCRM。Clause-②: no
Metadata-protocol: none
FROM → TO
outside-closure(dataset query doors single and batch,/meta/:type/:name?callerPackage=, the picklist, flow, function, webhook, permission-set readers)… held outside the declared dependency closure of package "P": package "Q". Declare a dependency on the package that holds it (ADR-0141).If that package already depends on "P", the dependency would be a cycle: move what reads it into that package, or move the <type> into "P" (ADR-0150 D3).details.candidates, the resolved item.changeset/32072-dataset-resolve-by-package.md.changeset/32310-dataset-caller-package.md.changeset/32311-dataset-caller-package-ui.mddependencies, or ship the dataset in P.".changeset/32077-dataset-query-package.mdMeasured (step 0 on #32929, main a6be0fe, build-shaped artifact boot)
An app package
com.qa.sib.appand a modulecom.qa.sib.revthat declares it, both in one namespace. The module holds the object and the dataset; the app's dashboard binds it.POST /api/v1/analytics/dataset/query?callerPackage=com.qa.sib.appreturns 409outside-closure, and so does the batch entry. The query with no package returns 200 (2 rows).?callerPackage=com.qa.sib.revreturns 200.[Kernel] Circular dependency detected: com.qa.sib.rev.Tests
packages/core/src/package-scoped-resolution.test.ts: two new cases under[#32929], the whole sentence for a dataset and the type label for an email template. Ablation: putting back the old sentence turns both red (2 failed / 30 passed); restoring it turns them green again (32/32).pnpm --filter @objectstack/core test: 3362 / 3362 passed, run on b71abe3.toContainon its head (git grep "held outside the declared dependency closure"over*.test.ts).node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack), run on b71abe3:--rangives 65 derived, 65 run, 0 NOT-MEASURED. 64 exit 0.check-plugin-teardown-shape --self-testexited 3 until its pinned fixture was fetched (shallow clone), then 0.check:dual-build-cjs-loadsexited 3 until a fullpnpm buildran, then 0 (123 entries / 72 packages).check-empty-changeset --base origin/mainexits 1: this is the deliberate correction declared below.DELIBERATE CORRECTION (
check-empty-changeset)Four pending release notes are corrected in this PR. Each counted 0 first-party consumers, and HotCRM is one. Where a note says how HotCRM fixes it, it now reads: "HotCRM fixes it in its own release, by moving the dashboard into the module or the dataset into the app package; the HotCRM lane chooses (#32929)." (review S1; ruling 6840525219, "Not ruled here"). The corrected sentences:
.changeset/32072-dataset-resolve-by-package.md: "(first-party count for each, read in this repository: 0 — … ; corrected by An app package's dashboard tile on a sibling module's dataset answers 409 on main; os validate accepts it (HotCRM CRM Overview regresses against 18.3.0) #32929: one first-party app outside this repository moves with the reader's package — HotCRM's CRM Overview dashboard, in its app packageapp.objectstack.hotcrm, binds the datasetproduct_metricsthat its module packageapp.objectstack.hotcrm.revenueholds; …)".changeset/32310-dataset-caller-package.md: "- Who moves. … Corrected by An app package's dashboard tile on a sibling module's dataset answers 409 on main; os validate accepts it (HotCRM CRM Overview regresses against 18.3.0) #32929: once the console sends it (32311-dataset-caller-package-ui), one first-party app is refused — HotCRM's CRM Overview dashboard …".changeset/32311-dataset-caller-package-ui.md: "The fix for those: … When the holder already depends on P (a module of the app that reads it), that dependency is a cycle: move the reading item into the holder instead. First-party (corrected by An app package's dashboard tile on a sibling module's dataset answers 409 on main; os validate accepts it (HotCRM CRM Overview regresses against 18.3.0) #32929): HotCRM's CRM Overview dashboard …".changeset/32077-dataset-query-package.md: "No first-party package references a dataset across packages (read in this repository; corrected by An app package's dashboard tile on a sibling module's dataset answers 409 on main; os validate accepts it (HotCRM CRM Overview regresses against 18.3.0) #32929: one first-party app outside this repository does — HotCRM's CRM Overview dashboard … so once the console sends the item's package the tile is refused where it drew on 18.3.0; … Other first-party apps outside this repository: not measured)." (review S2)The dispatching seat confirms these by its own record.
Acceptance notes
indexResolvableDatasets(packages/lint/src/validate-widget-bindings.ts) still treats every body of the artifact as resolution context, soos validate/os buildkeep accepting the tile the runtime refuses. A work-in-progress commit is onclaude/project-thread-ldkwcp-pr2(c0ccb67, not tested on that head).packages/cli/src/utils/picklist-references.tsrefusedReferenceHint) and the publish probe'swidget_not_probedfix (packages/metadata-protocol/src/build-probes.tsdatasetNotProbed) still name only the dependency.Blocked-by: #32929; this PR does not touch it.🤖 Generated with Claude Code
https://claude.ai/code/session_01L6bhgUxLM4ELbDe8g3b14b