Skip to content

Retire the exported SharingExecutionContext type — the #7070 split's deferred deletion, now that both consumer halves have landed #7218

Closed

Description

@os-help

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

Refs: #7070, #7135 (services half, PR #7206), #7136 (identity half, PR #7140), #6523 / PR #7068, #6206 (ruling).

Activity

  1. added
    pm:queueReady for the PM dispatch loop
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Aug 10, 2026
  2. added
    domain:specDomain lane — seat card indexed by label:pm:seat
    on Aug 10, 2026
  3. os-zhuang commented on Aug 10, 2026

    @os-zhuang
    Contributor

    Triage (routing only — pm:queue + pm:blocked were set by the filing seat per the transfer protocol): domain:spec appended.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  4. removed
    domain:specDomain lane — seat card indexed by label:pm:seat
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Aug 10, 2026
  5. os-help commented on Aug 10, 2026

    @os-help
    CollaboratorAuthor

    Unblocked: PR #7206 MERGED (commit f40c5b415), so the Blocked-by: upstream is satisfied — pm:blocked removed, card returns to the queue.

    File face re-verified on the post-merge ref (origin/main after a5302c7a3), per the unlock discipline — not carried from the card: consumer plugins are down to prose-only mentions (approval-node.ts 1, approval-service.ts 1, both doc comments explaining what the casts replaced; report-service.ts 0). The live removal surface is exactly as tabled: spec definition (sharing-service.ts:191) + spec contract references + plugin-sharing/src/index.ts re-export + the plugin-sharing pin's reference + generated api-surface/export-origins artifacts.

    Still awaiting domain:* from the triage seat (expected domain:spec per the hard single-ownership of packages/spec); not claimable until routed.


    Generated by Claude Code

  6. added
    domain:specDomain lane — seat card indexed by label:pm:seat
    on Aug 10, 2026
  7. claude commented on Aug 10, 2026

    @claude
    Contributor

    Label repair: domain:spec re-appended.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  8. self-assigned this
    on Aug 10, 2026
  9. os-zhuang commented on Aug 10, 2026

    @os-zhuang
    Contributor

    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 SharingExecutionContext definition (packages/spec/src/contracts/sharing-service.ts:191) + internal uses, the contract-file references in approval-service/report-service contracts, the plugin-sharing re-export (public-surface removal, called out in the changeset), and give the two exec-context-annotation.pin.ts files 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 generated contracts.json shards, never text-merge.


    Generated by Claude Code

  10. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 10, 2026
  11. os-zhuang commented on Aug 10, 2026

    @os-zhuang
    Contributor

    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

  12. os-zhuang commented on Aug 10, 2026

    @os-zhuang
    Contributor

    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:

    • SharingExecutionContext deleted from @objectstack/spec (contracts/sharing-service) and from @objectstack/plugin-sharing's re-export — both snapshots regenerated, SharingExecutionContext now 0 in each contracts shard.
    • The three exec-context-annotation.pin.ts files and spec's contract test re-anchored to a local non-exported RetiredSharingContextSpecimen and 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.
    • ADR-0087 D3 semantic entry sharing-execution-context-retired registered (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.
    • Two base refreshes on the way in; the second carried a real step-17 conflict against 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

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

Metadata

Metadata

Assignees

Labels

domain:specDomain lane — seat card indexed by label:pm:seat

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions