What Studio needs
architecture/build-plan.json, behind a --json flag on project-bin/build-plan-status.sh, with a schema derived entirely from build-plan.md. A full proposal with a worked example exists and can be attached.
Why
Studio currently embeds the toolkit's generated build-plan.html in the Plan room. That is the general fault: Studio embeds the toolkit's HTML in places where it should build a view from the toolkit's data. The embedded page cannot be made into a phase Gantt, cannot expand a phase in place, and cannot say which facts are missing.
There is a second, sharper reason. build-plan-status.sh computes progress only from mdlsource/<phase>/done-*.mdl folders. One real project has 7 phases with full tables and claims: blocks in build-plan.md, and a flat mdlsource/, so the generated HTML is honestly empty while the plan is not. The script is behaving correctly; its expected input shape is simply absent. A JSON view built from the markdown would show the plan that exists.
Blast radius
Rating: safe additive, with conditions.
- Nothing in the toolkit parses this script's stdout.
gate-check.sh Stage 4 reads only the presence of build-plan.md. build-plan.html is a Surface row, and tests/wave2/test-surface-column.sh pins that a surface can never change a verdict.
- Studio needs no change to see the file:
snapshot.ts already maps architecture/build-plan* to the Plan room.
Conditions:
- The file is written only under
--json. Views A and B, stdout and --html untouched, exit stays 0.
- Use a real JSON encoder,
jq or the resolve_py pattern, not shell string concatenation. At least one real project has a Produces cell containing a double quote, which would emit invalid JSON, and Studio's parsers return null on invalid JSON, so the room would show nothing while the file looks present.
- Do not make the parser strict enough to exit non-zero on an unexpected table shape. The script's contract is "exit: always 0".
- Add a
build-plan-json row to bin/lib/artifact-manifest.tsv as a surface.
Rollout note: project copies of project-bin/* are never blind overwritten, so existing projects get the flag only via sync-project.sh --upgrade-bin build-plan-status.sh. Studio can run the toolkit clone's copy in the meantime, the way gate-check.sh already runs report-disposition-check.sh from the toolkit.
Decision needed
None. Ready to implement.
What Studio needs
architecture/build-plan.json, behind a--jsonflag onproject-bin/build-plan-status.sh, with a schema derived entirely frombuild-plan.md. A full proposal with a worked example exists and can be attached.Why
Studio currently embeds the toolkit's generated
build-plan.htmlin the Plan room. That is the general fault: Studio embeds the toolkit's HTML in places where it should build a view from the toolkit's data. The embedded page cannot be made into a phase Gantt, cannot expand a phase in place, and cannot say which facts are missing.There is a second, sharper reason.
build-plan-status.shcomputes progress only frommdlsource/<phase>/done-*.mdlfolders. One real project has 7 phases with full tables andclaims:blocks inbuild-plan.md, and a flatmdlsource/, so the generated HTML is honestly empty while the plan is not. The script is behaving correctly; its expected input shape is simply absent. A JSON view built from the markdown would show the plan that exists.Blast radius
Rating: safe additive, with conditions.
gate-check.shStage 4 reads only the presence ofbuild-plan.md.build-plan.htmlis a Surface row, andtests/wave2/test-surface-column.shpins that a surface can never change a verdict.snapshot.tsalready mapsarchitecture/build-plan*to the Plan room.Conditions:
--json. Views A and B, stdout and--htmluntouched, exit stays 0.jqor theresolve_pypattern, not shell string concatenation. At least one real project has aProducescell containing a double quote, which would emit invalid JSON, and Studio's parsers return null on invalid JSON, so the room would show nothing while the file looks present.build-plan-jsonrow tobin/lib/artifact-manifest.tsvas a surface.Rollout note: project copies of
project-bin/*are never blind overwritten, so existing projects get the flag only viasync-project.sh --upgrade-bin build-plan-status.sh. Studio can run the toolkit clone's copy in the meantime, the waygate-check.shalready runsreport-disposition-check.shfrom the toolkit.Decision needed
None. Ready to implement.