The engine values a real business. This is everything the owner touches around it: 23 screens, one file each, tied together by a shared shell and one demo dataset. Built as static HTML so you can implement against it. The spec is the decider; the notes below cover the build decisions and the open questions worth your eye.
Landing to valuation, in order. This is the demo spine: a new owner connects QuickBooks, confirms a few add-backs, and gets a defensible number. Start at the top and click straight through.
Grouped by surface. Pre-login screens use a minimal centered header. App screens use the full shell (sidebar, topbar, dock, StreetAgent overlay), injected by shell.js from a single <div id="page">.
?expired=1).?state=failed.index.html and click.assets/shell.js. Each screen ships its main content plus one <div id="page" data-page="…" data-subhead="…">; shell.js injects the sidebar, topbar, dock, and StreetAgent overlay and highlights the active nav. Pre-login screens use data-shell="minimal" for a centered header instead.assets/data.js (window.SS_DATA) with shared formatters in window.SS_FMT. Change a value once and it updates on every screen.data.js, then the inline page IIFE, then shell.js.assets/colors_and_type.css carries the brand palette and @font-face (local TTFs, offline-true). assets/app.css layers the shell, components, and functional status tokens. Never hardcode hex.No owner surface shows a trust-state label, a firmness bar, or a confidence pill. Owner-facing confidence is two things only: the Value Range width (wider means less firm, with no caption) and the two rollups, Counted in SDE (signal-green) and Pending your review (amber). The engine's trust states (Verified, Confirmed, Provisional, Suppressed) live in data.js because the dataset mirrors EvaluationResult, but they never render on the instrument. Keep them backend-only, available to the StreetAgent and external consumers.
Northside HVAC, LLC. Numbers are lifted verbatim from the canonical scoreboard prototype so the instrument reconciles end to end. Source of truth is assets/data.js.
Where the build plan and the comps disagreed with the spec, the build follows the spec. The five changes that matter:
?view=pillar&pillar=<id>). The brief's one-route-per-pillar is superseded.Every place this build made a call you should confirm, or invented nothing and left a gap on purpose. Listed so the handoff holds no surprises.
onboarding/01-landing.html matches the live site at smallstreet.ai: the warm marketing neutrals (canon --ink-60 / --cloud-deep / --paper), numbered section markers, and one full-width charcoal band. It loads colors_and_type.css only and builds its own header and footer, so it carries neither the app shell nor app.css. Every other pre-login screen uses the minimal shell; the landing is the one exception, on purpose.onboarding/02-invite.html) so the walkthrough stays clickable. Production captures the email to a waitlist instead. The footer "Privacy" and "Terms" links are href="#" placeholders, and the live footer also carries a contact email. Wire the real routes at handoff.assets/logos/primary-dark.svg and siblings) render black across the org, not charcoal or coral. Cosmetic, affects every screen's mark. Patching the source SVGs is a quick fix and is waiting on a go-ahead.?state=success · ?state=error). Ship the subset 1.0 calls for.?error=1. Confirm the copy.companies/select.html), which then honors the single-Ready auto-forward. Confirm.href="#" placeholder. Wire it to the real contact destination at handoff.