Field notes · build log 03
The gap loop, on a clock.
Build log 01 showed the record; build log 02 showed the gate. This one closes the loop the whole doctrine promises: a question the system cannot answer honestly becomes a logged refusal, the refusal becomes a capture request, a human ships the knowledge, and the object carries its provenance back to the question — in under a day.
One thing said plainly before the exhibits: the chain below ran on seeded demonstration content — the frozen endpoint-support reference corpus and its test questions, exercised while the system was being built. The mechanism is the product; the demo corpus was its proving ground. The last section shows the same loop closing on real knowledge.
The honest refusal
Everything the system does leaves a typed signal. The taxonomy, with live counts as of this post:
answer_served 11 · retrieval_no_match 16 · candidate_created 204 candidate_rejected 58 · edit_distance 124 · answer_thumbs_down 2
On the build weekend, a seeded test question hit the store and the system declined to fake an answer. Two honesty gates fired in sequence: retrieval had actually cleared the confidence floor, and the model still refused — it judged that what came back didn't answer the question. The refusal filed a gap candidate the same second:
{"ts": "2026-08-09T23:22:49Z", "signal": "retrieval_no_match",
"query": "how do I reset my office badge when the reader stops accepting it?",
"confidence": 0.5699, "filters": {"status": "validated"}, "model_refusal": true}
{"ts": "2026-08-09T23:22:49Z", "signal": "candidate_created",
"candidate_id": "CAND-20260809-232249", "type": "gap", "origin": "retrieval",
"query": "how do I reset my office badge when the reader stops accepting it?"}
The log holds a wrinkle worth keeping honest: two minutes earlier, the same question had been served an answer citing an adjacent object at the same confidence. The refusal check itself arrived mid-stream — in the operator's words, an overnight automated build added the model-refusal check, using the seeded demo content as its validation baselines. The same question got a worse answer at 23:20 and an honest refusal at 23:22, and the signals log kept both.
Refusal → gap → object, under a day
The gap candidate went to the gate; the knowledge got written and promoted the same night, and validated the next morning. The commit history is the timeline:
791cfb2 2026-08-09 Phase 4: promote gate CLI + first gate-promoted draft (KO-000011) 13fa752 2026-08-09 Draft bodies for KO-000011..KO-000015 (awaiting the gate) 22fedf9 2026-08-10 Gate: validate KO-000011 (console)
KO-000011 was the first object ever promoted through the gate — the gap loop is the system's founding workflow, not a feature bolted on later. And the record remembers why it exists. The object's own front matter cites the gap candidate as its source:
id: KO-000011 title: "How do I reset my office badge when the reader stops accepting it" domain: endpoint-support status: validated last_validated: 2026-08-10 source: CAND-20260809-232551 # the gap candidate, cited as provenance
Refused at 23:22 on August 9. Validated on August 10. The clock: under a day. And asked again the morning this post was written, the once-refused question gets its answer — cited, scored per section, at nearly twice the confidence of the refusal it started as:
The gap the system was right not to fill
A gap loop that fills every gap is just a content mill. The same build weekend, another seeded question — descaling the break-room espresso machine — was refused, filed as a gap, and then rejected at the gate:
{"ts": "2026-08-09T22:20:43Z", "signal": "retrieval_no_match",
"query": "how do I descale the espresso machine in the break room?",
"confidence": 0.4404, "filters": {"status": "validated"}}
{"ts": "2026-08-09T23:26:23Z", "signal": "candidate_rejected",
"candidate_id": "CAND-20260809-232607", "type": "gap", "origin": "retrieval"}
Note what the rejection lacks: a reason code. This is one of the exact "uncoded ×3 — logged before reason codes existed" that build log 02's metrics view confesses to. The posts end up citing each other's evidence, because the evidence is one system.
Every gap the system has ever admitted to
Because refusals are typed signals, the complete inventory of unanswerable questions is one query away — here it is, verbatim:
how do I descale the espresso machine in the break room? vpn drops how do I reset my office badge when the reader stops accepting it? how do I request a loaner laptop for travel? my laptop battery drains overnight even when the lid is closed why does the battery die overnight with the laptop lid shut? the guest wifi captive portal never loads how to prevent laptop battery drain when closed (3 phrasings) what is the wifi password for the moon base? what is the correct mash bill for a wheated bourbon at 15 percent rye
Two lines deserve their footnotes. The moon-base question is a deliberate probe from the build tests — the right answer to nonsense is a refusal, and a refusal is what it got. And the last line is not seeded content at all: it is a real question from the operator's own life as a distiller, refused because the craft store didn't cover it — and the same loop closed it. The gap became KO-000057, What is the correct mash bill for a wheated bourbon, validated in the craft domain. The system does not care whether the gap is a badge reader or a mash bill. That is the point of building the mechanism instead of the content.
the instrument this post exercises
AI Prompt Library — the capture loop, as production prompts
Eight production prompts and the evaluation protocol that turns a refused question, a resolved case, or a wrap-up note into a grounded draft for the gate. The living module: prompt updates ship free as the model landscape shifts.
Credited in full toward the $299 toolkit within 14 days — the same window as the refund. Written and maintained by the author of this post; dogfooded in the toolkit's own source repo. Single-organization license.
That closes the build log's first arc — the record, the gate, and the loop that connects them to demand. The log continues: two kinds of old. Back to the reading room.