Trust and confidence had been vocabulary up to this point. In this window they become screens.
The shape of the work is consistent enough to be a pattern. For the trust
gates: layout and the live gate list first (70975d1), then the reasoning chain
and risk grid that explains a gate (68250eb), then the decision actions a human
actually presses (3ba853b) — onDecision and friends. For the confidence
gates, the order is even more explicit: types and REST API seams (7a129f3),
then a store (fb913ef), and only then the views — ConfidenceGateView, the
clarify channel, path selection (10340df).
Seams before screens. When the API surface is typed and settled first, the view is a rendering job. Doing it the other way round means the first screen is a guess and the second one is a rewrite.
The other half of the window is authentication. The login has been a placeholder
long enough that it is worth saying plainly: a real keycloak-js OIDC client
lands on Auth Code with PKCE (662cedb), SSO-capable, with a typed API client
and orchestration service layer underneath it (#7). Every screen built on the
placeholder was slightly wrong, including permissions scoping — so this is not
chore work, it is the foundation correcting itself.
Two smaller surfaces round it out: a live event ticker as a bottom strip on the
orchestration dashboard (#8) and a settings view (#9), plus a trust-gate
alert banner (9297c07) so a gate needing attention announces itself instead of
waiting to be found.
Fifteen stories reached done inside eleven days, and the interesting part is
that most of them moved in a single stroke on 06-13 — the day the trust and
confidence surfaces were reviewed as a pair. Reviewing related stories together
is cheaper than reviewing them in isolation, and it caught the seam ordering
above.
Lessons learned
- Build the API seams before the views; the views are then a rendering job. The confidence-gate work did this deliberately — types, seams, store, then screens — and it is the reason three views landed in one commit.
- A gate nobody can press is not a gate, it is a status light. The decision
actions (
onDecisionand its siblings) are what turn a gate display into a control surface. - Replace placeholder auth early. Everything layered on a fake login is subtly wrong about who is allowed to do what, and that compounds.