Nest decomposed capabilities under their feature#25
Merged
Extentsoftware merged 1 commit intomainfrom May 10, 2026
Merged
Conversation
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.
5 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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) andProposedChildAcceptance(acceptance record) gain aparentSlug/ParentSlugfield.KickoffService.AcceptDecompositionAsynctopologically orders accepted children and builds a slug→NodeId map as it creates them, so a capability whoseParentSlugmatches a sibling-being-created-this-batch is created under that node. Unresolved parent slugs fall through to the kickoff parent (idempotent + safe).po-architect-pair,feature-decomposition) now describeparentSlugand require capabilities to point at the feature they implement.PoGate.razorpassesParentSlugthrough 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.mdanddocs/team-walkthrough.mdget explicit definitions of each node type plus a note that capabilities are never peers of features.Test plan
dotnet buildclean withTreatWarningsAsErrors=true.EndToEndKickoffTests) still passes — it bypassesAcceptDecompositionAsyncand usesFeatureServicedirectly, so it's unaffected by the wire-shape change.Follow-ups
KickoffService.AcceptDecompositionAsyncthat exercises the new topo-order + parent-slug resolution. Skipped here because the existing test harness inEndToEndKickoffTestsdoesn't currently route through this method, and standing up a dedicated harness is out of scope for this PR.🤖 Generated with Claude Code