Repository navigation
v1.15.0
Highlight: the schema workflow diagram now says which steps come after implementation — and its lines can finally be seen. OpenSpec has no way to declare "this artifact is produced once the change is implemented": an artifact's requires may name only other artifacts, so authors point such a step at the last planning artifact and state the real ordering in prose. spek rendered the declared graph faithfully, which put those steps on apply's own level, reading as its peers — in superpowers-bridge that placed verify beside apply, inviting exactly the mistake the schema's own runtime precheck exists to block.
- A step that follows implementation is drawn after
apply, on a dashed edge captioned as spek's inference. The ordering is derived from therequiresgraph — an artifact outside everythingapplyneeds, whose own dependencies cover all of them — and the edge is never drawn like a declared one, becauseopenspec statusdoes not block on it. Of the 88 OpenSpec schemas discoverable on GitHub, 18 declare such a step; the rule is a no-op on every built-in schema, and about 82% precise across everything it flags, which is why it announces itself rather than asserting an ordering. Thanks to @nthansen (Norman Hansen) (#48) applyis a real node in the flow now, so the steps after it hang off it andarchivefollows the tail rather than sitting beside it. A schema that declares an artifact literally namedapply—superspecdoes, as an implementation receipt — no longer collapses into the apply phase: both are separate, selectable steps drawn in the schema's own vocabulary- A derived edge is explained once, and never erases a dependency the CLI enforces. Where a declared path already implies the ordering, the derived edge is dropped instead of repeating the explanation on every step below it; where the reverse held, an inference used to imply a real
requiresaway, leaving a node whose only incoming line said "openspec does not block on this" - An edge no longer detours through the node it exists to go around. Two edges converging on one step were ordered by the other end's column alone, so a tie put the long way round on the inside slot — and with the curve forced there it swung wide enough to be drawn straight through
apply - Every line in the diagram is visible in both themes. Edges, arrowheads, the archive step's dashed outline and both legend swatches were drawn in the panel-hairline colour — 1.22:1 dark and 1.13:1 light, at full strength, so no opacity of it could have helped. In this diagram a line is not decoration: an arrow is the only thing stating that
specsdepends onproposal, and a dash is the only non-colour cue separating declared from derived from not declared by this schema. They now measure 5.52:1 and 5.17:1 - A selected step's
generateslabel is readable. Over the accent wash a selected step draws, it measured 4.45:1 in the light theme — under the floor, in the ordinary case of selecting a step that produces a file - A graph node's label stays readable whichever node is drawn next to it. The halo behind each label was painted inside its own node's group, so it survived a collision with the nodes drawn before it and was painted over by the ones drawn after — the protection held in one direction only, at no cost to any colour, which is why nothing measurable saw it
- An OpenSpec installation that cannot answer the artifact-order query stops costing a process start per change. A refusal about one change is still never held against the schema every other change shares, but it is now remembered against the change it was about — so an
openspectoo old forstatus --change --jsonis asked once per change instead of on every open and every watcher-driven refresh - IntelliJ treats an unreadable CLI response as a failure, not as an answer. An exit-0 run whose output could not be parsed was cached as "this schema has no order" for the full cache window
- Internal:
@spekjs/core1.10.0 exposes the post-implementation derivation and the levelling behind it;@spekjs/ui1.3.1 corrects the colour-contract documentation that shipped with 1.3.0