Spine: fan-out rows indent under a parent that isn't drawn, and the review loop rows have no actor prefix #25
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Two things in the spine read wrong since #20 made every step name say who acts.
1. Fan-out rows are indented under a parent that is not there
openspec.propose.spec[run-spine]andopenspec.propose.spec[agent-view]are shifted right. They look like children ofopenspec.propose.proposal, but they are not. The space reads as a layout bug.Why it happens.
ui/src/components/Spine.tsx:417indents any row that has afanout_keyby one level (const indent = step.fanout_key ? 1 : 0). A fan-out node has no row of its own:openspec.propose.specis replaced by its children. So the indent points at a parent the spine never draws. The same applies toopenspec.review[spec|scope|test|risk]when the review loop is open, and toopenspec.apply[<group>].The indent is deliberate.
ui/e2e/spine-alignment.spec.tspins it with "but the label still indents, so depth is still visible". Change that test with the fix.Options
[key]suffix already says the rows are siblings of one step.openspec.propose.spec ×2with its own status and done count. Put its children under it with a visible connector (a tree guide such as├/└, or a left rule). It could fold the way the review loop does.Related, on the same rows: the node name and the key truncate separately, so a narrow spine shows
openspec.propose.sp… [agent-vie…. Under a group row, a child could show just its key ([run-spine],[agent-view]), which would also fix the truncation.2. The review loop's rows have no prefix
Every spine row starts with who acts (
git.,script.,openspec.,human.) except the review loop's two rows, which read justreviewandrevise(Spine.tsx:755renders the side's name). Each side folds steps by different actors:reviewfoldsopenspec.review[lens]andscript.review-digest.revisefoldsopenspec.reviseandgit.commit.revision.So no single existing prefix fits either row.
Proposal: an
agent.prefix for steps that are a prompt and an opencode session doing the work, as opposed to a script, git, the OpenSpec CLI, or an agent writing OpenSpec's own artifacts. Today every agent step isopenspec.*:openspec.exploreexplore.osf/explore.mdexistsopenspec.propose.proposalopenspec-artifactopenspec-artifact:proposalproposal.mdopenspec.propose.spec[cap]openspec-artifactopenspec-artifact:specs:{cap}openspec.propose.designopenspec-artifactopenspec-artifact:designdesign.mdopenspec.propose.tasksopenspec-artifactopenspec-artifact:taskstasks.mdopenspec.review[lens](.r2,.r3)review-lens.osf/review/{lens}.jsonmatches its schemaopenspec.revise(.r2)propose-revise.osf/review/revision-N.mdexistsopenspec.apply[group]apply-grouptasks-complete:{group}tasks.mdopenspec.reconcile-taskstasks-reconciletasks-completetasks.mdopenspec.test.unittest-suite.osf/test/unit.jsonexistsopenspec.summarizesummary.osf/summary.mdexistsCandidates for
agent.*are the rows that do not touch the change:agent.review[lens],agent.test.unit,agent.summarize, and possiblyagent.explore. Explore is a judgement call, because #20 asked for OpenSpec's explore, propose and apply phases to stand out as OpenSpec steps.The loop rows could then carry the name of the agent step on each side, e.g.
agent.reviewandopenspec.revise.A rename has the same cost #20 had:
.osf/pipeline.yamlkeeps the old names;Changing only the displayed label would avoid that, but it would split the name on screen from the id in the pipeline file, logs and API. #20 chose one name everywhere.
Done when
spine-alignment.spec.tschecks whatever replaces the indent.src/osf/pipeline/nodes.py, this repository's.osf/pipeline.yaml, the UI's phase, purpose and loop tables (keeping the old ids for recorded runs),docs/guide.md, the README's naming row, the fake osfd and the tests.Shipped with #52 as the OpenSpec change
agent-step-names, archived in #84. Live on production sincebb4d708.1. Fan-out rows: the indent is gone, so
openspec.propose.spec[<cap>], the review lenses andopenspec.apply[<group>]start on the same column as every other row; the[key]says which siblings belong together. On a narrow spine the step name gives way first, down to two characters and an ellipsis, and the key is kept whole:ope… [discovery-feed]rather thanopenspec.propose.sp… [agent-vie…. Only a key too long to fit beside that stub is shortened.spine-alignment.spec.tsnow checks that labels share one column and that no key that fits is cut.2. Review loop rows: they read
agent.reviewandopenspec.revise, named for who acts in each, for new runs and for runs recorded with the old ids.PRs: #82 (the change), #83 (a key-width fix found on production: a 75% cap cut
[discovery-feed]at 1024px), #84 (archive).