The catalog

The Platform ships 8 Spine-driven apps across 25 rungs (14 declared gaps). This table is folded live from recipe-ladder-manifest-v1.json — it is never hand-maintained.

AppRungsGapsCompletenessAccess
graphics-game22CONSTRUCTIBLE-WITH-2-NAMED-GAPSfree
graphing-calculator22constructible-with-gaps: 2 pipe primitives fully witnessed (seq-source, svg-sink); 2 declared pure-kernel gaps (expr-parse, expr-eval) — the expression engine is honest derive-first work. One interactive sub-lane (pan-zoom / input-handling).free
mandelbrot22constructible-with-gaps: 2 pipe primitives fully witnessed (grid-source, ppm-raster); 2 declared pure-kernel gaps (color-map, escape-iter) — the fractal compute core is honest derive-first work. One interactive sub-lane (pan-zoom / input-handling). Judgment call resolved: mb.pixel-grid witnessed by grid-source (the shared grid substrate, same as spreadsheet).free
photoshop-killer72CONSTRUCTIBLE-WITH-2-NAMED-GAPSfree
spreadsheet23constructible-with-gaps: 2 pipe primitives fully witnessed (grid-source, grid-sink); 3 declared pure-kernel gaps (formula-parse, dep-graph, recalc) — the spreadsheet compute core is honest derive-first work. One interactive sub-lane (edit-cell / input-handling).free
sudoku32CONSTRUCTIBLE-WITH-2-NAMED-GAPSfree
text-editor40CONSTRUCTIBLE-COMPLETEfree
timeline31constructible-with-gap: 3 pipe primitives fully witnessed (timeline, range-filter, gantt-sink); 1 declared pure-kernel gap (time-scale). One interactive sub-lane (pan-zoom / input-handling).free

Honest ceiling. A rung means the primitive is named in the app's authored Spine, never that the app runs. Verdicts/gaps are copied verbatim. Inherits the Spine ceilings (record_shape unproven; port-level not record-shape).

SOURCE. This page is site/platform/catalog.html, rendered from the section frame + the manifests by build_habitat_pages.py over page_set.py. The source is canonical; when a rendered page and its source disagree, the source wins.