Skip to content

webhooks, connectors, email templates on (package, name) (ADR-0150 child E5) #31677

Closed

Description

@objectstack-fleet

epic:#31527#1 · os-project-manager · session_01FEkQ5mLd7pR2PHjsPwiGkz

Ruled: 6729831159 · letter A · 2026-11-09T01:11Z
Ruling-ref: 6729831159

Filing gate: ④ coordination node: child E5 of the epic #31527 (parent and per-layer children), as ADR-0150 (docs/adr/0150-behavioural-metadata-addressed-by-package-objects-keep-the-literal-prefix.md, merged in #31586 at 5d1382a)'s execution plan lists it. Hand-over card: filed undispatched as the epic seat signs off (maintainer 2026-11-08T16:34Z 「专题卡当前任务处理完,合并后就下班」). ⛔ Not a claim.
Ruling-ref: per-type table A (6723462584); epic A 「立专题」 (6723499113); division of labour A 「留核心,其余交车道」 (6723571682); ADR-0150 accepted by merge (#31586, 2026-11-08T21:16Z).
Business reason: inherited from the parent #31527. Behavioural metadata is addressed by (package, name), so two installed packages can each ship an item of the same name and every reader answers the right one, or refuses with the candidates, instead of silently taking the first match.
Reader: the next domain:server seat picks it from the queue (pm-dispatch selection) and accepts its PR against the red lines below.
Dedupe (open AND closed): webhook connector email template package (79; top hits #30806(open) #27314(open) #31527(open), none on point: they are this epic, its parent #30806, or unrelated cards).
class: d · type: Feature
Grade: p1, inherited from the parent (self-graded under 「定级你可以自己决定」).
Blocked-by: #31575

维护者速读

Webhook、连接器、邮件模板按(软件包, 名称)查找。

What to build

Webhooks, connectors and email templates consult on (package, name) through R's resolver.

Surface

  • Expected file surface: plugin-webhooks, service-automation connectors, plugin-email.
  • Clause-②: no.
  • Narrowing: yes, for a package item's bare reference that only an environment-authored item holds (D3 (a); not measurable first-party; the D10 upgrade report lists each case).

Acceptance — the epic's three red lines (every child shares them)

  • Resolution never loosens. No first-registered fallback, no environment-wide guess for a caller with a package, no silent pick.
  • Ambiguity is reported, never guessed. Every refusal and every migration report names every candidate.
  • Independently releasable (red line 3). The PR proves it with ADR-0150's four readings: (a) the phase-1 one-holder tests stay green; (b) bare-name behaviour (URLs, MCP, SDK) is unchanged for every name with one holder, except this card's declared narrowing; (c) any migration is re-runnable and never guesses; (d) its Clause-②: declaration and, where it changes the protocol, its ADR-0087 migration entry.
  • The epic seat is off duty after hand-over: the accepting lane seat checks these lines itself, and a narrowing beyond the declared one goes to the maintainer before landing.

Parent: #31527.

Activity

  1. added
    enhancementNew feature or request
    priority:p1High: required for production / M2
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 8, 2026
  2. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: confirmed · domain:server · p1 · pm:blocked · 2026-11-08T21:57Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-set
    on Nov 8, 2026
  4. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#31527#1 · os-steve · session_01ADHkmP7o3uDTti21wLTfPf

    Unblocked 2026-11-08T23:01Z: Blocked-by: #31575 is closed. R merged in #31637 as 0ebb080 (resolvePackageScopedName, packageResolutionClosure and the three read-only SchemaRegistry package-scoped methods in objectql; packageDependencyClosure in metadata-protocol). pm:blocked → pm:queue in this stroke. Read the resolver through those exports only, and never re-implement the rule. The epic seat reviews this card's PR against the three red lines before it lands.

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

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-steve · session_01ADHkmQXLfvyB5R53VDm3Ka

    Claim: PM loop round 1 · #31677 (E5, epic #31527) · 2026-11-08T23:08Z
    Session: session_01ADHkmQXLfvyB5R53VDm3Ka (seat); dev = card thread session_01ADHkmR4astMzES5UkW47jW
    Account: os-steve
    Branch: claude/project-thread-bwr6nn
    Worktree: the card thread's checkout of objectstack-ai/objectstack
    Domain: domain:server
    Seat: domain:server#3
    File surface: packages/plugins/plugin-webhooks/src/**, the connectors in packages/services/service-automation/src/**, packages/plugins/plugin-email/src/**, their tests, .changeset/31677-*.md (stop on breach; ⛔ no packages/spec edit, no second resolver: R's exports only)
    Container & model: M, mode:thread, model: default tier; CONTRACT_REVIEW_TIER for the review owed before the queue (dispatch-gates --tier: a card that only NARROWS owes one contract-review-tier review, judged from the card content), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6728372383
    Premise: holds (R #31637 merged as 0ebb080; the card's Blocked-by: #31575 closed, moved to pm:queue by the epic seat in 6728372383; the dev confirms the resolver exports on main in step 0)
    Narrowing: as the card declares (D3 (a)), a package item's bare reference that only an environment-authored item holds; the dev measures it on base and head
    Serial constraints cleared: E1 #31672 (this seat, branch claude/project-thread-ack2ot) also touches service-automation (flows): parallel while the files are disjoint, E1 lands first if they meet and this branch merges origin/main after it. S3 #31684 follows E1, E5 and E7 on this seat.

  7. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 8, 2026
  8. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-steve · session_01ADHkmQXLfvyB5R53VDm3Ka

    Claim amendment · #31677 · 2026-11-08T23:12Z · amends Claim 6728454873
    File surface: adds packages/plugins/plugin-webhooks/package.json, packages/plugins/plugin-email/package.json, packages/services/service-automation/package.json (E1 #31672 moves the same service-automation line; E1 lands first and this branch merges origin/main after it) (only to move @objectstack/objectql from devDependencies to dependencies) and the matching pnpm-lock.yaml importer lines. Reason: R's resolver is exported from objectql, and a copy of the rule would be the second resolver the epic forbids. Condition: no dependency cycle (the dev shows the reading in the report; a cycle means stop and report, never a copy).
    Narrowing: per the epic seat's reading 6728487836 on #31527, a package caller's bare name whose only holder is a package outside its declared closure is inside ADR-0150 (step 3 of the ruled rule). The PR's Narrowing: line declares it beside D3 (a) with its measured first-party count, and measures the sibling-in-the-same-release-artifact sub-case separately: 0 lands on review; any other count holds for the ruling on #31678.

  9. 11 remaining items

  10. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-steve · session_01ADHkmR4astMzES5UkW47jW
    os-dev-report

    {
      "issue": 31677,
      "status": "done",
      "branch": "claude/project-thread-bwr6nn",
      "pr": 31744,
      "session": "session_01ADHkmR4astMzES5UkW47jW",
      "premise_still_valid": true,
      "summary": "Webhooks part of E5 after Q1 ruled A (6729831159): draft PR #31744 (Part of #31677), head 7d39171d, branch restarted from main after #31725 merged. The declared-webhook dispatcher and by-name reads ask resolvePackageScopedName as a no-package caller; a refused name is not dispatched, warned once naming every candidate, and the by-name read throws DeclaredWebhookAmbiguousError (409 RESOURCE_CONFLICT). Phase 1's dogfood pin declaredWebhookPackage(HOOK) === alpha moved to the refusal (both occurrences). Narrowing: line declares the ruled case beside D3 (a), first-party count 0. Remaining on #31677: the email half, waiting on R2 #31716 (patch at /mnt/project-files/server-seat3/31677/email-half.patch; its vitest config per Q4 goes with it).",
      "tests": "head 7d39171d. Under os-verify-lock: plugin-webhooks test exit 0 (25 files, 262), typecheck exit 0 (one && command, VERDICT 0). Targeted dogfood after dogfood^... build (70/70): 19 files, 96 tests passed, VERDICT 0, including bare-name-one-holder-flow-family with the moved pin. Ablations measured at da3bc28e, plugin-webhooks/src byte-identical to this head (git diff da3bc28e HEAD -- packages/plugins/plugin-webhooks/src empty): refusal -> listed[0]: 2 failed; registry-less >=1: 1 failed. The moved dogfood pin read com.qa.bare.alpha on main's reader (old pin green there), so the refusal assertion is red on main.",
      "gates": "CI on #31744 at 7d39171d: 67 check-runs, all success or skipped (Test Core 8/8, Test UI 16/16, Lint & Repo Gates, TypeScript Type Check, Check Changeset, PR-body guards). Local: dispatch-gates --commands at 7d39171d: 86 derived; 85 exit 0; check:dual-build-cjs-loads exit 3 ('Run pnpm build first … nothing was measured') then exit 0 on rerun; --ran: 86 run, 0 NOT-MEASURED, 0 UNRUN (derived zero). check:registry-log-declared green with the vitest config. eslint --no-inline-config over plugin-webhooks and the dogfood file exit 0. CI check-runs: pending on #31744.",
      "dogfood_battery": "7d39171d · VERDICT command-exit 0 (held the lock 1398s) · pnpm --filter @objectstack/dogfood test, no shard, no path, closure built at this head · Test Files 440 passed | 3 skipped (443) · Tests 3652 passed | 41 skipped (3693) · 0 failures. Owed by the declared narrowing (Q1 ruled A).",
      "mcp_calls": "this round 3 reads: pull_request_read get #31725, issue_read get #31736, (gh api read of comment 6729831159)",
      "api_writes": "this round 3: pr_create #31744 via relay (read-back identical, assignee os-steve), report 6730336692, and this re-post carrying the battery, via post-stamped.",
      "files_changed": [
        ".changeset/31677-package-scoped-declared-webhooks.md",
        "packages/plugins/plugin-webhooks/package.json",
        "packages/plugins/plugin-webhooks/src/declared-webhooks.ts",
        "packages/plugins/plugin-webhooks/src/declared-webhooks.test.ts",
        "packages/plugins/plugin-webhooks/vitest.config.ts",
        "packages/qa/dogfood/test/bare-name-one-holder-flow-family.dogfood.test.ts",
        "pnpm-lock.yaml"
      ],
      "line_budget": "325 changed lines (+307 / -18, 7 files) vs the 3000 human-merge threshold: under",
      "deviations": [
        "Forced test change: the dogfood pin moved from first-registered to the refusal, as ruled (Q1 A) and as seat 3 asked; named in the PR body.",
        "Branch restarted from main after #31725 merged: the webhooks commit sits on 1a2361c8 + f2abd476; the push was a new ref (the merged branch had been deleted), no force.",
        "No-cycle reading: objectql's workspace closure (14 packages) contains no plugin-webhooks.",
        "test:repo not run locally (CI Test Core); no repo-project test touched."
      ],
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": []
    }

    Stamped 2026-11-09T02:15Z.

  11. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-steve · session_01ADHkmQXLfvyB5R53VDm3Ka

    Landed (part) · #31677 webhooks (ADR-0150 E5) · 2026-11-09T02:35Z

    Reading Value
    PR #31744 merged as f65c36fc, from head 7d39171d (seat ACCEPT 6730649996, epic PASS 6730349344; full dogfood 3652 green on that head)
    Card open: Part of #31677

    Done so far: connectors (#31725) and webhooks (#31744). Remaining on this card: the email half, which waits on R2 #31716 (PR #31733, in the merge queue). pm:dispatched stays, and the claim continues on claude/project-thread-bwr6nn.

  12. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-steve · session_01ADHkmR4astMzES5UkW47jW
    os-dev-report

    {
      "issue": 31677,
      "status": "done",
      "branch": "claude/project-thread-bwr6nn",
      "pr": 31825,
      "session": "session_01ADHkmR4astMzES5UkW47jW",
      "premise_still_valid": true,
      "summary": "Email template part of E5, the card's last part, after R2 #31733 (36a87008): draft PR #31825 (Fixes #31677), head 375152d8, branch restarted from main 630a0baa. readBundle asks resolvePackageScopedName as a no-package caller before the per-locale pick; a refused name fails the send with EmailTemplateAmbiguousError (409, candidates). The dependent-locale dogfood that was 3 red at da3bc28e is green on R2. Narrowing: line declares the Q1-ruled sealed clash beside D3 (a), first-party 0. connector_action's connectorId is carried by E1 #31672 per Q3 A, so the PR closes the card.",
      "tests": "head 375152d8. Under os-verify-lock: plugin-email test exit 0 (50 files, 831), typecheck exit 0 (one && command, VERDICT 0). Ablation on this head (ablation-replace --delete, committed first, restored to HEAD blob, git diff HEAD empty): the refusal throw removed -> 1 failed (expected undefined to be an instance of EmailTemplateAmbiguousError). Targeted dogfood after dogfood^... build (70/70): 19 files, 98 passed.",
      "gates": "dispatch-gates --commands at 375152d8: 79 derived, all 79 ':: exit 0'; --ran 79 run, 0 NOT-MEASURED, 0 UNRUN (derived zero). First pass at 48ab8da9: check-console-intercept-disarm exit 1 (the vitest config merged the preset, which the gate reads as source) and dual-build-cjs-loads exit 3 (nothing measured before dists); fixed by the second commit, both 0 on the final pass. eslint over plugin-email exit 0. CI check-runs: pending on #31825.",
      "dogfood_battery": "375152d8 · VERDICT command-exit 0 (held the lock 1349s) · pnpm --filter @objectstack/dogfood test, no shard, no path · Test Files 440 passed | 3 skipped (443) · Tests 3654 passed | 41 skipped (3695) · 0 failures.",
      "mcp_calls": "0 this round",
      "api_writes": "this round 2: pr_create #31825 via relay (read-back identical, assignee os-steve), and this report via post-stamped.",
      "files_changed": [
        ".changeset/31677-package-scoped-email-templates.md",
        "packages/plugins/plugin-email/package.json",
        "packages/plugins/plugin-email/src/template-loader.ts",
        "packages/plugins/plugin-email/src/template-loader.test.ts",
        "packages/plugins/plugin-email/vitest.config.ts",
        "pnpm-lock.yaml"
      ],
      "line_budget": "166 changed lines (+154 / -12, 6 files) vs the 3000 human-merge threshold: under",
      "deviations": [
        "PR body says Fixes #31677: connectors (#31725) and webhooks (#31744) landed, and connector_action's connectorId was ruled out of this card (Q3 A, carried by E1 #31672). If the seat wants the card kept open for it, the body's first line becomes Part of #31677.",
        "plugin-email/vitest.config.ts no longer re-exports vitest.preset.mts: it spells disableConsoleIntercept itself beside env OS_REGISTRY_LOG, because check-console-intercept-disarm reads the file's source.",
        "No-cycle reading: objectql's workspace closure contains no plugin-email.",
        "test:repo not run locally (CI Test Core); no repo-project test touched."
      ],
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": []
    }

    Stamped 2026-11-09T05:55Z.

  13. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-steve · session_01ADHkmQXLfvyB5R53VDm3Ka

    Landed (part) · #31677 email (ADR-0150 E5) · 2026-11-09T07:49Z

    Reading Value
    PR #31825 merged 2026-11-09T06:57Z as 785d432b, from head 375152d8 (seat ACCEPT 6733684550, after the epic's review)
    Card open: Part of #31677

    Done so far: connectors (#31725), webhooks (#31744) and email (#31825). Remaining on this card: the connectorId reference (Q3 A, after E1). It lands as the last PR, with Fixes #31677. pm:dispatched stays, and the claim continues on claude/project-thread-bwr6nn. S3 #31684 unblocks when #31677 closes.

  14. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-steve · session_01ADHkmR4astMzES5UkW47jW
    os-dev-report

    {
      "issue": 31677,
      "status": "done",
      "branch": "claude/project-thread-bwr6nn",
      "pr": 31863,
      "session": "session_01ADHkmR4astMzES5UkW47jW",
      "premise_still_valid": true,
      "summary": "Last part of E5 (Q3 A), after #31825 merged as 785d432b: draft PR #31863 (Fixes #31677), head 17781316, origin/main merged in as 8c54bc7c. connector_action asks resolvePackageScopedName (type connector) for the calling flow's package, read through E1's flowCallerPackage (context.flowName -> packagedFlowOwner). A refused answer fails the node naming every candidate. A no-package caller, a code-registered connector or a host with no resolver dispatches by name as before. Narrowing: line declares outside-closure (sibling-in-artifact included), D3 (a) and two-in-closure for package callers; first-party 0.",
      "tests": "head 17781316. Under os-verify-lock: service-automation test exit 0 (267 files, 3505), typecheck exit 0 (one && command, VERDICT 0). 8 new tests in flow-package-scoped-resolution.test.ts over a real SchemaRegistry, including a booted AutomationServicePlugin pin for the init wiring. Ablations (ablation-replace, committed first, restored to HEAD blob, git diff HEAD empty): engine connectorNameRefusal -> undefined: 3 red; node refusal check removed: 3 red; plugin setConnectorNameResolver line deleted: 1 red (expected undefined to be 'refused').",
      "gates": "dispatch-gates --commands at 17781316: 73 derived, all 73 ':: exit 0'; --ran 73 run, 0 NOT-MEASURED, 0 UNRUN (derived zero). eslint --no-inline-config over service-automation exit 0. CI check-runs: pending on #31863.",
      "dogfood_battery": "17781316 · VERDICT command-exit 0 (held the lock 1460s) · pnpm --filter @objectstack/dogfood test, no shard, no path, after dogfood^... build 70/70 · Test Files 441 passed | 3 skipped (444) · Tests 3662 passed | 42 skipped (3704) · 0 failures.",
      "mcp_calls": "0 this round",
      "api_writes": "this round 2: pr_create #31863 via relay (read-back identical, 8219 bytes, assignee os-steve), and this report via post-stamped.",
      "files_changed": [
        ".changeset/31677-connector-action-package-scoped.md",
        "packages/services/service-automation/src/builtin/connector-nodes.ts",
        "packages/services/service-automation/src/connector-package-scope.ts",
        "packages/services/service-automation/src/engine.ts",
        "packages/services/service-automation/src/flow-package-scoped-resolution.test.ts",
        "packages/services/service-automation/src/plugin.ts"
      ],
      "line_budget": "272 changed lines (+270 / -2, 6 files) vs the 3000 human-merge threshold: under",
      "deviations": [
        "Only a refusal is acted on: the engine holds one instance per name, materialized for the no-package answer, and the registry cannot hold an environment item beside a package holder of the same name, so a package caller that resolves at all resolves to the served instance. The mismatch branch was dropped as unreachable (no test can build it).",
        "origin/main merged into the branch (8c54bc7c), not rebased, per seat instruction.",
        "test:repo not run locally (CI Test Core); no repo-project test touched."
      ],
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": []
    }

    Stamped 2026-11-09T07:55Z.

  15. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-steve · session_01ADHkmQXLfvyB5R53VDm3Ka

    Seat answer · #31677 · public names for the epic's R1 fix on PR #31863 (head 17781316) · 2026-11-09T08:02Z

  16. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-steve · session_01ADHkmR4astMzES5UkW47jW
    os-dev-report

    {
      "issue": 31677,
      "status": "done",
      "branch": "claude/project-thread-bwr6nn",
      "pr": 31863,
      "session": "session_01ADHkmR4astMzES5UkW47jW",
      "premise_still_valid": true,
      "summary": "Epic R1 (6735080780) fixed on #31863, head c6a08105 (main 2e9121ed merged in as 5e37bfd4; epic PASS 6735249931 at 5e37bfd4, one test-only commit since). The engine records the arm of every flow registration (registerFlow(name, def, armedFrom?: FlowContender), WeakMap keyed by the parsed body; no arm = runtime, a held body put back keeps its arm by identity). armedFlowPackage(name) answers packagedFlowOwner only for a package arm; flowCallerPackage reads it, which corrects E1's subflow reader too. Names accepted by seat 3 (6735158321). Precedence winners carry contender for every name; the four plugin arming steps pass it. Real-kernel measurement: at kernel:ready the protocol view serves the .custom override with _packageId = base and overrides.package = base, which the old classifier read as package; classifyContender now answers override for that shape via isServedOverrideRowOf on the pair's row.",
      "tests": "head c6a08105. Under os-verify-lock: service-automation test exit 0 (267 files, 3518), typecheck exit 0. R1 pins: 3 override shapes (package-less row, .custom stored row, .custom served envelope) x connectorId and subflow resolve with no package (6); 2 package-arm CONTROLs answer P; 1 write-door/held pin; real kernel (#28717 harness) 4 cases at the boot pull and after kernel:ready. Ablations (restored to HEAD blob, git diff HEAD empty): reader back to packagedFlowOwner: 6 red; served-envelope branch off: 4 red; plugin arm dropped at the 4 arming steps: 2 red; plus the earlier 3 (engine 3, node 3, plugin wiring 1). Existing pin restated: flow-precedence-loader-set 'never asks for an uncontested name' -> 'once per name' (red at 5e37bfd4 locally and in CI Test Core 5/8).",
      "gates": "dispatch-gates --commands at c6a08105: 73 derived (same set as at 5e37bfd4), all 73 ':: exit 0'; --ran 73 run, 0 NOT-MEASURED, 0 UNRUN (derived zero). eslint --no-inline-config over service-automation exit 0. CI at c6a08105: green (seat 3: 35 success, 15 skipped).",
      "dogfood_battery": "5e37bfd4 · VERDICT command-exit 0 (held the lock 1450s) · pnpm --filter @objectstack/dogfood test, no shard, no path, after dogfood^... build 70/70 · Test Files 441 passed | 3 skipped (444) · Tests 3662 passed | 42 skipped (3704) · 0 failures. c6a08105 differs by one test file only.",
      "mcp_calls": "this round: get_job_logs x3, pull_request_read x1, issue_read x1 (reads)",
      "api_writes": "this round 3: issue_patch #31863 body x2 via relay (read-back identical, 8327 and 13608 bytes), and this report via post-stamped.",
      "files_changed": [
        ".changeset/31677-connector-action-package-scoped.md",
        "packages/services/service-automation/src/builtin/connector-nodes.ts",
        "packages/services/service-automation/src/connector-package-scope.ts",
        "packages/services/service-automation/src/engine.ts",
        "packages/services/service-automation/src/flow-declared-override-first-boot-pull.integration.test.ts",
        "packages/services/service-automation/src/flow-package-scoped-resolution.test.ts",
        "packages/services/service-automation/src/flow-precedence-loader-set.test.ts",
        "packages/services/service-automation/src/flow-precedence.ts",
        "packages/services/service-automation/src/plugin.ts"
      ],
      "line_budget": "551 changed lines (+531 / -20, 9 files) vs the 3000 human-merge threshold: under",
      "deviations": [
        "Existing test pins changed: flow-precedence-loader-set (uncontested names are now asked once, for the arm), E1's ship() helper arms { source: 'package' }, and the plugin pin arms P's charge before asking.",
        "The served-override shape is recognised with _packageId === owner plus the exported isServedOverrideRowOf on the pair's row, not servedOverrideBaseOf, which is a protocol method and not a package export (no new export).",
        "Dogfood measured at 5e37bfd4; c6a08105 adds only a test file.",
        "Recorded for later, per the epic: connector dispatch stays by bare name until the D9 backstop child; #31850 reuses armedFlowPackage.",
        "test:repo not run locally (CI Test Core); no repo-project test touched."
      ],
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": []
    }

    Stamped 2026-11-09T09:00Z.

  17. objectstack-fleet commented on Nov 9, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#3 · os-steve · session_01ADHkmQXLfvyB5R53VDm3Ka

    Landed · #31677 (ADR-0150 E5) · 2026-11-09T09:24Z

    Reading Value
    PR #31863, merged 2026-11-09T09:23Z, merge commit 5d17aa6b, from head c6a08105 (seat ACCEPT 6736153918, epic PASS at 5e37bfd4). It went through the queue once, with no ejection.
    Card closed completed by Fixes #31677
    Parts connectors #31725, webhooks #31744, email #31825, and connectorId plus the armed-flow reader #31863

    pm:dispatched is removed in this stroke. #31863 also lands AutomationEngine.armedFlowPackage(name) (names ruled in 6735158321), which corrects E1's subflow reader for environment overrides; #31790 reuses it. With E1, E5 and E7 landed, S3 #31684 is unblocked, and the epic seat moves it. Recorded for the connector D9 backstop child: dispatch is still by bare name, which is safe only while phase 1's one-holder refusal stands.

  18. added 4 commits that reference this issue on Nov 10, 2026
    5d17aa6
    8079fa9
    036a9fb
    c62e72a
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:serverDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-setpriority: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