Developer DocsAssumptions & Decisions

Assumptions & Decisions

This is the honesty ledger. The research left gaps; rather than invent defensible-sounding numbers from thin air, the demo fills each gap with an explicit, sourced assumption and writes it down here. Every constant, rate, and formula traces back to channel-dimensional-letter-variable-taxonomy.md — the authoritative pricing source — and where the taxonomy is silent, the choice is tagged below with its basis and its risk.

Two things make this credible rather than hand-wavy:

  • The seeded numbers reproduce the taxonomy’s two worked examples (see the callout at the end), so the defaults are externally anchored, not guessed.
  • Most assumptions feed only the background cost-plus path that drives the margin badge — they never move the price the salesperson sees. Those are flagged in the table.

Assumptions (A1–A19)

Collected from the technical spec’s inline [ASSUMPTION ...] tags. The “feeds” column notes which path each touches: display = moves the quoted price; badge = moves only the cost-plus margin estimate; PDF/form = presentation only.

TagAssumptionBasis / riskFeeds
A1signTextLabel added as a display-only field (not in the taxonomy’s Table A)PDF needs the sign text; zero pricing logic. Risk: nonePDF/form
A2Demo height ranges 6–60” (CL) / 6–24” (DL), narrower than the taxonomy’s 3–180”Per-inch rates and the DL grid are calibrated to storefront sizes; outside them the numbers stop being defensibleform
A3Face options trimmed to white / colored acrylicclear+vinyl and polycarbonate have no sourced $/sqftbadge
A4DL thickness folded into each material preset (shown read-only)The grid gives one thickness per material; an editable thickness field would require invented pricesform
A5DL finish multipliers applied relative to each grid row’s included base finishGrids already embed a finish (e.g. cast = brushed); the multipliers are sourced, the relative application is the assumptiondisplay
A6spacer/standoff DL mount = ×1.0 (“same as flush”)No sourced uplift; noted in the UIdisplay
A7One uniform letter height per quote (total_upright_inches = count × height)Multi-height sets are future; matches both worked examplesdisplay
A8Geometry shape factors per inch of height: 2.67 (perimeter), 0.711 (area), 2.13 (stroke)Back-derived from the taxonomy’s own Example 1; no DXF in the demobadge
A9Estimated stroke width = height / 5 (the LED-rows rule)Typical block letter; reproduces rows = 1 at 18–24”badge
A10Halo rate takes precedence over raceway rate when both applySources price the two dimensions separately; halo is the bigger upliftdisplay
A11Wire/studs $5 per letter (wire_studs_per_letter)Example 1 used ~$20 misc on a 4-letter jobbadge
A12Raceway length = Σ letter widths × 1.15A raceway spans the letter run; 15% spacing allowancebadge
A13Fab hours: 0.25 CNC/bend + 0.75 assembly per letter, scaled by clamp(height/24, 0.5, 2.0)Calibrated to reproduce both labor anchors exactly (8×24” and Example 1’s 4×18”)badge
A14Halo cost-plus uses the front-lit material modelNo sourced halo-specific material pricesbadge
A15Margin thresholds: red < 0.30, amber < 0.45, else greenReconciles the two source formulations of the warning; the healthy example sits at 74.7% (deep green)badge
A16Install-hours heuristics (CL: 2 + 0.5×count; DL: 1 + 0.25×count) plus access & surface multipliersCalibrated to Example 1 (≈$500) and Example 2 ($300 exact); all results fall inside the sourced $350–1,500 banddisplay
A17Linear interpolation between DL grid anchors, height clamped to 6–24”The grid gives 4 anchors; lerp is the simplest defensible ruledisplay
A18Line items rendered to cents, totals to whole dollarsStandard US quote presentation (a display/PDF rule — the engine stores full float)PDF/form
A19Quote validity 30 days; 50%-deposit terms boilerplateCommon US trade practice; pure PDF furniture, owner-editablePDF/form

The “feeds: badge” rows are the load-bearing point of this whole page. Geometry (A8/A9), the halo material model (A14), wire/studs (A11), raceway length (A12), and the fab-labor calibration (A13) are all estimates — and they all land inside the silent cost-plus path that only colors the margin badge. The number the salesperson quotes is the per-inch rate (CL) or the grid lookup (DL), which rest on directly sourced rates.

Decisions (D1–D4)

These are spec-level design calls, not gap-filling guesses — each resolves an ambiguity or a latent contradiction in the source material.

TagDecisionWhy
D1Design is a flat ancillary design_fee ($150), auto-applied to channel letters only; task labor excludes design hoursRemoves the double-count latent in the taxonomy pseudocode (design appearing in both labor and ancillary) and matches both worked examples. DL gets no design line — patterns come with the resold letters
D2minimum_job_price ships disabled (seeded 0)A nonzero floor would break the Example 2 anchor ($1,157), and per-shop minimums are an open research question. Asking the friendly shop “what’s your minimum?” live is itself a validation probe
D3”Show BOTH” is implemented as two prices — the per-inch quote and a cost-plus reference — in a collapsed “Pricing detail” panel; cost breakdowns render only on SettingsReconciles the taxonomy’s “show both” with the architecture rule that the salesperson never sees costs. Both displayed figures are prices, not costs
D4A single permit_fee lineA separate electrical permit / dedicated-circuit fee is future granularity; matches Example 1’s math

For exactly how D1–D3 surface in the engine and UI, see the Pricing Engine page.

Open questions for the founder

The spec proceeds on a chosen default for each of these, but they remain open for Leo to confirm before the SignFlow validation demo. The defaults are reversible, and several of the questions are themselves good things to ask the shop owner during the meeting.

QuestionDefault takenTrade-off
Tech stackVite + React + TS + Tailwind + @react-pdf/renderer, localStorage — decidedFastest believable demo; Next.js is the natural later choice if hosted multi-user is needed, and the pure pricing module makes that migration small
Brand / product nameWorking name “SignQuote” placeholder, slate/indigo palette, logo placeholder boxZero brand risk in front of the shop; a rename is trivial
Seed shop identityFictional “Summit Signs & Lighting,” Austin TXReal SignFlow branding impresses more but needs their rate card pre-demo and risks anchoring them. The Settings screen makes a live swap a 2-minute moment — arguably a feature
DeploymentLocal laptop onlyHosting (~30 min) lets remote viewers click it themselves but adds surface for the demo to be seen half-broken without narration
Trimmed enumsCL = front-lit + halo, flush + raceway; DL = the 5 grid materialsSmallest believable demo; each re-added option needs a sourced rate first (combo/open-face per-inch rates don’t exist in the research)
Minimum job chargeShip disabled (minimum_job_price = 0, constant present in Settings)A nonzero default makes tiny quotes look saner but contradicts the Example 2 anchor; asking the owner their minimum is a validation question (see D2)
Margin thresholdsred < 30%, amber 30–45%Calibrated so the healthy worked example (74.7%) is deep green and a sub-cost quote is red; real shops may think in net margin. Tunable constant (A15)
Subscription priceNone baked into the demoThe strategy session floated $300/mo; competitive research supports a $79–149/mo band. Decide before the willingness-to-pay conversation, not before the build

Sources

The pricing rests on a small, named set of inputs — no fact in the demo comes from an unverified web fetch.

SourceRole
channel-dimensional-letter-variable-taxonomy.mdAuthoritative backbone — Table A schema, Table B constants, derived-field rules, pricing pseudocode, the DL grid, and the worked examples. The source of truth for any pricing dispute
research/manufacturing-pricing-deep-research.mdDomain detail: rate and material provenance, LED density & power-supply sizing, install/permit/engineering ranges, labor anchors
research/competitive-market-deep-research.mdValidation framing: the salesperson-speed wedge, the willingness-to-pay band, PDF-as-table-stakes
Notion strategy session (2026-06-04)Business context: the validation-first purpose and the friendly first user, SignFlow

The defaults are externally anchored. Seed quote 1001 (“CAFE”, channel letters) and quote 1002 (“LAW OFFICE”, dimensional) in src/data/defaults.ts are the taxonomy’s two worked examples. The engine reproduces Example 2 exactly ($1,157) and Example 1’s per-inch fabrication exactly, with the deterministic install heuristic landing the total within ~4% of the narrative figure — so the seeded constants in DEFAULT_SETTINGS are sanity-checked against numbers the demo did not itself produce. See the worked figures in Acceptance & Testing and tune any constant on the Settings & Constants screen.