ForgeKitFORGEKIT

Build Log

Alloy — First Real Product Screen, Built Honest

July 18, 2026

Built the first real Alloy product (products/alloy/) — a working Next.js + Clerk app rendering the Orient screen from real ForgeKit OS session data, with every unwired panel showing an honest 'not connected' state instead of the mockup's invented metrics.

AlloyForgeKit OSNew ProductUI
1
new real ForgeKit product created — products/alloy/, Next.js 16 + Clerk
18
React components built, all reading real data or showing honest 'not connected' states
0
invented/fabricated metrics shipped — every number traces to a real session JSON field or is explicitly absent
2
real bugs found and fixed in the process (min-w-0/min-h-0 flex-shrink defaults, table-layout: auto width overflow)

Timeline

Start
Crucible run on the Alloy design spec
Round 1 cold: hold off. Round 2 reframed (Zeb: 'this WILL be built'): ship narrow, real data only.
+30m
Anvil Check: where does Alloy live
products/alloy/ as a real product from day one; first build stays small (deferred commitments, not deferred identity)
+1h
Discovered Arc Intelligence classifier already existed
taxonomy.mjs, classify.mjs, render-arc-trace.mjs — real classifier output for one session, built same-day by prior sessions
+2h
Scaffolded products/alloy/, wired Clerk auth
Next.js 16, new Clerk app created via CLI, real sign-in/sign-up, proxy.ts auth gate
+4h
Built and wired all Orient-screen panels to real data
session listing, Workpiece Blueprint, Gate Effectiveness, What Changed, Open Obligations, Evidence Tray — all reading forgekit-os/sessions/*.json directly
+6h
Multi-round visual/layout refinement against reference mockups
grid architecture measured from mockup pixels, multiple flex/table sizing bugs found and fixed
End
Anvil Check: Workpiece entity scoping
Determined session=workpiece is a real category error requiring a new schema field + entity; deferred to next session

What shipped

products/alloy/ — new Next.js 16 + Clerk product, real sign-in/sign-up, honest dark UI matching the reference mockups' visual language

lib/forgekit-os.ts — reads forgekit-os/sessions/*.json and arc-interpretations/*.json directly off disk, no database, no synthetic data

18 real components: TopRail, Sidebar, ForgeArcRail, GoodMorningPanel, WorkpieceIntake, RecentForgeArcs, BlueprintSummaryPanel (renamed from session_contract fields, not invented Objectives/Constraints), WhatChangedPanel (real built[] with a working 'View Change Log' link to the real forgekits.build/build-log/<slug>.html page), OpenObligationsPanel (real nextItems[]), CommandLedgerPanel (honest placeholder), GateEffectivenessPanel (real gate_checks[], rendered as a bordered table with a colored footer row), WorkpieceStatusPanel, EvidenceTrayPanel (real stats[]), ColdFlamePanel + ScaleHeatLossPanel (honest placeholders), CruciblePanel/AnvilPanel/MechanismRackPanel (honest placeholders)

lib/asset-version.ts — cache-busting for public/ assets keyed to real file mtime, fixing repeated stale-image caching during logo/background-art iteration

Strike + Anvil entries in anvils.md/strikes.md: Alloy placement decision (product-with-deferred-commitments, not product-vs-tool)

What is the right thing to do? Regardless of cost, effort, time... what is the right thing to do?

Zeb, when asked to weigh convenience against correctness on the Workpiece entity question