The medical signed-record locked a lease, then hit its one-signer ceiling
/lease-contractCaptured at a 375px viewport. Long pages scroll inside the frame.
The screenshots stay in Japanese. Every round is a real screen for a real Japanese industry, so an English re-render would no longer be the screen the agent actually produced.
Write-up
The medical signed-record locked a lease, then hit its one-signer ceiling
Build log series: I hand a real screen to an AI that has never seen Gunjo (
@gunjo/ui) and let it build. Real estate, screen two: a lease contract with its statutory disclosure (contract terms, special clauses, the disclosure, party signatures, then execute, lock, and amend by addendum).
A different animal from #60's rent roll (an operations dashboard): this is a legal document being drafted and executed. Assemble the rent and the special clauses, have the licensed broker walk through the statutory disclosure, and let the parties sign. Once executed, it becomes a signed record that only an addendum can change.
Result: 4/5
tsc and build passed, the console stayed clear, 375px turned the parties table into cards, the six disclosure items plus the tenant's confirmation gated execution, executing locked every tab read-only (aria-readonly, all four signatures in), addenda appended, and the page had a single h1.
The star this round: medical SignedRecord mapped one-to-one onto a lease
SignedRecord, built in #59 for medical signed records (nursing notes, discharge summaries), was adopted unprompted by this round's agent for contract execution:
🟢
SignedRecordreused across industries: a strong fit. Built for clinical notes and discharge summaries, but its draft, sign, lock read-only, append-only abstraction maps almost one-to-one onto execute, lock, and addendum. ThecanSigngate, thechildren({readOnly})render prop (flipping the whole tab body read-only),aria-readonly, the lock notice, the signature audit row, and the addendum input with its thread: all of it is already in there. Swappinglabelsre-voiced the whole thing into leasing vocabulary. This component genuinely does not care which industry it is in.
Medicine's "sign, lock, append" and real estate's "execute, lock, addendum" turned out to be the same skeleton wearing different words. One labels swap turned a nursing-record component into the execution engine of a lease. CoSign (built in #58) covered the mutual confirmation between the licensed broker and the tenant on the disclosure, as-is.
What I fixed this round: CurrencyInput had no label (the input set is now complete)
- 🟡
CurrencyInputhas no label or description, so the rent, deposit, and key-money fields each got a hand-rolled labeled wrapper. The third instance of the same omission, after Textarea (issue #245) and Input (issue #249), now fixed (issue #258, PR #261). With this, every major input component carries label and description.
Logged, not built (waiting for a second sighting in contracts and legal)
SignedRecord is strong, and the contract work still exposed contract-shaped gaps:
- 🟠 Multi-signer support for
SignedRecord (issue #259). A lease executes with four parties (landlord, tenant, guarantor, licensed broker) and an addendum with two, butsignedByandauthorare singular. An extension, not a rewrite:signers: {id, role, required}[]plusallRequiredSignedplusaddendum.parties.CoSignstays a fixed two-party tool and should not be generalized. - 🟠 An ordered, editable list (special clauses need add, remove, and reorder, issue #260).
TagInputis unordered short tags,Listis display-only,EditableDataTableis a grid. The agent hand-rolled<ol>rows of Textareas with up, down, and delete. AnOrderedListEditororClauseListis the right shape.
What I took away: how far a component generalizes shows up outside its home turf
medical: sign, lock, append (nursing notes, discharge summaries)
real estate: execute, lock, addendum (a lease)
= the same skeleton. The difference: one signer versus four
SignedRecord looked complete in medicine. It took a lease, a four-party execution, to expose the one-signer ceiling (the same shape as the ScanGate case in issue #237, where a missing end-of-flow step surfaced). A component's true boundary only becomes visible when it gets used outside the domain it was built for. The skeleton (execute, lock, append) crossed the industry line; what is missing is one contract-specific dimension (multiple signers), and an extension covers it. This is what training components across industries buys.
Next up: build log #62
- Another real-estate screen (tenant screening, or viewing bookings and listings) aiming for second sightings of multi-signer issue #259 and the ordered list issue #260, or close real estate at three screens and change industries.
The run
Gunjo was still in early alpha at the time; issues are welcome.
This series is co-created with AI (Claude and Codex). A human designs the experiments, makes the calls, and fact-checks before publishing; the AI does the hands-on work and drafting.
Components from @gunjo/ui
The components this screen's source imports directly.
The code the agent actually wrote
Click a file to expand its source.