Build the clickable POC prototype for the internal demo #37
Notifications
Due Date
No due date set.
Depends on
#30 Build the synthesized response corpus
christian/helmdocs-proposal-system
#36 Define the v1 component system and visual identity
christian/helmdocs-proposal-system
Reference: christian/helmdocs-proposal-system#37
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Question
The artifact for the first internal POC meeting, chosen by author direction over a decision review
and over a working end-to-end slice.
What it shows. The six surfaces from the app framework, styled, navigable, populated
with real content from the synthesized corpus: one solicitation with its confirmed requirement
overlay, four responses, the evaluation matrix populated with coverage states and per-scenario
cost, the invitation wall, and the Pro affordances visible-but-locked.
What it does not have. No RLS, no scheduler, no extraction, no billing. Every one of those is
mocked. This demonstrates the design and the domain model; it does not exercise the architecture.
Resolve on the way: which single narrative path the demo walks - most likely issue, invite, bid,
seal, open, evaluate - and which decisions are worth making visible in it. Several resolutions are
only legible as behaviour rather than as screens: the sealed-until-deadline transition, the
suggestion-versus-committed-score distinction, and the amendment that reopens one answer. A demo
that skips those shows a generic procurement tool.
Neutrality must be visible, not merely true. Because the venue carries the HelmDocs brand,
the demo cannot rely on brand distance to answer "why is the bid-writing company running my
evaluation?" The walk should make the mechanisms legible: bids sealed until the deadline, every
score created by a human commit, the model barred from gates and arithmetic.
Scope boundary, stated so it does not drift. This is a prototype, not the first build. It is
allowed to be throwaway and should not be mistaken for the code layout, which is the map's actual
destination and is a separate artifact.
Parent: #1
Resolution
The prototype: https://claude.ai/code/artifact/5b871a79-c939-4c15-a6a5-d572d6937bd1 — eight steps, arrow keys or the rail, on the Friendship PCS corpus.
Built on the component system fixed by #36.
The walk, and why it is this one
The ticket asked which single narrative path the demo takes. It is issue → seal → switch → bid →
open → evaluate → amend, and the switch is load-bearing rather than decorative: walking one
capability start-to-finish shows a procurement tool, and the whole thesis of this product is that
the two sides are one venue with a boundary through the middle. The walk crosses that boundary in
the middle of a live solicitation, which is the only way to show it.
Acting aschanges, and the wall shows issuer / category / deadline and nothing else.R-B6Creads not evaluable, never failing.The three that are only legible as behaviour
The ticket named these specifically, and they are the reason this is clickable rather than a
screenshot deck.
Sealed → open. Step 2 shows an evaluation surface that exists and is empty by construction —
not an empty state, a withheld one. Advancing the deadline fills it in one move.
Suggestion versus committed score. Every scored cell starts dashed. Opening one gives the
verbatim evidence span, the matched anchor with the full scale beside it, and the note that the
criterion→requirement mapping was authored, not extracted. Committing turns the cell solid and
moves the footer from
— · 0/10 committedto a real number. Gates have no drawer at all —there is nothing to propose, because the model is barred from them.
The amendment. Step 8 voids
GEO_PREFacross the live field, and its drawer explains that theprevious commit is retained in the record but no longer counts. Scores are destroyed and re-earned,
never silently recomputed.
Neutrality, made visible rather than argued
Because the venue carries the bidder-tools brand, these had to be mechanisms on screen:
Commit scoresas the loudest control on the evaluation surface — a human act, not a batch jobindeterminatemarks that route to a person instead of resolving themselvesNone of that is a claim about intent. It is all observable in ten seconds of clicking.
Two design bugs the build found
Both were invisible on the static system page and appeared the moment real state moved. Recording
them because they are findings about the design, not about the prototype:
Roll-up rows blended committed and proposed scores into one number.
Method of Approachread23.75while only one of its three children had been committed — a number that looks like a score,is presented like a score, and is mostly suggestion. This is the exact sin #15 exists to prevent,
reproduced by an innocent-looking sum. A roll-up must total committed children only, and show
its denominator:
9.00 · 1/3, or—at zero.Voiding did not propagate to the totals. After the amendment, a voided cell rendered correctly
as
voidedwhile its value quietly survived in the committed total and the1/10count. Theamendment appeared to work and did not.
Both are now fixed in the prototype, and both are constraints on
<EvaluationMatrix>: totalsand roll-ups must read through a single "is this an effective score" predicate, never off the raw
commit map. Handed to whoever builds it for real.
Verified, and not
Walked end to end in a browser: all eight steps, the capability switch, the seal→open transition, a
live commit with the footer updating, and the amendment voiding across two vendors.
node --checkclean.
Not verified: it renders blank in an automated Chrome profile via the artifact viewer while
rendering correctly when served directly — the same is true of #36's static page, which has no
script at all, so this is the viewer in that profile rather than either file. Worth one manual
check on the demo machine before the meeting rather than discovering it in the room.
Scope, held
No RLS, no scheduler, no extraction, no billing — all mocked, as the ticket specified. This is
throwaway and is not the code layout, which remains the map's destination and lives in
src/.The corpus numbers are real; the scores over them are authored for the demo, and the narratives
they produce (cheapest bid disqualified; 82.15 against 81.90) come from the corpus ground truth.
What the first real build will find that this cannot
Column resize past ten vendors, virtualisation against a sticky footer, and how expand-in-place
interacts with horizontal scroll. The 360/132/34px geometry from #36 survived three bidders and
seventeen rows; it has not met two hundred.