Multi-feature kickoff sessions#26
Merged
Extentsoftware merged 2 commits intomainfrom May 10, 2026
Merged
Conversation
added 2 commits
May 10, 2026 15:00
A team session sometimes covers more than one feature. The kickoff
flow now branches between a single-feature workflow (Feature root,
existing behaviour) and a multi-feature workflow (Initiative root,
decompose returns a tree of features each with their capabilities).
Pipeline on the Kickoff page:
1. PO pastes the transcript, hits "Analyse".
2. IScopeClassifier runs a one-shot agent call (Foundry) and returns
{ mode, confidence, reason, suggestedTitles }. Failures fall back
to single-feature with confidence 0.
3. The page surfaces the classification with Single / Multi buttons;
the recommended option is highlighted.
4. PO clicks one — the page creates a Feature or Initiative root and
starts kickoff/v2 or kickoff-multi/v1 accordingly.
Multi-feature workflow (kickoff-multi/v1) shape:
normalize (InProc) → initiative-discovery (Foundry, HumanPo,
DiscoveryObject) → multi-decompose (Foundry, HumanPo,
DecompositionProposal — tree).
Three new prompt fragments back the multi-feature steps:
- initiative-framing — discovery framed at initiative level.
- transcript-multi-discovery-extraction — schema rules for the
multi-feature discovery.
- multi-feature-decomposition — mandates the two-level tree using
parentSlug per the methodology hierarchy.
KickoffService.AcceptDecompositionAsync is reused unchanged — its
parentSlug topo-resolution from the prior PR already handles the
tree shape. Two focused tests cover the resolution explicitly so
the multi-feature wiring is verified.
Docs: kickoff section in loom-design.md describes both flows; team
walkthrough opens the kickoff scene with the analyse-then-confirm UX.
The Kickoff page was rendering "Unknown gate." for the multi-feature
workflow because PoGate.razor matched step keys against the
single-feature constants ("discovery"/"decompose") and KickoffService
hardcoded the same constant when resolving the gate. The multi
workflow uses "initiative-discovery"/"multi-decompose".
Changes:
- PoGate.razor recognises either set via IsDiscoveryStep /
IsDecomposeStep helpers and passes the actual _step.Key when calling
ResolveGateAsync (was hardcoded to KickoffWorkflowFactory.DiscoveryStepKey).
- KickoffService.AcceptDecompositionAsync now takes gateStepKey and
forwards it; callers (PoGate, the focused tests) pass _step.Key so
the right gate resolves.
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
A team session sometimes produces a transcript that covers more than one feature. The kickoff flow now branches between two workflows based on a transcript-level scope classifier (auto-detect, PO confirms):
kickoff/v2(existing) — single-feature kickoff. Root is aFeature. Decompose proposes capabilities under it.kickoff-multi/v1(new) — multi-feature initiative. Root is anInitiative. Decompose returns a two-level tree: features at the top, capabilities nested under each viaparentSlug.The Kickoff page now reads:
What's in
IScopeClassifier+ScopeClassifier— one-shot Foundry agent call, bypasses the workflow engine because the result is advisory and short-lived. Failures fall back to single-feature with confidence 0 so the PO still sees both options.KickoffMultiWorkflowFactory— mirrorsKickoffWorkflowFactory's shape; selectors point at the new prompt fragments.SeedFragments.cs:initiative-framing,transcript-multi-discovery-extraction,multi-feature-decomposition. The decomposition fragment mandates the two-level tree shape.Kickoff.razor— replaces the single-step Begin kickoff button with the analyse-then-confirm flow.IScopeClassifierand seedskickoff-multi/v1.KickoffServiceTestscoverparentSlugtopo-resolution (nesting capabilities under their feature) and orphan-fallback behaviour.loom-design.mdadds a "Single-feature vs multi-feature kickoff" subsection;team-walkthrough.mdupdates the kickoff scene to show the analyse-then-confirm UX.What's reused (unchanged)
KickoffService.AcceptDecompositionAsync—parentSlugtopo-resolution from PR Nest decomposed capabilities under their feature #25 handles the tree shape directly.PoGate.razor— the proposal table already shows theUndercolumn from PR Nest decomposed capabilities under their feature #25.app.cssdepth selectors from PR Indent nested tree rows on Operating Picture #19 — render the resultingInitiative ▸ Feature ▸ Capabilitytree on the Operating Picture.Test plan
dotnet build Loom.sln -p:TreatWarningsAsErrors=true— clean.dotnet test --filter Kickoff—KickoffServiceTests(2 tests, parent-slug nesting + orphan fallback) andEndToEndKickoffTests(1 test, single-feature flow) all pass.Initiative ▸ Feature ▸ Capabilityindented.🤖 Generated with Claude Code