Task ID or area
GH-C37 (design / docs) — interaction pattern catalog
Technical direction
Core control-plane hardening
Intent
I want to claim an existing task
Goal and acceptance gap
Goal/source: GH-C37 asks the catalog to carry one new public-safe good/bad case. The steward team-plan path (#4569) now keeps a lane the host cannot staff as a typed gap and still offers the admitted plan as a card, but no catalog entry names that boundary.
Current gap: IP-018 owns plan-to-todo writeback and IP-024 owns repair deltas, but neither owns what happens when a confirmed plan contains a lane this host cannot start. Consumers therefore have no named pattern for "the plan is admitted, one lane is not staffable".
Accepted outcome (before → after): before, an unstaffable lane is either silently dropped or faked into a Todo so the plan looks fully staffed; after, the plan remains admitted, the unstaffable lane is a typed gap naming the missing registration or grant, and confirming the plan creates exactly the lanes that can run.
Proposed scope
In scope / owner: one new catalog entry, IP-034 "Unstaffable Team Lane Is A Typed Gap", in the Planning Governance family, with Trigger, Expected behavior, Visual Model, Bad smell, and Validation sections; the family table row, the family-to-canary matrix cell, and one durable assertion in examples/interaction-pattern-catalog-smoke.py.
Existing related work / dependencies: #4569 (unstaffable lane is a typed gap, admitted plan offered as a card), loopx/chat_manager.py manager guidance text, loopx/control_plane/work_items/governed_transition_proposal.py, tests/test_steward_team_plan_apply.py, tests/test_manager_team_plan_guidance.py, IP-018, IP-024.
Out of scope: changing any runtime behavior, adding a second team-plan store, touching the steward use-case docs, or altering existing IP entries.
If staged: single-slice docs change; no remaining gap.
Intended base branch
main
Relevant files or commands
docs/concepts/interaction-pattern-catalog.md
examples/interaction-pattern-catalog-smoke.py
python3 examples/interaction-pattern-catalog-smoke.py
python3 -m loopx.entrypoint check --scan-path docs/concepts/interaction-pattern-catalog.md
Validation plan
Accepted result and independent oracle: the catalog gains IP-034 with all five required sections, the family matrix lists IP-034 exactly once, and the smoke pins the new entry's core sentence so a later edit cannot drop it silently.
Actual entrypoint / safe command: python3 examples/interaction-pattern-catalog-smoke.py and python3 -m loopx.entrypoint check --scan-path docs/concepts/interaction-pattern-catalog.md.
Negative or recovery case: the smoke fails if the new detail heading has no family table row, if an id appears under two families, or if the new entry's key sentence is removed; loopx check fails on private-material or scan-boundary regressions in the touched doc.
Frontend / Lark / CLI impact or verified N/A: N.A. — docs-only entry with no UI, Lark, or CLI surface change.
Public/private boundary
Task ID or area
GH-C37 (design / docs) — interaction pattern catalog
Technical direction
Core control-plane hardening
Intent
I want to claim an existing task
Goal and acceptance gap
Goal/source: GH-C37 asks the catalog to carry one new public-safe good/bad case. The steward team-plan path (#4569) now keeps a lane the host cannot staff as a typed gap and still offers the admitted plan as a card, but no catalog entry names that boundary.
Current gap: IP-018 owns plan-to-todo writeback and IP-024 owns repair deltas, but neither owns what happens when a confirmed plan contains a lane this host cannot start. Consumers therefore have no named pattern for "the plan is admitted, one lane is not staffable".
Accepted outcome (before → after): before, an unstaffable lane is either silently dropped or faked into a Todo so the plan looks fully staffed; after, the plan remains admitted, the unstaffable lane is a typed gap naming the missing registration or grant, and confirming the plan creates exactly the lanes that can run.
Proposed scope
In scope / owner: one new catalog entry, IP-034 "Unstaffable Team Lane Is A Typed Gap", in the Planning Governance family, with Trigger, Expected behavior, Visual Model, Bad smell, and Validation sections; the family table row, the family-to-canary matrix cell, and one durable assertion in
examples/interaction-pattern-catalog-smoke.py.Existing related work / dependencies: #4569 (unstaffable lane is a typed gap, admitted plan offered as a card),
loopx/chat_manager.pymanager guidance text,loopx/control_plane/work_items/governed_transition_proposal.py,tests/test_steward_team_plan_apply.py,tests/test_manager_team_plan_guidance.py, IP-018, IP-024.Out of scope: changing any runtime behavior, adding a second team-plan store, touching the steward use-case docs, or altering existing IP entries.
If staged: single-slice docs change; no remaining gap.
Intended base branch
main
Relevant files or commands
docs/concepts/interaction-pattern-catalog.mdexamples/interaction-pattern-catalog-smoke.pypython3 examples/interaction-pattern-catalog-smoke.pypython3 -m loopx.entrypoint check --scan-path docs/concepts/interaction-pattern-catalog.mdValidation plan
Accepted result and independent oracle: the catalog gains IP-034 with all five required sections, the family matrix lists IP-034 exactly once, and the smoke pins the new entry's core sentence so a later edit cannot drop it silently.
Actual entrypoint / safe command:
python3 examples/interaction-pattern-catalog-smoke.pyandpython3 -m loopx.entrypoint check --scan-path docs/concepts/interaction-pattern-catalog.md.Negative or recovery case: the smoke fails if the new detail heading has no family table row, if an id appears under two families, or if the new entry's key sentence is removed;
loopx checkfails on private-material or scan-boundary regressions in the touched doc.Frontend / Lark / CLI impact or verified N/A: N.A. — docs-only entry with no UI, Lark, or CLI surface change.
Public/private boundary