Skip to content

Nest decomposed capabilities under their feature#25

Merged
Extentsoftware merged 1 commit intomainfrom
fix/decompose-nests-capabilities-under-feature
May 10, 2026
Merged

Nest decomposed capabilities under their feature#25
Extentsoftware merged 1 commit intomainfrom
fix/decompose-nests-capabilities-under-feature

Conversation

@Extentsoftware
Copy link
Copy Markdown
Owner

Summary

Kickoff decompose was creating every accepted child under the kickoff parentNodeId, so a feature and the capabilities that should live under it ended up as siblings on the Operating Picture. The methodology hierarchy is initiative ▸ feature ▸ capability ▸ slice — capabilities are never peers of features.

What changed

  • ProposedChild (wire) and ProposedChildAcceptance (acceptance record) gain a parentSlug / ParentSlug field.
  • KickoffService.AcceptDecompositionAsync topologically orders accepted children and builds a slug→NodeId map as it creates them, so a capability whose ParentSlug matches a sibling-being-created-this-batch is created under that node. Unresolved parent slugs fall through to the kickoff parent (idempotent + safe).
  • The two prompt fragments that drive decompose (po-architect-pair, feature-decomposition) now describe parentSlug and require capabilities to point at the feature they implement.
  • PoGate.razor passes ParentSlug through to acceptance and shows it in a read-only Under column so the PO can see the nesting the agent proposed.
  • docs/design/loom-design.md and docs/team-walkthrough.md get explicit definitions of each node type plus a note that capabilities are never peers of features.

Test plan

  • dotnet build clean with TreatWarningsAsErrors=true.
  • Existing kickoff E2E test (EndToEndKickoffTests) still passes — it bypasses AcceptDecompositionAsync and uses FeatureService directly, so it's unaffected by the wire-shape change.
  • Manual: run a kickoff in the web app, confirm the Operating Picture renders capabilities indented under their feature using the existing depth CSS.

Follow-ups

  • Add a focused unit/integration test for KickoffService.AcceptDecompositionAsync that exercises the new topo-order + parent-slug resolution. Skipped here because the existing test harness in EndToEndKickoffTests doesn't currently route through this method, and standing up a dedicated harness is out of scope for this PR.

🤖 Generated with Claude Code

Kickoff decompose was emitting features and capabilities as a flat list
of children under the kickoff parent, so the Operating Picture rendered
them as siblings even though the methodology says capabilities live
under a feature.

- DecompositionProposal / ProposedChild gain a parentSlug field; the
  agent emits it to express nesting in a single decomposition response.
- ProposedChildAcceptance gains ParentSlug (typed Slug) and KickoffService
  topologically orders accepted children, building a slug→NodeId map as
  it goes so each child is created under the right parent. Unresolved
  parent slugs fall back to the kickoff parentNodeId.
- po-architect-pair and feature-decomposition prompt fragments now
  document parentSlug and call out the initiative ▸ feature ▸ capability
  ▸ slice hierarchy explicitly.
- PoGate.razor passes ParentSlug through and surfaces it in the proposal
  table as a read-only "Under" column so the PO can see the nesting the
  agent proposed.
- loom-design.md and team-walkthrough.md grow definitions for each of
  the four node types and an explicit note that capabilities are never
  peers of features.
@Extentsoftware Extentsoftware merged commit 049b748 into main May 10, 2026
1 check passed
@Extentsoftware Extentsoftware mentioned this pull request May 10, 2026
5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant