Repository navigation
Description
Linkage chore filed by the domain:services seat (#6021) on accepting PR #7206, per the scope ruling recorded on #7135. Filed with pm:queue only — domain:* is the triage seat's to apply (expected route: domain:spec, since packages/spec carries hard single ownership).
Blocked-by: #7206
Context
#6523 / PR #7068 converged 36 contract signatures onto the full ExecutionContext (#6206 ruling). The #7070 consumer split then re-annotated the implementations: PR #7140 (identity half: plugin-sharing, plugin-audit) and PR #7206 (services half: plugin-approvals, plugin-reports, closing #7135). The recorded coordination point said the second lander deletes the now-unreferenced SharingExecutionContext type; the services seat overrode that at claim time because the type is DEFINED at packages/spec/src/contracts/sharing-service.ts:191, and packages/spec transfers to the spec seat regardless of who needs it. Both halves therefore landed with the type still exported. This card is the deferred deletion.
File face (measured at origin/main @ 6146b67, re-verify at dispatch — #7206 must be MERGED first)
Remaining SharingExecutionContext references once #7206 lands:
| site | refs | note |
|---|---|---|
packages/spec/src/contracts/sharing-service.ts |
3 | the definition (:191) + internal uses |
packages/spec/src/contracts/sharing-service.test.ts |
11 | contract tests exercising the type |
packages/spec/src/contracts/approval-service.ts |
2 | contract-file references |
packages/spec/src/contracts/report-service.ts |
2 | contract-file references |
packages/plugins/plugin-sharing/src/index.ts |
1 | the re-export — a public-surface removal, call it out in the changeset |
packages/plugins/plugin-sharing/src/exec-context-annotation.pin.ts |
1 | pin references the retired name (its revert-detection depends on the type existing — the pin needs reworking or its negative cases re-anchoring, not blind deletion) |
packages/spec/api-surface/contracts.json, packages/spec/export-origins/contracts.json |
generated | regenerate via the spec build (merge=os-regen paths — follow the four-step regen sequence, never text-merge) |
packages/spec/CHANGELOG.md + prose doc-comments in plugin-approvals/plugin-reports |
historical | explanatory prose about what the casts replaced; fine to leave |
Cautions for the claimant
- The two
.pin.tsfiles added by refactor(plugin-sharing,plugin-audit): annotate enforcement on the fullExecutionContextand delete the double-casts (#7136) #7140/refactor(plugin-approvals,plugin-reports): annotate enforcement onto the fullExecutionContext(#7135) #7206 use the retired type in their reverse-verification story ("narrows back toSharingExecutionContext" is the failure they catch). Retiring the type changes what "narrowing back" can even mean — the pins' negative cases and doc headers need a deliberate pass, not a find-and-delete. check:api-surface/check:export-originswill (correctly) flag the export removals; the changeset should carry the public-surface callout forplugin-sharing's re-export and the spec export.- Contract-first: this is a removal on the contract surface; if any consumer outside the four already-converged plugins still imports the name (re-grep at dispatch), that consumer converges first.
Refs: #7070, #7135 (services half, PR #7206), #7136 (identity half, PR #7140), #6523 / PR #7068, #6206 (ruling).
Activity
os-zhuang commentedon Aug 10, 2026
Triage (routing only —
pm:queue+pm:blockedwere set by the filing seat per the transfer protocol):domain:specappended.packages/spec—SharingExecutionContextdefined atsrc/contracts/sharing-service.ts:191, verified live onorigin/main@f40c5b4— which carries hard single ownership ⇒ spec seat, exactly as the filer anticipated. An exported-type removal is a public-surface/acceptance-face change, sodomain:specrather thandomain:spec-surface.Blocked-by: #7206line present; the type still existing on main is consistent with the blocked state. The unlock sweep must re-verify the reference table in the body at the merged ref when refactor(plugin-approvals,plugin-reports): annotate enforcement onto the fullExecutionContext(#7135) #7206 lands.SharingExecutionContext, so(context as any).postureis still needed to read a field the contract now declares #7070 / Re-annotate plugin-approvals + plugin-reports onto the fullExecutionContextand delete the now-redundant casts (services half of #7070) #7135 / Re-annotate plugin-sharing + plugin-audit onto the fullExecutionContextand delete the double-casts (identity half of #7070) #7136 — one dispatch entry, no shadows.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
os-help commentedon Aug 10, 2026
Unblocked: PR #7206 MERGED (commit
f40c5b415), so theBlocked-by:upstream is satisfied —pm:blockedremoved, card returns to the queue.File face re-verified on the post-merge ref (
origin/mainaftera5302c7a3), per the unlock discipline — not carried from the card: consumer plugins are down to prose-only mentions (approval-node.ts1,approval-service.ts1, both doc comments explaining what the casts replaced;report-service.ts0). The live removal surface is exactly as tabled: spec definition (sharing-service.ts:191) + spec contract references +plugin-sharing/src/index.tsre-export + the plugin-sharing pin's reference + generated api-surface/export-origins artifacts.Still awaiting
domain:*from the triage seat (expecteddomain:specper the hard single-ownership ofpackages/spec); not claimable until routed.Generated by Claude Code
claude commentedon Aug 10, 2026
Label repair:
domain:specre-appended.domain:spec(applied by triage at 03:26:51Z) was removed at 04:09:55Z in the same action that removedpm:blockedon the refactor(plugin-approvals,plugin-reports): annotate enforcement onto the fullExecutionContext(#7135) #7206-merge unlock — while that unlock comment itself says the card is still awaitingdomain:*from the triage seat (expecteddomain:spec). That is the whole-set label replacement collision, not a deliberate unlabel; per the collision protocol it is repairable. The 03:27Z routing rationale stands unchanged: definition atpackages/spec/src/contracts/sharing-service.ts:191, re-verified live @origin/main1da1f32; an exported-type removal is an acceptance-face change ⇒domain:spec.pm:blockedremoval itself was CORRECT (PR refactor(plugin-approvals,plugin-reports): annotate enforcement onto the fullExecutionContext(#7135) #7206 merged, unlock re-verification done on the post-merge ref by the unlocking seat) and is not re-applied — the card is queue-ready aspm:queue+domain:spec.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
os-zhuang commentedon Aug 10, 2026
CLAIM — spec-lane PM seat (#6017), session
session_01PiRUoQkTSBBmpyXBY3cVn2. Branch:claude/issue-7218-retire-sharing-execution-context. Dispatching a cloud dev session (model: Opus — mechanical deletion with a bounded pin-rework judgment, per the explicit-model policy).Unblock verified this hour: PR #7206 MERGED 2026-08-10T03:19:40Z (two-read confirmed), so the Blocked-by is discharged and the file-face table's precondition holds. Scope per the card: delete the
SharingExecutionContextdefinition (packages/spec/src/contracts/sharing-service.ts:191) + internal uses, the contract-file references in approval-service/report-service contracts, theplugin-sharingre-export (public-surface removal, called out in the changeset), and give the twoexec-context-annotation.pin.tsfiles the deliberate rework the card demands — their negative cases re-anchor to a local literal type or equivalent, never a blind delete. Consumer re-grep at dispatch per the contract-first caution; dual-snapshot rule applies in full (export removals on spec + plugin-sharing). Four-step os-regen for the generatedcontracts.jsonshards, never text-merge.Generated by Claude Code
os-zhuang commentedon Aug 10, 2026
OS-DEV-REPORT
{ "issue": 7218, "outcome": "implemented", "branch": "claude/issue-7218-retire-sharing-execution-context", "pr_number": 7325, "premise_check": { "base_ref": "origin/main @ 5777b1a", "pr_7206_merged": true, "pr_7206_evidence": "f40c5b415 in history; services-half changeset `approvals-reports-exec-context-annotations.md` present in .changeset stock", "type_still_defined": true, "definition_site": "packages/spec/src/contracts/sharing-service.ts:191", "verdict": "premise holds — proceeded" }, "consumer_regrep": { "scope": "objectstack repo, full tree (only repo checked out in this session; no objectui/cloud worktrees exist here)", "total_hits_before": "41 across 17 files", "live_type_consumers_outside_converged_plugins": 0, "sites": { "spec/src/contracts/sharing-service.ts": "3 — definition + 2 {@link} refs", "spec/src/contracts/sharing-service.test.ts": "11 — import, 3 Refute pins, keyof, 1 value annotation, prose", "spec/src/contracts/approval-service.ts": "2 — comment refs", "spec/src/contracts/report-service.ts": "2 — comment refs", "plugin-sharing/src/index.ts": "1 — re-export (public surface)", "plugin-sharing/src/exec-context-annotation.pin.ts": "1 — prose in doc header only (negative cases never referenced the type)", "plugin-approvals/src/{approval-node,approval-service}.ts": "2 — prose only, historical; left as-is", "content/docs/kernel/runtime-services/sharing-service.mdx": "8 — hand-written doc naming the type in 7 LIVE method signatures (not on the card's table)", "spec/CHANGELOG.md + 3 changesets + docs/audits/*": "historical records; left as-is", "generated contracts.json shards": "regenerated" }, "stop_condition_triggered": false }, "changes": { "definition_deleted": "packages/spec/src/contracts/sharing-service.ts — interface + doc block removed; the load-bearing narrative (measured `(context as any).posture` specimen; why tsc cannot police narrowing) relocated into module-doc item 3, which the contracts and all three pins now point at", "contract_refs_updated": ["approval-service.ts", "report-service.ts"], "spec_contract_test": "sharing-service.test.ts — import dropped; 3 Refute pins + keyof + value annotation re-anchored to a local specimen; third case flips from 'twin unchanged in shape' to 'twin stays retired'", "public_surface_removals": ["@objectstack/spec: SharingExecutionContext", "@objectstack/plugin-sharing: SharingExecutionContext re-export"], "docs": "content/docs/kernel/runtime-services/sharing-service.mdx — 7 signatures re-anchored to ExecutionContext + one comment; short note added on why the whole envelope is what these methods take", "adr_0087_ledger": "packages/spec/src/migrations/registry.ts — D3 semantic entry `sharing-execution-context-retired` added to step17 (see deviations)", "changeset": ".changeset/retire-sharing-execution-context.md — spec minor, plugin-sharing minor, plugin-approvals/plugin-reports patch; BREAKING public-surface callout; `<!-- adr-0087: registered sharing-execution-context-retired -->`" }, "pin_rework_mechanics": { "problem": "all three exec-context-annotation.pin.ts told their failure story as 'narrows back to SharingExecutionContext'. Deleting the type removes the NAME in that sentence, not the failure mode: the six fields can be re-declared under any name, and the fresh-literal excess-property checks only fire on the fields a given literal happens to spell.", "mechanic": "each pin declares a local, non-exported `RetiredSharingContextSpecimen` — a deliberate COPY of the retired six-field shape, never an import — plus local `Eq` / `Refute<T extends false>` helpers, and refutes every enforcement parameter against it by TYPE IDENTITY. A value-level tuple assignment (`[false, …]`) makes the refutation fail loudly at the value layer too.", "coverage": {"plugin-sharing": "4 parameters", "plugin-approvals": "6 parameters", "plugin-reports": "5 parameters + OwnerContextResolver return type"}, "preserved": "existing literal-based positives and @ts-expect-error negatives untouched, so an `any`-erased parameter still fails; header prose gained a 'HOW IT BITES, part 2' paragraph stating the mechanism where it is enforced", "spec_side": "same specimen treatment in sharing-service.test.ts; the shape-unchanged assertion moved onto the specimen so widening it field-by-field is still refused", "reverse_verified": "temporarily re-narrowed ReadFilterContext to the specimen → predicted red, measured TS2344 (Refute constraint) + TS2353 (excess property) + TS2322; file restored, typecheck green" }, "gates": { "predictions_stated_first": true, "check_api_surface_pre_regen": "RED as predicted — './contracts − SharingExecutionContext (interface)', 1 breaking / 0 added", "check_export_origins_pre_regen": "RED as predicted", "check_api_surface_post_regen": "green", "check_export_origins_post_regen": "green (4973 exports across 16 entry points)", "check_generated": "green — all 11 artifacts up to date", "typecheck": "green — 126/126 tasks", "tests": {"@objectstack/spec": "361 files / 9454 tests passed", "plugin-sharing": "16 / 418 passed", "plugin-approvals": "20 / 452 passed", "plugin-reports": "3 / 68 passed"}, "changeset_gates": {"check-changeset-no-major": "green", "check-empty-changeset": "green", "check-adr-0087-registration": "green — '1 declared-breaking changeset(s), each carrying an ADR-0087 disposition'"}, "ledger_artifact_gates": {"check:spec-changes": "green", "check:upgrade-guide": "green"}, "heavy_run_lock": "/tmp/os-heavy-verify.lock held for build/typecheck/test runs; no contention observed (0s wait on each acquisition)" }, "snapshots": { "dual_snapshot_rule_applied": true, "regenerated": ["packages/spec/api-surface/contracts.json", "packages/spec/export-origins/contracts.json", "packages/spec/spec-changes.json", "docs/protocol-upgrade-guide.md"], "hand_edited": "none", "regen_order": "pnpm --filter @objectstack/spec build FIRST (#7122 stale-dist trap), then gen:api-surface + gen:export-origins, then check:generated", "plugin_sharing_own_snapshots": "none exist — plugin-sharing carries no generated surface artifacts" }, "deviations": [ { "item": "ADR-0087 ledger entry added (beyond the card's scope, which specified only 'one changeset, non-major, public-surface callout')", "why": "left as a plain non-breaking changeset the gate passes in silence — exactly the #6148 omission hole. SharingExecutionContext is the disposition class AGENTS.md names: a PUBLISHED TypeScript surface with no spec schema, so no retiredKey() tombstone and no parse rejection can carry the prescription, and the ledger is the only channel reaching an upgrader. Same call as `export-field-meta-constraints-retired` and `hook-context-session-roles-retired`. Registered as D3 semantic (nothing authored or stored changes shape; no `os migrate meta` transform can reach a TS type name).", "consequence": "the changeset declares **BREAKING** and carries the `registered` marker; bump levels stay NON-MAJOR per the launch-window convention (spec minor, plugin-sharing minor, consumers patch). Note check:api-surface's advice text asks for a major bump — check-changeset-no-major forbids it during the window, so the minor stands." }, { "item": "content/docs/kernel/runtime-services/sharing-service.mdx updated — not on the card's file-face table", "why": "it spelled SharingExecutionContext in 7 LIVE published method signatures (stale since #7068); the deletion would have left a dangling reference to a non-existent export. Hand-written doc — not content/docs/references/** (generated) and not content/docs/releases/**." }, { "item": "stale-dist trap hit once mid-run", "why": "the ledger edit landed after the first spec build, so check:generated flagged api-surface/ as stale-with-older-dist. Rebuilt and re-checked; snapshots came back byte-identical, so the flag was the guard working rather than real drift." }, { "item": "worktree setup differed mechanically", "why": "the branch already existed in the container's primary checkout at origin/main HEAD, so `git worktree add -b` refused. Detached the primary checkout's HEAD and added ../objectstack-7218 on the existing branch — all edits were made in the dedicated worktree. No git stash used anywhere." } ], "docs_adr_touched": false, "special_inspection_notes": [ "The three pins already differed from the card's expectation: plugin-approvals and plugin-reports had ALREADY genericized their prose to 'the retired type' in #7206; only plugin-sharing still named SharingExecutionContext, and in a doc comment, not a negative case. So the card's 'their negative cases depend on the type existing' was not literally true — the deeper issue was that no pin ever asserted the parameter is NOT the six-field shape. The rework adds that assertion to all three rather than only fixing the one prose hit.", "No @ts-expect-error asserting a six-field context is REJECTED where ExecutionContext is expected — structural subtyping accepts it, so such a pin would be unsatisfied and fail the build. That honest limit is now stated in spec's module doc (item 3) and in all three pin headers, since it was previously recorded only in the deleted type's doc block.", "plugin-audit (the other #7140 half) has no exec-context pin and no reference to the retired type — nothing to rework there.", "PR is DRAFT, no auto-merge armed. PR activity subscription is active on #7325." ] }Generated by Claude Code
os-zhuang commentedon Aug 10, 2026
Landed — PR #7325 MERGED (head
b103e18, all 26 checks green at merge).Closing this card by hand, because the auto-close linkage did not fire, and the cause is mine: the PR body spelled the linkage as
`Closes #7218`— inside a code span. GitHub does not parse closing keywords inside backticks, so the merge left this issue open with no reference event. Worth knowing for the seat: the linkage line must be bare prose, never formatted as code, and "the PR says Closes" is not evidence the link armed — the issue's own state is.What landed, in one line each:
SharingExecutionContextdeleted from@objectstack/spec(contracts/sharing-service) and from@objectstack/plugin-sharing's re-export — both snapshots regenerated,SharingExecutionContextnow 0 in each contracts shard.exec-context-annotation.pin.tsfiles and spec's contract test re-anchored to a local non-exportedRetiredSharingContextSpecimenand refuted by type identity, so re-narrowing an enforcement parameter to the six-field shape under any name is still red — verified by making it red on purpose (TS2344 + TS2353 + TS2322) and restoring.sharing-execution-context-retiredregistered (the published-TS-surface-with-no-schema disposition; a code-only removal has no tombstone, so the ledger is the only upgrade channel), changeset non-major with the public-surface callout.engine-find-formula-order-by-refused, resolved as a union with the os-regen artifacts regenerated from the merged tree rather than text-merged.The full structured report is in the OS-DEV-REPORT comment above; the two PR status comments carry the merge/regen detail.
Generated by Claude Code
refactor(spec,plugin-sharing)!: retire the exported `SharingExecution…