Door
Changelog
One line per merge note, read from the repository itself, newest first. An entry names its own note rather than linking it: the note lives in a repository that is not public.
2026-10-02
RECEIPT SPECIFICATION R1
The receipt, a small record of what file was fetched, from where, at what time, under what terms, already existed as the door's ?view=provenance answer (SOURCE RETENTION R1). This round publishes that shape as a standard: a versioned specification document, a JSON Schema a third party can validate a receipt against directly, a validator door that checks a receipt by URL or given inline, and a trust mark a keeper can display once a register's receipts validate. Nothing here changes what a record says; it names what a record already carries.
2026-10-02
REAL NAMES R1
normalize(name) = lowercase, strip diacritics, drop everything but letters, digits and spaces, collapse spaces, drop a trailing suffix among {jr, sr, ii, iii}. A corner links to a profile when (a) the profile is visible, not deleted, has a real_name, and (b) normalize(real_name) == normalize(corner name) OR the first and last tokens match and the corner name has no more than one extra middle token, and (c) the profile's discipline equals the card's discipline or is empty, and (d) EXACTLY ONE profile satisfies (a)–(c).
2026-10-02
OBSERVATORY R1
OBSERVATORY R1 ships "The State of the Public Record": two live logs over what the door has fetched and what has been corrected, plus a frozen quarterly issue that reads both logs and the gap index into one document and serves it back unchanged. Nothing here grades or names a person; every number is either a live door read or a figure the issue froze at mint time.
2026-10-02
CORPUS GAP INDEX R1
Figures below combine the production probe (GET corpora/gap, asOf 2026-10-02T13:48:20.408Z, catalogue 182 entries) with the raw per-kind counts the same catalogue snapshot produced (total entries / loaded entries / publishable entries — the door itself only ever prints the shares, never these raw counts; the counts here are read from the catalogue plus the rulings file for this note).
2026-09-30
SOURCE RETENTION R1
After the real backfill, the same record's ?view=provenance proved live: retained: true, retainedAt: 2026-09-30T05:56:11Z (the CHRB register's own live proof — the ledger's exact words: "API chrb record ?view=provenance → retained true, retainedAt 2026-09-30T05:56:11Z, staleAfter 2026-10-05").
2026-09-29
PUBLIC RECORD PAGES R1
Finding the round exists to fix: the site had NO /records/<kind>/<key> page; every search hit and every GPT/connector answer linked to pansofica.com/records/<kind>/<key> and got a 404 (Ruling R44's flip blocker from an earlier round).
2026-09-28
COVERAGE GLOBE
Claimed people/organizations are omitted from held. obtainable = Task 1's loader, entries with status not in {public, loaded_dark}.
2026-09-27
CONNECTOR ROUND 2 — REACH AND REFRESH
Every equality asked for held; nothing below reports a mismatch (Ruling R35's discipline, carried: every proof leg is required, never optional).
2026-09-26
CONNECTOR ROUND 1 — a scattered register becomes a searchable corpus from one YAML file, zero code per register
Two rulings shaped it most: Ruling R3 (subject key): subject.key.from ∈ {row_hash, identifier, columns}; row_hash = sha256 hex of the row's exact source text (no row terminator) = Harvest's own row_hash — cost if wrong: the LEIE count/sample equalities fail visibly in the proof.; Ruling R12 (the accounting rule): the spec accounts for EVERY header column (identifier | name | date | attribute | wall | drop-with-why); an unaccounted column refuses the build and explain names it — this is how "everything else dropped and SAID so" is enforced, not just printed — cost if wrong: longer specs for…
2026-09-25
LICENCES ROUND 2 - providers become a searchable corpus, dark; Clearance gets its first register
The pages - atlas www.pansofica.com/providers (landing, search box) and /providers/<npi> (record + clearance), dark behind the same flag; preview twins under /preview-k9f7s3m2/pansofica-site/providers/.
2026-09-25
ASK THE RECORD — ROUND 1
Three words govern this round, unchanged from the contract: the record as published, with its source (never "truth"); the model is a renderer, not a source (every sentence carries record ids; a code checker drops anything not tied to the evidence set before it is shown); the join across corpora comes from the subject's own claim, never a name match.
2026-09-24
HARVEST ROUND 1 — LA's flag speaks, licences landed dark, two pulls repaired
Prisma models LicenceProvider, LicenceProviderTaxonomy, LicenceExclusion, LicenceProvenance map column-for-column (a spec pins the SQL↔schema agreement, 23 assertions).
2026-09-24
GENERAL SEARCH R1
One box, every corpus. A shared SearchBox component renders on the home page, /find, the property landing (parcel-scoped label) and the claim page. The home and /find read GET corpora at request time (force-dynamic, cache: 'no-store') and print, per visible kind: a chip (countWords ?? noun ?? label), a "What the register holds" block (headed by the registry's own noun, falling back to the copy label only when the service sends none), and a "Recently added" line (kinds with a since only).
2026-09-23
CORPUS REGISTRY ROUND 1
Kinds — 3 visible by default (person, organization, fighter); a 4th (parcel) registers dark and joins kinds()/describe()/GET corpora LAST, in provider order, the moment PROPERTY_PUBLIC=true.
2026-09-22
PROPERTY ROUND 2 — THE PAGES, DARK
Pages — /property (the landing, five group sections + their dispute rails) and /property/[jurisdiction]/[apn] (the parcel record), under (pansofica)/pansofica/(site)/property/ in atlas-ai; a preview twin of both under (hypd)/preview-k9f7s3m2/pansofica-site/property/. No per-jurisdiction index page this round (Ruling 9).
2026-09-22
PROPERTY ROUND 1 — THE ROLLS
Five tables, all BIGSERIAL ids (bulk-volume tables; the plan budgets disk), every timestamp with a DB default, applied by psql -1 -v ON_ERROR_STOP=1, never by prisma migrate.
2026-09-18
PARTNER API v1
The same payload builders as the public page. record() resolves the id to the live slug (following a merge tombstone) and calls FighterReadService.publicBySlug — the function that renders pxl8.io/<slug> — then projects. Nothing on the partner surface can say something the public page does not, except the suspension read.
2026-09-18
LANDING 2026-09-18
Main held #852–#856 (reported record) and #866–#876. Free: #857–#865 — exactly filled by evidence (#857–#859), suspension (#860–#862) and engine-general (#863–#865), which KEEP their numbers. Genuine duplicates moved to the end.
2026-09-18
LABELLING MARKET round 1 — people label, we record what we would pay, the labels carry a typed source
Live link: https://www.pansofica.com/label (public page; pansofica.com/label redirects there) · draft terms https://www.pansofica.com/label/terms · the labelling desk https://pxl8.io/labelling (sign-in; by invitation code).
2026-09-18
BUILD ROUND 7 — THE SURFACES
2026-09-18
BUILD ROUND 6 — CLAIM YOURSELF
A fact has two axes and they never mix (RULING 3). GRADE says where it came from: verified (a registry's document — attached by an operator with the document's URL and sha256), reported (the open web: two citations WE re-fetched, from two registrable domains, by two witnesses — the round-3 compiler with a generic schema, the record-keeper blocklist of this domain), subject_declared (the subject's own statement). STATUS is round 4's flag, five values, unchanged (0 lines in record-status/, the 0029 CHECK, the kit).
2026-09-18
BUILD ROUND 5 — THE DEVELOPER KIT
NOT built (said plainly): name → record resolution in the kit (ruling 7: that is a decision; recipes may store ALL search candidates for a person) · CORS * on the link route (the lookup stays server-side — a production behaviour change, BACKLOG) · a signed link on the keyed read (receipt: null this round — BACKLOG: Partner record returns the link) · a private registry (none exists on the box; tarballs) · any publication · a Python 3.9 run (3.13.3 only; every file parses under the 3.9 grammar — one CI run before the first upload) · Firefox / Safari runs (Chromium 153 only) · a fix for the…
2026-09-18
BUILD ROUND 4 — THE RECORD FLAG
The status is DERIVED at read time and stored nowhere (derived, never declared). One shape everywhere, brand-neutral (recordStatus).
2026-09-17
Cross-commission suspension check
What the numbers mean.
2026-09-17
THE SUBJECT IS A CLUSTER
Contract additions are OPTIONAL fields only: RecordActivity.place, RecordActivity.measures (closes the previous round's finding 14 for profiles and rules), EngineRecord.events, RecordSchema.impossibilities, RecordSchema.subject.
2026-09-17
THE REPORTED RECORD
Two grades on one record.
2026-09-17
MERGES PAGE: a "CONTESTED" marker
No schema migration, no SQL to apply, no env, no index (model_verdicts_proposal_id_idx from 0014 is enough — the table is a few thousand rows). One service: sports-data.
2026-09-17
LANDING 2026-09-17
Departures, each pinned by a spec: 1. A config error (no key) and "no eligible provider" are THROWN, never written as a failure row. The note's diff would have written one failure row per queued pair, and the resume key (proposal × judge version) would never offer those pairs again. 2. parseVerdict stays outside the provider try, so a non-verdict exception propagates instead of becoming an error: row. 3. Row strings that change: stop_reason is end (was end_turn); a non-JSON reply is parse: not valid JSON…; a transport error is network::<msg> (was error:<msg>). No code reads these values.
2026-09-17
FIGHTER BIOGRAPHY + SEARCH SURFACE
R6 asks whether a name is unique in the registry. It never asked whether it is unique in the source — and the name normalizer folds JR/SR/II/III, so a father and a son are one name, one town and one nationality. That was safe for a promoter's roster (a current list) and unsafe the moment an OPEN source covering ~26,000 fighters across 130 years was applied to the same rule: a historical same-country namesake with an article could pass anchor (c) and attach a whole stranger's biography — and a whole stranger's fight table — to a live fighter's page.
2026-09-17
ENGINE CONTRACT: GENERAL
Same seeded block-level 60/20/20 split (seed 42) before and after, so both read the same test blocks. Every line and weight fitted on TRAIN only; validation chose the feature list; test read once per row. "BEFORE" re-ran the evidence run's example on main's engine and reproduced its table to the digit.
2026-09-17
BUILD ROUND 3 — convergence audit, doubts in production, receipted ingest
Reading. On 09-17 the offline experiment rebuilt 223 of 45,064 live pairs. With round 1's per-corner identifiers the same procedure now rebuilds 29,116 of 45,674 — two thirds of live identity is reproducible from zero under the current function. The remaining third is almost entirely the resolver's *exact name + same home* rule, which the rebuild does NOT apply (the printed home is on no corner; notApplied says so in every row). 45 pairs apart live / together rebuilt is the engine's over-merge exposure against live: 0.1 %.
2026-09-17
BUILD ROUND 2 — corroborators, calibration tooling, revert semantics
Reading. E1's finding holds on the real queue: the identifier route is unreachable on stored rows, no fight is printed by two registries, and the relation route would corroborate 2 of ~1,000 pairs — in a stratum that has no unattended path. Nothing here can execute.
2026-09-17
BUILD ROUND 1 — snapshots, context artefact, replay gate, erasure
Private Prisma client per #851 (shared client md5 unchanged until the deploy step). On the landing head, after origin/main was merged into the branch (docs only, both sides kept).
2026-09-17
ACCEPT PATH RE-VALIDATION
MergeProposalService.accept() claimed the row, read liveSides and merged. It never re-read the pair through the scorer, so a proposal scored days ago could be accepted after either record had changed (other merges landed on it, new documents arrived). autoAccept() had the same shape inside generate(): an earlier automatic merge of the same run could change a later pair's records before its merge executed, and the survivor was chosen off the run's first read.
2026-09-16
ONE RECORD ENGINE
The summation order is part of the artefact's identity: the digest keeps features in insertion order (sorted keys elsewhere), because the scorer sums contributions in that order and a JSON tool that reordered the keys would otherwise verify and still move the last bits of every logit. A reordered artefact is refused by parseWeightsArtefact; a test proves it.
2026-09-16
Every Fighter — Round 6 (international federations) + round 2 remainder
Coverage delta (read-only SELECTs, base 2026-09-16 21:41Z → 2026-09-17 04:06Z): sources 14 → 21 (all enabled); bouts 16,335 → 17,725 (+1,390); events 1,989 → 2,120; source_documents 2,583 → 2,745; live fighters 16,411 → 18,372 (+1,961 — name-keyed rows on the federation sources are people counted once per source, never a headcount; Tennessee's federal numbers JOINED 22 fighters to rows other commissions already held); OPEN reviews 2,226 → 2,311 (+85, all filed by this round's sources and every one document-level or a doubt, none a wrong write); announcements 162.
2026-09-15
EVERY FIGHTER round 7.6 — the corroborator
the commission-printed registry number is now read off every corner the sheet prints it on — the discipline gate that threw away 596 already-read numbers is gone, Florida's printed U+2010 hyphen folds, Nevada's ABIN prefix is the ABC number (and the state licence printed beside it never is), Louisiana's bare digit run in its Federal I D column is that number — and the archive was re-read by the identity healer, not by a reset: id-only writes plus reversible merges behind a tombstone and a relative 301.
2026-09-13
EVERY FIGHTER round 7 — entity resolution v2
two fighters who share a first and a last token are now scored on twenty features into a calibrated p_same, a score is never a merge — it is a merge_proposals row an operator rules on through five verbs (list / claim / accept / reject / revert) at admin/merges — and the machine may merge unattended only with a hard corroborator (an identifier match, or two shared opponents), which today nothing in production has: the production run wrote 272 proposals, 0 auto merges, 0 changes to any fighter.
2026-09-13
EVERY FIGHTER round 7.5 — a bout is never held
a commission is no longer an identity boundary and a bout is never held — a corner the resolver cannot pin to one live fighter becomes a namesake row the bout is written on and a round-7 merge_proposals pair for an operator, so the 3,512 held AMBIGUOUS_FIGHTER items (3,475 real bouts nothing had written) are re-driven by one internal call instead of sitting in a queue nobody reads.
2026-09-12
Fighter identity — EVERY FIGHTER round 1.5
an identifier is read at ONE point and keyed on its digits, a fighter can be merged into another reversibly (fighter_merges + a merged_into tombstone that answers 301 and is excluded from every public list), 129 identifier-certain merges were made and 4,363 federal ids re-keyed, an archive-wide healing pass put 115 printed identifiers back on the right people, 406 evidence-free fighter rows were swept (plus 44 after Missouri's re-read), the per-source reset became a script that keeps identifiers and remembers whom a source printed, and Missouri's comma-less hometowns read as states.
2026-09-12
Every Fighter — Round 1
BEFORE — the ledger's baseline block, 2026-09-12 07:20Z (docs / events / bouts / fighters-with-a-bout / open reviews).
2026-09-11
Verified Record server
The registry gets a public face and an identity join: R6 closed — NV and PA MMA cards now read the ABC national MMA registration number (abc_mma_id), the same registry TX was writing as tx_mma_id; the two schemes are merged into one. NV+PA ambiguous corners 1407 → 1015; 8845 bouts (+394) and 11139 fighters (−312, people who were two rows are now one).; Public fighter pages — GET /fighters/:slug, /fighters/lookup, /fighters/sitemap, anonymous, provenance on every bout, no federal ids, no DOB.
2026-09-11
Verified Record fighter search & browse
Trailer hygiene: none needed this run — every implementer commit already carried the launcher's two trailer lines.
2026-09-11
Verified Record — docs server (in-product documents, tolerant corner lookup, licences + weigh-in weight)
Web-plan note: enableCors exposes no Access-Control-Expose-Headers, so a cross-origin fetch() cannot read Content-Disposition — compose the filename client-side from the sha; an <iframe>/<object> viewer is unaffected.
2026-09-10
Golden Source — Commission Pack
PARTIAL reasons: NV 81 = 56 bout-level unreadScores + 4 hard errors + 2 shape refusals + 19 short-by-one (9 × a lower-case letter inside a surname — McKENNA… — read as a hometown line; 10 × startOfCorner stopping at a wrapped continuation row) → nv-v3 shapes ledgered; FL 6 = a title line printed in the gap between two bouts bridging the fold (5) + the BKFC "Ice Wars" form family (1) → fl-v3 shape ledgered; PA 55 image-only sheets + shape refusals; LA 27 LiveCycle/flattened; NJ shape refusals on pre-2016 sheets.
2026-09-08
Golden Source — Phase 1
Residue checks (all against the archived sheets, pulled from our Spaces bucket, pdftotext -layout): (a) Label-named fighters: 0.