Skip to content

spec rendering does not aggregate scope vBRIEFs from lifecycle folders (v0.20 model) #435

@MScottAdams

Description

@MScottAdams

Summary

In the v0.20 vBRIEF-centric model, the project "spec" is defined as the union of vbrief/specification.vbrief.json (intent/architecture narratives) plus the scope vBRIEFs in lifecycle folders (vbrief/proposed/, pending/, active/, completed/, cancelled/). But task spec:render (scripts/spec_render.py) reads only the single file passed as argv[1] -- it never walks the lifecycle folders. The rendered SPECIFICATION.md is therefore incomplete for any project using the post-cutover model: it shows project intent but not the actual scopes / work units that constitute the implementation plan.

The data model from the v0.20 cutover is in place (lifecycle folders, planRef, references[], PROJECT-DEFINITION.vbrief.json items registry). The rendering layer is not. This is a half-shipped piece of #338 / Phase 2.

Reproduction

  1. Greenfield or migrated project on v0.20+. vbrief/specification.vbrief.json exists with status approved. One or more scope vBRIEFs in vbrief/pending/ and/or vbrief/active/.
  2. Run task spec:render.
  3. Observe: SPECIFICATION.md contains only the contents of specification.vbrief.json. None of the scope vBRIEFs in the lifecycle folders are mentioned. A reader of SPECIFICATION.md cannot see what work has been scoped, accepted, or is in progress.

task roadmap:render walks pending/ and produces ROADMAP.md correctly. task project:render walks lifecycle folders to refresh PROJECT-DEFINITION items registry. No renderer in deft today aggregates lifecycle folders into SPECIFICATION.md.

Why this is its own issue (vs. #434)

#434 is a renderer bug specific to speckit narrative shape -- spec_render drops 9 of 10 narratives. That fix is local to one script and one model.

This issue is broader and applies to every vBRIEF-centric project, not just speckit. Even a perfectly-shaped Model-1-style spec with full Overview + items would still produce an incomplete SPECIFICATION.md once scopes are split out into lifecycle folders, because nothing pulls them back in.

Fixing #434 alone leaves this gap. Fixing this alone leaves #434.

Proposed fix (sketch)

Two reasonable paths -- pick one, or do both:

Option 1: Aggregator inside task spec:render

Extend scripts/spec_render.py to optionally walk vbrief/pending/ and vbrief/active/ (and optionally completed/ with status pins) and render each scope vBRIEF as a section under "Implementation Plan / Scopes" in the output. Sketch:

# {project title}

## {narrative keys, in order}
...

## Implementation Plan

### Pending
- [scope-slug] -- title -- summary narrative
  - items / acceptance criteria

### Active
- [scope-slug] -- title -- ...

### Completed (last N)
- [scope-slug] -- title (completed YYYY-MM-DD)

Trigger via a flag (e.g. --include-scopes default on for v0.20+) so legacy Model-1 projects still get the existing behavior.

Option 2: Hub document, multiple thin renderers

Keep task spec:render thin (just specification.vbrief.json). Keep task roadmap:render for pending/. Add task plan:render (per-scope or aggregated). Add a top-level "spec hub" markdown that links to all of them with status counts. Multiple small files, not one fat one.

Either way: the v0.20 cutover is incomplete without one of these. Today users on v0.20 see thinner SPECIFICATION.md exports than they did pre-cutover for the same amount of project content.

Severity

Architectural gap. Affects all v0.20+ projects, not just speckit. The data exists and is correct; only the rendering layer is missing. Fix is medium-sized but well-scoped.

Related

Discovered

During RC2 walkthrough; investigated why SPECIFICATION.md was empty after speckit and traced the issue back to the broader pattern that no renderer aggregates lifecycle folders.

Metadata

Metadata

Assignees

No one assigned

    Labels

    blocks-mergeMust be fixed before integration branch merges to master.fixed-pending-mergeFix is committed and shipped in an RC; auto-closes when merged to master

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions