# LESSONS — mistakes and the rules they produced

Each lesson: what happened → why → the rule now. Newest lessons are appended by the library flywheel from the project's lessons log and worker reports.

## Coordination
- **Relay loop (26 Oct 2026).** One worker's report was relayed to the project lead five times in three minutes, plus an apology. → Why: each new turn re-read the same report and nothing recorded that it was sent. → Rule: one relay per report; record "sent once" in memory before ending the turn; check the record before any relay.
- **A schedule that fired without acting (29 Oct 2026).** A five-minute check-in fired hundreds of times and every occurrence was recorded, but its turns only reasoned and never ran the check, so turns waiting on the agent went unseen for a day. → Rule: every occurrence runs the check with real tools (a script that reads the live queue and prints what it found); a turn that only reasons is not a run. Audit a schedule's tool-call count, not its fire count.
- **Duplicate spawns.** Schedules firing every few minutes started second workers for jobs already running. → Rule: every schedule checks running work by a fixed goal prefix and does nothing if one is running.
- **A held conversation (20 Oct 2026).** The main conversation was held by a long job for over ten hours; scheduled runs queued and the project lead heard nothing. → Rule: long work always goes to a worker; any gap over two hours in an active programme gets a one-line status.
- **Wiki write races (20 Oct 2026).** A bulk wording pass wrote pages from copies read before another worker's edits and silently undid them. → Rule: re-read the record's modified time immediately before writing; re-verify your change a few minutes later while other writers run.
- **Stale generated file (21 Oct 2026).** A push overwrote a sibling's rebuilt script with an old local build. → Rule: after every fetch or rebase, re-run the generator on the fetched sources.
- **Superseded runner steps (26 Oct 2026).** A runner still mandated steps that a newer order had replaced, and a refresh committed to a frozen target. → Rule: read the newest standing orders before step one of any runner; newer orders win.
- **Repeated sends after a context reset (27 Oct 2026).** After a working-context reset the same answer went out two and three times, and acknowledgements were doubled. → Rule: read the relay log before any send after a reset; one acknowledgement and one relay per message, never more.
- **Fixing the wrong build source (27 Oct 2026).** A page under one section's path was assumed to come from a frozen copy step; it was actually built from another section's branch. → Rule: before fixing a page, find where it is really built (search the branches for the page's own markup) and fix it there.
- **A sync that could shrink the board (27 Oct 2026).** A board-sync script did not set its sync time and would have committed a board with rows missing. → Rule: a sync sets its timestamp on every commit and refuses to commit a board with fewer rows than before.

## Outward actions
- **Quoted history in a reply (20 Oct 2026).** An email re-quoted an earlier message the recipient had been asked to disregard. → Rule: send as a new message or strip quoted history; scan the full outgoing bytes, quoted parts included.
- **Fee wording.** A request offered to pay copying charges. → Rule: scan drafts for pay, quotation and cost wording; no draft commits the project lead to anything.
- **Asking the same body twice.** A ladder step suggested a question already asked months earlier. → Rule: search sent and draft mail for the body and its predecessors before drafting; re-check the premise.
- **Time zones (20 Oct 2026).** A brief gave a UTC time as BST. → Rule: every time names its zone.

## Publishing
- **Price drift (20 Oct 2026).** After a price change, old prices stayed on eight surfaces and in scheduled captions. → Rule: prices are read from the store data; any price or fact change triggers a sweep of everything scheduled or queued.
- **A banned phrase on a mirror (20 Oct 2026).** → Rule: scan every publish, mirrors and copied pages included; builds fail on a hit.
- **A private surname in an e-book (19 Oct 2026).** → Rule: privacy scan on the final bytes of every book or page.
- **A date inferred from a filename (20 Oct 2026).** A plan was captioned with a date and origin taken from its media title. → Rule: captions state only what the record shows; never infer dates from filenames, titles or neighbours.
- **Archive photos nearly published (20 Oct 2026).** Photos taken under a private-photography undertaking almost went public. → Rule: never publish them without the archivist's written authority.
- **Outside dates repeated (26 Oct 2026).** Pages repeated pre-1824 outside catalogue dates as if they were records of the house. → Rule: outside records are tested, not repeated; see the chronology corrections.
- **Process notes in provenance (26 Oct 2026).** Some catalogue provenance fields described how a record was gathered rather than where it is held. → Rule: provenance is the source only (holder, reference, date); the site build fails on finder or cycle wording.
- **Two kinds of "read more" (26 Oct 2026).** A site-wide three-line clamp met older section-level teasers, giving two styles on one page. → Rule: when a site-wide pattern lands, unwrap the older section versions at build time and check every section at 390 px.
- **Hedging family evidence (26 Oct 2026).** Phrases framing the 1667 acquisition as an unsupported story. → Rule: cite the record; never hedge it.
- **A boundary drawn wrong (27 Oct 2026).** A page and its infographic showed a land parcel as including a green the council registered in 1970; the plan shows the parcel line ending before the green, and the page had already gone out in outreach. → Rule: check every boundary statement against the plan before publishing or sending; fix the visual first, then every instance, and log it in the corrections register.
- **Annotated copies read as official wording (27 Oct 2026).** Coloured text in supplied draft minutes was treated as the council's words; it was a reader's own proposed amendment, and a record built on it had to be withdrawn. → Rule: never treat annotations, highlights or coloured text in a supplied copy as the issuing body's wording; confirm with whoever supplied it first.
- **Outreach that promised what the page did not show (27 Oct 2026).** Emails promised a 30-second video; the linked page played a ten-minute one. → Rule: before any send, open the linked page and check every concrete promise in the email (length, format, what the link shows) against it.
- **Images lost in a move (27 Oct 2026).** Moving the image vault left about 259 of 416 images unloaded on live pages. → Rule: before moving files, build a redirect map of every old path, crawl internal links after the move, and only then retire the old paths.

## Tools and platforms
- **Connected-app retries.** After one failure an identical retry can be refused, and a server error on a write does not prove nothing was written. → Rule: read the target state, then retry once with one harmless change.
- **Cache-busting parameters** are rejected by some payment APIs as unknown parameters. → Rule: no cache-buster on those calls.
- **Wildcard edge workers (25 Oct 2026)** ran on every asset request and exhausted the free daily quota by midday. → Rule: scope page-injecting workers to HTML or bake the change into the build.
- **Library catalogues behind bot protection** refuse plain fetches. → Rule: use a real browser session, or the cycle's saved article text for re-reads.
- **Measuring build stamps, not data (24 Oct 2026).** An adapter read dates from a homepage's HTML. → Rule: point adapters at the data endpoint the page itself fetches.
- **Broad sweeps vs named pointers (26 Oct 2026).** A week of broad newspaper sweeps moved no score; named pointers (a register entry, a deed, a case citation) produced the finds. → Rule: prefer named-pointer routes.
- **Truncated attachment IDs (26 Oct 2026).** Three mail-attachment downloads failed as "invalid token" because the long attachment ID had been cut short in a brief. → Rule: never slice an ID; pass it whole from a file.
- **Stale script after a build (26 Oct 2026).** A site-wide form fix shipped, but the edge kept serving the old script because its version parameter did not change. → Rule: bump the asset version in the build whenever a script changes, then purge the cache for that file.
- **Rate-limited forms (26 Oct 2026).** The sign-up list accepts six sign-ups per hour from one address; live tests used five. → Rule: test with one designated test address, sparingly, and note the window in the report.
- **Already-published media keeps old wording (26 Oct 2026).** Reels aired before a wording change still carried an old price and outdated lines, and the platform refused edits. → Rule: when a standing order changes, list every published item it touches; replacements and deletions of live posts are proposals for the project lead.
- **A privacy scrub broke scripts (27 Oct 2026).** A text scrub that removed every empty bracket pair also stripped them inside inline scripts, and its output was committed back into section sources, breaking the evidence-preview script on about 430 pages. → Rule: scrubs never touch script or style blocks; scrub build output only, never commit it back to sources; after any scrub, syntax-check the inline scripts of a sample page.
- **Oversized repository writes (27 Oct 2026).** Multi-file writes through an API bridge were refused with an opaque error once a request passed roughly 950 KB, and workers that retried the same request died repeating it. → Rule: keep each write to a few files and a few hundred KB; on an opaque refusal, shrink the batch and re-read the branch head before retrying, so nothing is committed twice; stop after two refusals.
- **Section pushes do not build (27 Oct 2026).** Pushes to a section branch did not start that section's build, so the live pin stayed hours behind. → Rule: after a section push, check the live pin moved and dispatch the section build if it did not. Site builds run one at a time and take 35–50 minutes: never start a second while one runs.
- **A widget that moved the page (27 Oct 2026).** A tour widget wrote a stop marker into the address on load, so its page opened halfway down at the tour every time. → Rule: widgets change the address only on a visitor's own choice, never on load.
- **Urgent fix while a build runs (27 Oct 2026).** A full site build takes 35–50 minutes; a minimal fix committed to the branch the host serves was live in about 90 seconds, and the same change on main kept it through the next build. → Rule: for an urgent page fix, commit the smallest change to the served branch for those files only, mirror it on main, and never cancel or start a build while one runs.
- **Dark-mode inversion (22 Oct 2026)** muddied data visualisations. → Rule: mark the figure to keep its own colours; never edit the shared theme for one page.
- **CDN package limit (27 Oct 2026).** A public CDN mirror refused a repository once it passed its package size limit, so thumbnails stopped loading. → Rule: serve large repositories' files from the repository host's raw file service or the site itself; check a sample asset after any switch.
- **A fix that missed its build (27 Oct 2026).** A fix was committed while a site build was already running; the build finished green but served the old file, because a build carries only commits made before it started. A minute after a green build the new files also still answered 404 until the deploy reached the edge. → Rule: after committing a fix, confirm the build that will carry it started after the commit; after a green build, wait a minute and re-check before calling the fix failed.
- **One rule, four copies (27 Oct 2026).** A lighter review gate was adopted, but the gate was hard-coded in a script, mirrored in a live worker's progress display, written in the protocol text agents read, and stated in the board's rule field, so the old gate went on blocking for hours. → Rule: when a rule changes, search every copy (code, deployed worker, protocol text, board metadata, runner files, schedule text) and change them together; test the copies agree on live data.
- **Workers that never started (27 Oct 2026).** Two spawned workers failed at launch on a runtime fault, and the work was believed to be running until their failure facts arrived. → Rule: treat work as running only once its start is confirmed; on a launch failure, respawn once and say so plainly.
- **Archived attachments not opened (27 Oct 2026).** The mail ingest skipped files sent inside ZIP archives, so their documents never reached the record. → Rule: unpack archives and treat each file inside as its own attachment; report locked ones as locked.
- **A 'general practice' assumed (27 Oct 2026).** A research note took one Gazette series ending as a blanket end to public notice of first registrations; dated examples showed the weekly lists ran to at least May 1977 and district registries still advertised individual applications in 1984–85. → Rule: test any statement about general practice against dated examples on both sides of the date before using it to read one case.
- **A status label that would not wrap (28 Oct 2026).** A long status in a no-wrap badge pushed an index page to 458 px wide at 390 px. → Rule: badges and chips wrap; re-run the 390 px check on index pages whenever new status text is added.
- **Large API answers (28–29 Oct 2026).** Unfiltered full reads of long mail messages and long task bodies came back as stored references or a truncated head instead of the text. → Rule: ask only for the fields you need (a field filter on the read) and handle the truncated-head shape explicitly; never treat a missing body as an empty one; live task reads cut long bodies off at about 8 KB, so append only and never rewrite a body you cannot read in full.
- **Guessed addresses bounced (29 Oct 2026).** One email sent to many bodies bounced at two: one address was an old alias that no longer exists, the other a variant missing a dot. → Why: the addresses came from memory, not from the last message that reached each body. → Rule: take a body's address from the most recent exchange that reached it; after any batch send, check for bounces within the hour and redraft for the working address.
- **One body, two threads (29 Oct 2026).** A body's complaint outcome and its refusal of a separate request arrived on different threads; merging them into one draft would have answered the wrong email. → Rule: one draft per thread; link related drafts with a signed note instead of merging.
- **Silent posting failures (28–29 Oct 2026).** Short-video posts failed for a day without an error reaching anyone, because of a fault in where their cover images were hosted. → Rule: read every post back from the channel after publishing; a post that is not visible there has not been published.
- **Unrelated images in a gallery (29 Oct 2026).** Three images with no connection to the project sat in a snapshot gallery. → Rule: confirm each image belongs to the project before it is published; when one is removed, delete the file and every reference to it (index, gallery page, sitemap) so no empty tile remains.
- **Gate tier guessed from titles (30 Oct 2026).** The hive board guessed each draft's review tier from words in its title and showed three preservation letters as needing 3 reviews while their headers said 10. → Why: the explicit tier field was dropped before the gate was computed. → Rule: store the tier on every draft and board row; when the board and a header disagree, the stricter tier stands until the record is fixed.
- **One face across four hundred years (29 Oct 2026).** A documentary scene spanning a time jump reused the earlier period's cast reference, so a later character had the same face as an earlier one. → Rule: build a new cast for each period; reuse a character only within their own lifetime.
- **A build dispatch cancels the running build (29 Oct 2026).** The site build cancels any run in progress when a new one starts, and a manual dispatch cancelled a build at its last step. → Rule: dispatch only when no build is queued or running; otherwise let the next push or scheduled build carry the change. Update 30 Oct 2026: with cancel-in-progress on, each new push also cancelled the running build, so queued fixes sat unpublished for almost three hours; main's build now has cancel-in-progress off, so builds queue and each one finishes. Never switch it back, and never cancel a build.
- **Fixes that lived only in the built output (30 Oct 2026).** Wording removed from a research page came back after every site build: the fix had been applied as a hot patch to the published files, while the page's source still carried it, and a guard commit on main started a fresh build that wiped the patch again. → Why: the build regenerates the published files from source. → Rule: fix the source the page is built from; treat a hot patch as a stopgap that every build removes, and re-verify after each build. A build that is still running is a reason to wait, not a failure.
- **Live checks refused by the edge (30 Oct 2026).** Some scripted fetch libraries get 403 from the site's edge while a plain command-line fetch of the same page passes. → Rule: run live checks with a command-line fetch or a real browser, cache-busted, and read a 403 from a library as the client being refused, not the page being missing.
- **Same name, different place (30 Oct 2026).** A record body's tidy-up unlinked events that turned out to belong to other farms called Great House Farm elsewhere in the county, a 1981 parliamentary mention of a "Great House Farm" was a government experimental farm, and a developer label for Llandough Farm had been listed as one of the farm's names. → Why: name matches were taken as the place itself. → Rule: confirm the location (parish, grid reference, parcel) before treating a same-name record as the farm or its removal as lost evidence; anything that fails the check goes to Kissed Frogs (standing order 27).
- **Same name, different company (30 Oct 2026).** A registry reply pointed to a modern company that shares the historic company's name. → Why: the search ran on the name, not the company number and incorporation date. → Rule: identify every company by its number and incorporation date, and say which one a reply concerns before filing it.
- **Bulk archiving without a scope check (30 Oct 2026).** Out-of-scope private material reached a public archive mirror because mail was archived in bulk and image-only PDFs were never text-scanned. → Rule: every mail read passes the scope filter (standing order 28); every file passes the privacy scanner before publishing, with image-only PDFs read by OCR first; the mirror is checked again after each fix.
- **Two places called Llandough (30 Oct 2026).** A search of county-journal titles found that two of the three articles headed "Llandough" concerned the same-named village elsewhere in Glamorgan, not the farm's parish near Penarth; a charter-collection fee entry for "Landochhe" also belonged to the other village. → Why: the place-name matched, so the titles looked relevant. → Rule: standing orders 29 and 39; read the first page or the bounds before citing any "Llandough" source.
- **Paraphrase read as quotation (30 Oct 2026).** Lines cited from a court judgment were checked against its full text: one was accurate, two overstated what the court wrote and one was wrong. → Why: the lines had been paraphrased from memory and summaries. → Rule: standing order 30; quote the exact words from the full text with the reference, and mark inference as inference.
- **A verifier that went blind (30 Oct 2026).** A long-running detached checker stayed alive and kept writing its log, but every request it made was refused, because it carried the identity of the worker that launched it and that worker had finished; an earlier checker launched with captured output vanished with its parent. → Rule: launch long checkers fully detached (their own session, output to a file, no captured pipes) and have them use public endpoints; a helper that needs a task-bound identity dies with that task, so each run relaunches it with its own. Poll the log; a log that stops growing means a dead or blind checker.
- **A cut mail body overwrote the saved one (30 Oct 2026).** The mail ingest saved long messages cut short at about 1,400 characters, and a later state commit overwrote a saved full text with the shorter one. → Rule: refetch a cut body whole by the full-message route; never overwrite a saved body with a shorter one; mark a body that both routes cut as cut, so a person fetches it by hand.
- **Lip-sync drift from the wrong audio cut (31 Oct 2026).** A talking-head intro looked badly out of sync although the render itself was fine: assembly laid in a different cut of the voice (with longer pauses) than the one the lip-sync render was driven by, and started it a fraction late, so the voice drifted up to about 1.4 s behind the mouth. → Why: two cuts of the same line sat side by side and the build picked by name, not by the render's own input. → Rule: assembly uses the exact audio file the lip-sync render was driven by, at the render's own start; measure the offset (cross-correlation of speech against mouth motion) before calling a talking shot done.
- **Identical connected-app requests served from cache (31 Oct 2026).** Repeated identical requests to a connected app returned an earlier answer instead of fresh data. → Rule: make each request unique (a request id or timestamp field the app ignores) and pace calls a few seconds apart; re-read after a write before trusting it.
- **Link rewriting broke a click-to-play video (31 Oct 2026).** A build step that rewrites outside links into archived copies also rewrote the bare embed address a click-to-play script builds the player from (the video id is added only at click time), so play loaded a web page instead of the player. → Rule: link-rewriting and self-containing build steps keep an allow-list of bare embed addresses (not only full video URLs), and a page with a click-to-play video is checked by clicking it after the build.
- **A JSON call answered with a web page (31 Oct 2026).** Mirrored wiki pages threw "Unexpected token '<' … not valid JSON": the self-containing build step sends every outside address to the archive redirect, which answers HTML, and an inline script parsed that answer as JSON. → Why: the rewrite treated a data endpoint like a page link. → Rule: the build classifies data endpoints separately and substitutes an empty JSON answer as a data: address (no outbound request); fix it once in the build tool, not page by page, and check the pages for console errors at 390 px after the build.
- **A partial read API under-reported what the site holds (31 Oct 2026).** A gap check against the catalogue read API missed a record already published, because the API listed only about a third of the roughly 900 evidence records. → Rule: presence checks ("is this already on the site?") use the full evidence index text at /research/evidence/, not the read API, until the API's count matches the index.
- **Connected mail calls refused for the wrong toolkit (31 Oct 2026).** Mail reads failed with a toolkit mismatch because they named the plain mail toolkit while the connected account is the wider workspace account. → Rule: every mail call uses the actions of the toolkit the account was connected under; on a mismatch error, switch the action family, do not reconnect.
- **A loop that skipped quietly for three days (31 Oct 2026).** The documentary loop fired on schedule every six hours but opened no door for three days: each run stopped before rendering, because free disk sat under the run's floor and its spending check added up renders made for other projects. Each skip looked like a normal, quick run. → Why: the gate read a shared meter instead of the loop's own, and a skip was not recorded anywhere a person would see it. → Rule: gate each loop on its own measures (its own spend log, its own disk need); a run that stops before its output logs the reason as a problem the same day, so the problems loop works on it.
- **Soft video from the finishing chain, not the renderer (31 Oct 2026).** Talking shots looked waxy and juddered although the renders were sharp: every cut was conformed from 24 to 25 frames a second (one duplicated frame a second), shared shots were re-cut from the already-compressed published file, and the encode was a quick one-pass that left the size budget unused. → Rule: keep 24 fps end to end; always cut from original renders, never from a published file; use a two-pass encode sized to fill the budget; master the final mix to -16 LUFS with true peak at or under -1 dBTP; and pass a blocking pre-publish gate in which a few frames of every talking shot are looked at before upload.
- **A shared board wiped by a placeholder (27, 28 and 31 Oct, 1 Nov 2026).** Four times an agent replaced the whole shared drafts board with a short placeholder text while its commit message called the change metadata-only; the live board then showed a parse error and zero open drafts until a repair ran hours later. → Rule: never write a placeholder over a shared file; if a file is too large to handle, skip the write and say so; parse the result before committing a JSON file; the repair restores from the last good commit and keeps every row and event, and the bad commit's intent is recorded as an event. The board check now reports a wipe by name instead of a generic parse error.
- **A section push that never went live (31 Oct 2026).** A page pushed to a section branch did not appear on the site, because a push alone does not start the sections workflow and the site build uses the commit pinned in the section lock. → Rule: after pushing to a section branch, run the sections workflow for that section once the main build is clear (it moves the pin and then starts the site build), and confirm the live page before reporting it live.
- **Site search reported false zeros (31 Oct 2026).** The site's search endpoint returned no results for common words that the pages plainly carry, so gaps looked new when they were not; separately, a task-creation call returned success with no readable id, inviting a duplicate. → Rule: confirm absence against the page text itself, not the search endpoint alone; when a create call returns no id, find the record by search before trying again, never create it twice.
- **A link-stripping step broke a data file (31 Oct 2026).** A build step that removes links to an excluded video channel used a pattern whose tail ran past the end of one link inside a JSON file and swallowed the backslash of an escaped quote. The file was invalid from then on, but nothing noticed until a later privacy step rewrote a line in it, re-checked the JSON and failed the whole site build. → Why: the pattern treated JSON escapes as ordinary link characters, and the damage stayed latent until another rule touched the same file. → Rule: any pattern that edits text inside JSON must step over whole escapes (a backslash is taken only as a complete escape such as \/ or \uXXXX); after every rewriting step, parse each JSON file it touched; a check that finds a file already broken before its own step warns and points at the earlier step instead of failing as if it had broken it.
- **A register edit failed lint on rows it never touched (31 Oct 2026).** A pull request adding five clean rows to the published book-findings register failed the repository's agent lint, because the lint reads every line of a changed file and older rows on the main branch carried wording our rules ban. → Rule: run the lint locally on the whole file before opening the pull request; in every cell we write use records, notes, states or gives, write "not checked" for anything not yet checked, and use the site's chronology wording for outside catalogue dates; a verbatim passage stays exactly as printed inside quotation marks, and if the passage itself carries a banned word or an outside date, the register gives the page reference and a neutral paraphrase while the full passage stays in the local ledger.
- **A build step drained the daily platform quota (31 Oct 2026).** A self-containing step in the site build fetched a page from a hosting worker for each of roughly two thousand removed files on every build, and with several builds a day the account's daily worker allowance came close to its cap. → Rule: build steps work from files in the repository, not from live workers; anything a step must fetch is cached per build and skipped when the file is gone; new work prefers the repository and its release files over the hosting platform's worker, key-value and database quotas.
- **Reads through the connected-apps door can be stale (31 Oct 2026).** A read of a task record came back as a cached copy with an old body and an old modified time, so an edit based on it would have overwritten newer text. → Rule: add a fresh cache-busting parameter to every read that comes before a write, and confirm the write from the body and modified time returned by the write itself.

- **A depiction rule widened past its scope and removed a whole period (31 Oct 2026).** A rule written for one early scene ("no villa behind the roundhouse") was applied to later scenes too, and the documentary's Roman period dropped out: the next door opened centuries later. → Why: the rule was read without the scene it was written for, and nothing checked that every period kept a scene. → Rule: standing order 45; a chronology gate checks that every period keeps a sourced scene before any render or door opening, and a rule is never widened so that it removes a period's main evidence.
- **One scene carried two eras (31 Oct 2026).** A finished scene showed one moment and then jumped about four hundred years in its closing clip. → Why: two dated moments were folded into one scene to save a render. → Rule: one dated moment per scene; another dated event gets its own scene, never a caption or an end clip.
- **A task create returned success with no record id (31 Oct 2026).** Creating a task on the task board answered success but carried no id, so a follow-up edit had nothing to point at and a retry would have made a duplicate. → Rule: after a create, find the new record by a search on its creation time (at or after the run's start) and its subject before retrying or editing.
- **A large tree push refused (1 Nov 2026).** Two flywheels pushed a commit whose tree carried the file contents inline (one about 160 KB, one 65 files); the repository bridge refused the request each time with an unhelpful error. → Rule: upload each changed file as its own blob first (base64), then build the tree from the blob ids; keep to the house commit size limits. When an earlier pull request on the same append-only file is still open, stack the next one on its branch and say "merge #N first" in its body, so the two do not conflict at the end of the file.
- **A site-placement rule read as a letter rule (1 Nov 2026).** The rule that quarantined material lives only in Kissed Frogs was written for the website; agents applied it to letter drafts as well and stripped a neutral search-term line from dozens of them, while another seat kept putting it back. → Why: the rule was read without the place it was written for, and two seats edited the same line in turn. → Rule: read each standing order with its scope (site, letters, film); when two seats keep reversing the same line, stop editing, record the conflict and let the decision be made once from the standing orders, then apply it everywhere.
- **Long task bodies read short (1 Nov 2026).** Reads of task-board bodies through the bridge stopped at 8 KB, and long search answers came back as plain text, so a whole-body write based on such a read would have cut off the end of a draft and its changelog. → Rule: before any whole-body write, read the full body through the record's properties, check its length, keep every changelog line, re-check the modified time just before writing, and confirm after the write that the body grew and the old text is intact.
- **A search register replaced by a stray value (1 Nov 2026).** A flywheel's list of searches already run was overwritten with a single address string, because the same variable name was reused for something else during a run. → Rule: load a register under its own name, keep its list under one fixed key and never reuse that name; when a register is damaged, rebuild it from the findings and the run log before searching again.
- **A deed read as a registration (1 Nov 2026).** A working note had a woodland parcel registered in a corporation's name in 1961; the register shows the 1961 deed only as a burden on part of the woodland, which stayed with its owner. → Rule: read the register entry itself before saying who was registered; a deed that appears on a title is not a change of proprietor until the proprietorship register shows one.
- **A new page named the project lead (1 Nov 2026).** A newly added section page described the project lead by name as funding the early work; the daily site check caught it and the fix was held until the running site build finished. → Rule: run the privacy name scan on every new section page before it merges, not only on books and the shared pages. Later the same day the project lead set that one page as a named exception in writing; an exception the lead sets is recorded and never reverted by a later check.
- **Video players broken by the link guard (1 Nov 2026).** The build's self-contain step treated embedded video iframes like outbound links and pointed them at the snapshot redirect, so both players on a wiki page failed. → Why: the classifier did not tell a reader-followed link from an embedded player. → Rule: the zero-outbound rule covers links a reader follows; an embed the page is meant to carry passes as an embed (privacy-enhanced host, lazy load, no autoplay); after any change to a link rewriter, check a page that carries an embed at 390 px.
- **A pin that started no build (1 Nov 2026).** A commit that changed only the section lock file started no site build, because the build triggers only on changes under the build's own paths; a build had already been reported as started. → Rule: after a pin, confirm a build run exists for that exact commit before saying it has started; if none, start one once or land a change that triggers it.
- **A name scrub that changed meaning (1 Nov 2026).** An automatic privacy substitution replaced attributions to a named person with a collective "account", which read as a hedge and broke sentences mid-parenthesis. → Rule: a scrub drops or neutralises a name ("testimony (date)"), never swaps in a collective noun; test every substitution rule on real sentences before it ships.
- **A working data file over the commit cap (1 Nov 2026).** The film's working frame file grew past the per-file commit limit. → Rule: the repository carries a generated public projection with only the fields the page reads, built by a script; never trim fields by hand, and keep the full working file local.
- **A restructure left on a branch (1 Nov 2026).** A renumbered scene list sat on a branch while the scheduled film run read the live main, where the chronology gate fails on the old order. → Rule: land a restructure before the next scheduled run that reads it, or hold that run; a gate failure against stale data must never be "fixed" back to the old order.
- **A brief read against the lead's own words (1 Nov 2026).** A brief paraphrased which of two farmhouse images was the original survey photograph and which the enhanced version, the wrong way round; the agent read the project lead's own words and the live captions, did the reverse, and said so in its report. → Rule: the lead's verbatim words and the live page outrank a brief's paraphrase; when you depart from a brief, say why in the report.
- **An error message that was wrong (1 Nov 2026).** A preview publish step reported failure on every call after the first, yet the preview served the newest build each time. → Rule: verify the live result before calling a deploy failed; report a wrong error message as a tool fault, not as a failed deploy.
- **Date chips reversed in a right-to-left language (1 Nov 2026).** In Arabic the scene date chips read backwards (for example 1970–1959). → Rule: pin date ranges, chips and control bars left-to-right inside right-to-left pages, and check every right-to-left language at 390 px.
- **An absence reported that the catalogue disproved (2 Nov 2026).** Asked what the record held about a family member, an agent answered that nothing recorded it; the evidence catalogue already held the record (a 1923 petition entry). → Why: only external text copies were searched. → Rule: for "what does the record hold" questions, search the live evidence catalogue and the e-book chapters first, and only then report an absence.
- **Change alarms from a page timestamp (2 Nov 2026).** The record-change watch marked every heritage record from one outside catalogue as changed on every run for four days, because those pages print the time each page was requested; 32 of 33 public change entries were that stamp alone. → Why: the comparison read the whole page text, volatile lines included, and nobody checked what had changed. → Rule: strip request-time stamps and other volatile lines before comparing, on live pages and on archived copies, and read a sample of each run's "changes" before publishing them.
- **Two headers on a mirrored page (2 Nov 2026).** A mirrored wiki page drew its own old header, menu and search row under the site header (about 190 px of repeated bars on a phone), kept a hosting platform's sign-up bar, and showed archive placeholders where videos should play. → Rule: after mirroring a page, check it at 390 px and 1280 px for duplicate chrome; hide the mirrored header once the site header loads and move its page links into the site menu; content and wording stay unchanged.

