diff --git a/docs/adr/0069-single-role-service-type.md b/docs/adr/0069-single-role-service-type.md new file mode 100644 index 00000000..a8012dc9 --- /dev/null +++ b/docs/adr/0069-single-role-service-type.md @@ -0,0 +1,55 @@ +# ADR-0069: Single-Role `service_type`; Compose Multi-Concern at Workflow + +- Status: Accepted +- Date: 2026-09-11 +- Governing specs: `014` / `208-service-type-taxonomy` (unchanged); `098-capability-event-host-abi`; `131-stateful-persistence-host-abi` +- Related issue: #1291 +- Related: `docs/decision-log.md` Decision 68 (deferred multi-role); Decision 81 + +## Context + +`service_type` is a single enum (`Stateless` | `Subscribable` | `Stateful`). +Spec `098` FR-003 gates `emit_event` to `Subscribable`. Spec `131` gates +`state_*` to `Stateful`. A capability therefore cannot both persist state and +participate in events. Session-flavored roster items (for example +`core.followup-session`, `identity.challenge-session`, `support.agent-session`) +plausibly want both concerns. Decision 68 deferred the multi-role taxonomy +question rather than inventing a combined type inside the Stateful ABI slice. +Spec `131` Compatibility already records multi-role as out of scope. + +## Decision + +Keep `service_type` as a single enum. Do **not** add a combined variant (for +example `StatefulSubscribable`) and do **not** introduce orthogonal contract +flags such as `uses_storage` / `participates_in_events`. + +When a product need spans persistence and events, author **two** capabilities +(one `Stateful`, one `Subscribable`) and compose them at the workflow / +application layer. Call-time gates in `098` and `131` remain unchanged. +Placement rules in `014`/`208` continue to key off the single `service_type` +value. + +If a concrete published capability later proves that workflow composition is +worse than a combined type, revisit with a **narrow** new enum variant — not +open-ended orthogonal flags. + +## Consequences + +- `#1291` is closed as a governing ruling, not an implementation ticket. +- No amendment to Approved Specs `014`/`208`, `098`, or `131` is required for + this negative ruling; Spec `131` already excludes multi-role. +- Session-style products must split concerns across capabilities and workflows. +- Downstream Deferred Stateful ABI tickets (`state_clear`, quotas, CAS) remain + independent of this taxonomy decision. + +## Alternatives considered + +- **New `service_type` variant** (e.g. `StatefulSubscribable`): rejected for + now — every gate and placement rule would need to learn the new value, and + no published multi-role workload is blocked today. +- **Orthogonal flags** beside or instead of the enum: rejected — Decision 68 + already noted that `208` placement is written against `service_type`; flags + force a foundational rewrite without demand. +- **Address multi-role inside Spec `131`**: already rejected in Decision 68; + this ADR closes the deferred follow-up with an explicit compose-at-workflow + ruling. diff --git a/docs/decision-log.md b/docs/decision-log.md index 4d72b451..5e05c748 100644 --- a/docs/decision-log.md +++ b/docs/decision-log.md @@ -3665,3 +3665,96 @@ Customer DEVs and agents get one story: discover/plan at authoring time (with a ### Approval Approved by Enrico in this owner-directed `/brainstorm` session (2026-09-10). + +## Decision 81: Single-Role `service_type` — Compose Multi-Concern at Workflow + +- **Date**: 2026-09-11 +- **Status**: Accepted +- **Related issue**: `#1291` +- **Governing artifacts**: ADR-0069; Specs `014`/`208`, `098`, `131` (unchanged) +- **Origin**: `/brainstorm` over the 12 open Project 1 issues (2026-09-11) + +### Context + +Decision 68 deferred Stateful + events multi-role. Spec `131` already excludes +it. Session-flavored roster items plausibly want both persistence and events, +but no published capability is blocked today. + +### Decision + +1. Keep `service_type` as a single enum. +2. Do not add a combined variant or orthogonal storage/events flags. +3. When both concerns are needed, author separate `Stateful` and `Subscribable` + capabilities and compose them at the workflow / application layer. +4. Leave `098` / `131` call-time gates and `014`/`208` placement rules unchanged. +5. Revisit only with a narrow enum variant if a concrete published capability + proves composition is worse than a combined type. + +### Alternatives considered + +- New `service_type` variant — deferred without demand; gate/placement churn. +- Orthogonal flags — rejected; placement is written against `service_type`. +- Thin amendment to Spec `014`/`208` or a new dedicated multi-role spec — + rejected for a pure negative ruling; ADR-0069 + this log entry suffice. + +### Outcome + +`#1291` closes as a governing ruling (ADR-0069 Accepted). No new positive ABI +or taxonomy surface. + +### Approval + +Approved by Enrico in this owner-directed `/brainstorm` session (2026-09-11). + +## Decision 82: Open-Issue Ready Triage — Executable Ready Only; Demand-Gate Deferred ABI + +- **Date**: 2026-09-11 +- **Status**: Accepted +- **Related issues**: `#1341`, `#1242`, `#1291`, `#1287`, `#1288`, `#1290`, + `#1294`, `#1295`, `#1150`, `#1152`, `#1168`, `#884` +- **Origin**: `/brainstorm` over the 12 open Project 1 issues (2026-09-11) + +### Context + +Twelve issues were open with zero Ready tickets. Open ≠ Ready: most were +Project Status `future`, one (`#1341`) carried stale `needs-spec` despite +Approved Spec `135`, and umbrellas / upstream trackers are not executable +agent work. + +### Decision + +1. **Ready means executable now.** Promote only tickets with approved + governing artifacts and no external blocker. +2. **Promote to Ready now:** + - `#1341` — Spec `135` + ADR-0068 + Decision 79 Approved; remove + `needs-spec`, add `spec-complete`, add to Project 1, Status Ready. + - `#1242` — Spec `520` / `no-spec-needed`; Status Ready. +3. **Close as ruling (not implement):** `#1291` after ADR-0069 + Decision 81. +4. **Demand-gate (remain `future`, no new ABI spec until a named consumer is + blocked):** + - `#1287` `state_clear`, `#1288` quotas, `#1290` CAS (Decision 68 deferrals) + - `#1294` IndexedDB KeyProvider, `#1295` IndexedDB maintenance (Spec `528` + fail-closed follow-ons) +5. **Stay out of Ready:** + - `#1150`, `#1152`, `#1168` — umbrellas / proof outcomes until split into + executable children. + - `#884` — external WasmKit upstream watch. + +### Alternatives considered + +- Promote already-governed first, then design everything else into Ready — + rejected; invents ABI before demand. +- Design every missing artifact before any Ready move — rejected; idles + `#1341`/`#1242` for no technical reason. +- Spec+ADR now for Deferred Stateful/IndexedDB while keeping `future` — + rejected; design cost without a blocked consumer. + +### Outcome + +Ready board gets real implement work (`#1341`, `#1242`). Deferred ABI and +umbrella tickets stay honest as `future` / non-Ready. Single-role taxonomy +closes via Decision 81 / ADR-0069. + +### Approval + +Approved by Enrico in this owner-directed `/brainstorm` session (2026-09-11).