← Red Eagle project hub

Red Eagle · Quality Control · Assurance Report · 3 Sep 2026

Forty-eight controls, and what they still don't catch.

Red Eagle turns primary-source history into screenplay pages and image prompts through a generative pipeline. Its central risk is the one every generative system has: fluent output that is wrong at exactly the same confidence as output that is right. This is the control inventory built against that risk — what is enforced in code, what depends on a person, what fails closed, and the six places where a control is named but not built.

48
Live controls · 8 domains
21
Enforced in code · 27 by a person
4
Output levels · fail-closed
7
Incidents that produced a control
6
Open gaps · one closed same day

Get involved — reader review

Forty-eight controls are not enough on their own; the last one is a reader who disagrees. Members can file notes against any panel, and this is exactly what happens to one — where it lands, what gets a human ruling rather than an edit, and which parts of the route are still gaps.

Feedback action map

What happens to a reader’s note

one-way flow · edit the source, rebuild the output · 10 note categories · 3 reserved

The new hash is cache invalidation: earlier notes are re-checked, never assumed.

The website Built

1A member writes a note

Input capture: the note keeps two pointers, the frame it is about and the exact panel build the member saw.

Captured

2The site triages, the author rules

A daily job proposes accept, decline, or ask, but the machine only advises. Reserved questions skip it and reach the author.

Proposal and ruling live in separate columns: never overwrite your inputs.

Unread → one open port: the author pulls, append only

The boundary, one way Built

One port, one direction

Think firewall with one port: the website cannot reach the project; the author’s machine pulls accepted notes across, and nothing else crosses in either direction.

The project Proposed routing drafted, not yet ruled

3Reserved questions

Accuracy, sequence of events, depiction of people. Questions of fact get a human ruling.

Ends in a ruling, not an edit

3Wording & staging

Captions, staging, composition, pacing. Edits to source files, never to a finished panel.

Patch the source, not the output

3Image faults

First isolate the layer: a bad render is a project problem, a broken page is a site problem.

Re-render

3No home yet

Alt text has no file to land on yet, a real gap, drawn as one. “Something else” is re-sorted first.

No landing yet

Where a note lands, four tiers

SourcesWhat happened, and how we know.
InterpretationWho was where, in what state.
The pageThe writing.
The renderCompiled output, never hand-edited.

Layered design: each tier is derived from the one above it. Edit as high as the note requires, then rebuild everything beneath. Accepted is not applied.

The rebuild Built

  • An edit landsEdit the single source of truth.
  • 4RebuildsDerived artifacts are regenerated, never patched.
  • 5PublishesPublished: a new panel hash.

The “applied” record Not built

No provenance log: accepted and applied are different states that currently look identical.

Fig. A reader’s note never edits the panel it points at. It crosses a one-way boundary, lands on the source file beneath that panel, and the panel is rebuilt from there. That is the rule of any good build system: fix the source, regenerate the output, and let the new hash tell you what to re-check. Three kinds of note are reserved for a human ruling, one kind has nowhere to land yet, and the record that a note was applied does not exist yet. The diagram draws those gaps instead of hiding them.

Register to send notes. Access is by request and takes about a minute. Notes are append-only: your words are never overwritten by a ruling.

Request access

01 — The model never gets the last word

One boundary, held by three layers

Nothing generative here may assert a fact. A model retrieves, arranges, describes and draws; the authority to state something as true, or speak a sentence as a quotation, belongs to an adjudicated register, a gate that only narrows, and finally a named person. Three layers hold that line, and only one of them is code.

Layer 1 · Preventive

Constraints in the artifact

The failure cannot be expressed. Ages are computed from one authoritative birth year, never typed. Attitude comes from a 21-word controlled vocabulary with a legal empty value. Prompts are assembled, never authored fresh.

Layer 2 · Blocking

Gates in the pipeline

Nine executable checks run before anything is called done; three block spend outright. The output gate refuses and never upgrades. Every default lands on the restrictive branch.

Layer 3 · Assurance

Review outside the loop

Dated rounds scored against a 75-point rubric with 13 override conditions, a cross-artifact consistency audit, and adversarial packets sent to a deliberately under-informed second assistant.

The doctrine that keeps the layers separate: five checkers carry the same docstring — “this tool surfaces; it does not judge, and it must never be made to fix.” No automated check may auto-remediate, because a regex cannot tell a stale instruction from a deliberate record of the road not taken. The cost is a queue a human has to clear. The system pays it on purpose.

02 — Control domains

Eight domains, in governance terms

The project's own vocabulary is historiographic. Stated as controls, the mechanisms are ordinary ones wearing period costume.

D1

Provenance & lineage

Four evidence tags at point of entry. Untagged is defined as a defect, not a default.

CANON.md § The four tags

D2

Output gating

A four-level permission ladder that only narrows, and fails closed when its rulebook is unreadable.

_index/verdict.py

D3

Authority & HITL

A five-tier evidentiary order, an L0–L4 build hierarchy, and a written test for what may never be automated.

CANON.md · VISION.md §6

D4

Change control

Append-only decision register, mandatory pre-write snapshots, and a byte-collapse detector for silent overwrites.

_verify/ · 46 snapshot sets

D5

Third-party model risk

A second assistant used for bounded extraction only. Access verified on a held fact, never on content.

DELEGATION_LOG.md · D-29

D6

Ethical constraints

Depiction gated on consultation that has not happened; twelve atrocity beats withheld by a rule no flag reaches.

D-08 · held_atrocity

D7

Evaluation

A 75-point rubric with 13 critical-failure conditions checked before the score, run in dated rounds.

RUBRIC.md · 3 rounds

D8

Measurement integrity

Explicit rules against the metrics that flatter. A gate that passes because it produced nothing to check is not a gate.

INDEX.md §4–5

03 — The output gate

Retrieval permission is not assertion permission

Everything upstream produces candidate text. One module decides what that text is permitted to be. A passage lands at the lowest level it qualifies for, and the module never upgrades.

⛔ REFUSED

May not leave the machine. Fires on a fenced name, a never-speak status, a human page-check recorded as a mismatch, or a missing volume and page.

📄 CITE_ONLY

A pointer to a page: give volume and folio, quote nothing. Where an unreadable register, an unadjudicated status, or OCR damage lands you.

✎ PARAPHRASE

Describable in the machine's own words, never quoted. Today's ceiling for the entire 15,909-record corpus — including passages marked VERIFIED.

🗣 SPEAKABLE

Quotable. Needs a speakable status and a row recording that a person opened the printed volume. That ledger is empty.

The line the module's own docs call the most important in the file: “A VERIFIED register entry does not make the OCR beside it speakable. The register verifies the page; this module has never seen the page.” In governance terms: an approval attaches to an artifact, not to a lossy derivative of it. Most provenance systems get this wrong in exactly this place.

04 — Evidence

Four sets of worked examples

Not exhaustive — the strongest instances of each kind, with the file that implements it and the failure that produced it. Open what you want to check.

AHigh-impact controls — the five doing the most work5

The verdict gate — four levels, one direction

1-ACADEMIC/primary-sources/_index/verdict.py

Decides what a retrieved passage may be used for, evaluating narrowest-first and never widening. A hard fence checks before the register is even read; an unreadable register drops everything to CITE_ONLY; OCR damage patterns demote a passage on sight; and the top level requires a human page-check that no upstream approval can substitute for.

Why it matters: it separates findable from quotable — two privileges most retrieval systems collapse into one, inheriting a source's authority onto a lossy extraction of it. 5/5 self-tests pass; 160 register rows parsed.

Third-party access verified on a fact already held

DELEGATION_LOG.md · D-29, elevated into CANON.md § Sourcing

A delegated assistant's access to a source is gated on metadata already possessed — a page count, a filename — and never on content. The stated reason: a fabricated transcription is exactly what an assistant without the file produces, so asking for content as proof of access proves nothing.

Transfers directly to any sub-model or vendor integration where the counterparty's competence and its honesty fail together.

Refusal before spend, not review after

0-PROJECT/delegation/_bin/plan_generation.py

The generation planner shells out to the drift check and the wardrobe check and exits non-zero before pricing anything. It also refuses on an empty cast, on an uncast name appearing in the action, and on a gated text match. It spends nothing itself by design.

A budget control and a quality control in one: the cheapest place to catch a defect is before the credits are committed.

A withholding class no runtime flag can reach

build_cast_cards.py · held_atrocity

Twelve beats across three units are withheld because canon forbids aestheticising mass killing — and a generative model's default register for a battle is exactly that. Deliberately implemented as a separate mechanism from the consultation gate, so relaxing one cannot relax the other.

Not a gate to be cleared. A boundary. The cleanest example in the system of a control with no override path.

Byte-collapse detection on authority files

_bin/check_knowledge_precedence.py · COLLAPSE = 0.40

Content-hashes the authority set against a baseline and fails on a drop greater than 40% — “an authority file does not lose that much by editing.” It also refuses to re-baseline while failures are outstanding, so the evidence cannot be cleared before it is read.

Documented miss: it would have caught the first overwrite and did not catch the second — a 41% loss sitting at the threshold with no baseline taken. The number is a tuned guess and is recorded as one.
BFrequently found issues — the recurring defect classes5

A search that found nothing, recorded as proof nothing exists

Seven logged instances, named individually in QUOTE_REGISTER.md

The project's signature failure and the one it names most often. Twice it condemned real quotations as fabrications on a single source's silence. Once the search tool itself had never executed since the corpus moved — every absence established with it was a property of the tool, not the archive.

Control produced: a negative finding is a record of one search, never a property of the archive; every query now prints what was searched and what was not, including the volume missing from the corpus entirely.

A rule written down, never enforced

knowledge/DELEGATION.md · check_ledger_presence.py

“Regenerate before every send” was recorded as a standing rule after one incident and failed the first time it was tested. Separately, the builder had warned on all three of a pilot's failure cases on every build for weeks and nobody read the log.

Axiom: a rule a human must remember is not a gate, and a warning in a log is not a guard. Recurring discipline migrates into _bin/ or is understood to be advisory.

The wrongly-resolved reference — silent, and worse than a missing one

staging/PHASE-2b_GENERIC-CUES.md · D-153, D-159

Two character ids — one consultation-gated, one not — shared a display name through a flat, last-write-wins alias map, so an ungated archetype answered for a gated group across eight beats. Separately, one name matched as a substring inside another and cast the wrong person into four beats, one already generated three times.

The precise diagnosis: “the gate did not fail. It was never shown the person.” An unresolved reference is loud; a wrongly-resolved one is silent.

A ruling made, and the mechanism silently doesn't carry it

D-130 · D-149 · D-153 · D-161 and the caption regression

The most common shape of defect in the build layer: a decision is recorded correctly in an authority file, and the code path that should implement it quietly does not. Five separate instances follow this pattern.

Countermeasure adopted each time: move the rule out of prose and into a machine-read field — “an editor rewording a description must never be able to switch a code path off.”

Stale state carried across a session boundary

check_ids.py docstring · QA_LOG.md

A superseded identifier was cited from memory into two live registers; an existing acquisition id was reused for a different document; a correction stamp reading “corrected to the written pages” predated the decision that moved the underlying spine, leaving four wrong ages in the file that tells an illustrator what to draw.

Diagnosis: “the register gets renumbered; the id in your head does not.” Now checked — with the tool stating plainly that it can detect a fabrication but not a collision.
CSelf-corrected — the system catching itself4

The register overturns two of its own condemnations

QUOTE_REGISTER.md · Pass 006

Two quotations had been marked FABRICATED and purged. Both were real. The instrument built to stop fabrication had produced two false positives of its own — and recorded that fact as prominently as it had recorded the original verdicts.

Rule rewritten: a FABRICATED verdict now means not found where we looked, and the looking is named. No quotation is condemned on a single source's silence.

A verdict refuted by a volume that was in the corpus all along

Q-34 · refuted 2026-08-25

The finding “no usable Burr–Jackson quotations” turned out to be a search failure rather than an archival fact. The volume had been held the whole time and was never opened for that question; it carries six letters verbatim. The narrow claim survived as a rule — no record exists of anything either man said aloud.

The correction is attached to the original entry, not substituted for it. The register is cumulative and never rewritten backward.

Round 03 finds a condemnation resting on an absence that wasn't one

6-QUALITY-ASSURANCE/rounds/ROUND-03_2026-09-02.md

Ten condemned phrases were re-tested across eleven volumes and all ten stayed absent. One did not: a claim condemned partly for being missing from a correspondence it was in fact present in. The scope ruling that followed made the entry narrower, not looser — the recovered phrase is available only to scenes set after its documented date, and its second sentence remains fabricated.

The round did not edit the verdict. It recorded the finding beneath it and left the ruling to the human principal.

A checker reporting clean while its own build was crashing

_bin/check_cast_drift.py

The drift checker once reported “8 cards, clean” while the reference build it compares against was failing. It now carries a distinct build-failure code, refuses to compare a card to its own previous version, checks in both directions, and shells out for a fresh build to catch hand edits.

Generalised in the project's own words: “a checker that cannot see its own input is worse than no checker, because it converts an unknown into a false assurance.”
DHuman-led corrections — what no gate could have caught4

Five gates green, with a fabricated citation sitting in the register

check_ids.py — written 2026-08-31, after the fact

A superseded identifier was cited into an audit pass and a character bible, and an existing acquisition id was reused for a different document. Every automated check passed. It was caught only because the principal questioned a claim that had been built on it.

The honest reading: the control now exists because a person noticed, not because the system did. And it still cannot detect a collision — it prints each id's definition so a human can see one, and says so in the file.

The one hard factual error on a page

CROSS_ARTIFACT_AUDIT_2026-08-26.md §2.1 → ruled 2026-08-27

An epilogue heading staged a treaty signing in the wrong place — the document was signed elsewhere. The audit surfaced it and explicitly declined to resolve it, marking it as needing the principal's judgment. The ruling restaged the scene around the paper's arrival, so nobody signs anything in frame.

Correct separation of duties: the audit found and framed it; the person decided what the scene becomes.

A file contradicting itself in adjacent lines

A _VISUAL.md frontmatter block · resolved 2026-08-31

One line read appearance_provenance: "[INVENTED] and LOCKED"; the next read locked: false. It survived several review passes because nothing compares a file to itself — the drift checker compares a card to its authorities, never a document to its own contents.

Still open as an audit question: how many other files carry the same shape of contradiction? No control exists to answer it.

A ruling on how the programme may be reported

0-PROJECT/STAGING_PROGRAM.md §5b

The principal ruled out burndown reporting, coverage percentages presented as progress, and framing open decisions as debt — because beats may be removed or changed as depth is added, so beats-closed does not measure success. Separately, a proposed classification field was written but deliberately not applied, because deciding who is classified is the judgment the consultation exists to inform.

An unusual control: a governance rule about how the governance is allowed to be reported — and a blocker held open on principle rather than on effort.

05 — The register

All 54 rows, filterable

Every control with the file that implements it, whether a machine or a person enforces it, and the specific failure it exists to prevent. Rows marked GAP are named controls that are not built or not wired.

☰Open the full control register48 live · 6 gaps
Filter 54 of 54
IDControl & artifactWhat it preventsEnforcementStatus
D1 · Provenance & lineage
PRV-1Four-tag evidence classificationCANON.md § The four tagsAn invented claim aging into accepted fact. Untagged is defined as a bug.HUMANLive. No script validates tag presence.
PRV-2Six-status quotation register1-ACADEMIC/QUOTE_REGISTER.mdA quotation reaching a page unadjudicated.HYBRID~166 ids, 22 passes. ~22 rows unparseable.
PRV-3Never rewritten backwardQUOTE_REGISTER.md §0Silent revision of an audit trail. Reversals stay visible with the correction attached.HUMANConvention, not constraint.
PRV-4Corpus bias disclosureACQUISITIONS.md §0 · provenance.pyA single-perspective corpus read as a neutral one. Every [DOC] currently means one man's papers.HYBRIDDisclosed. The imbalance itself is unfixed.
PRV-5Parse-failure honesty_index/segment.pyA parser's failure read as an archive's silence. Counts print with their failures beside them.AUTOMATED15,909 records; 441 undated, all reported.
PRV-6Coverage report on every query_index/retrieve.py“Searched and found nothing” confused with “could not search.”AUTOMATEDLive. Headnotes detectable in 6 of 11 vols.
PRV-7Asset provenance sidecarsanimation/frames/*_panel.jsonAn unattributable generated image. Model, params, full prompt, prompt hash, image hash, source URL.AUTOMATED46/46. Records that no seed exists.
D2 · Output gating & refusal
GAT-1Four-level verdict gate_index/verdict.pyOCR text mistaken for a quotation. Never upgrades; only narrows.AUTOMATED5/5 self-tests; 160 rows parsed.
GAT-2Fail closed on unreadable rulebookverdict.py · load_register()A missing control file read as permission. “A missing rulebook is not permission.”AUTOMATEDLive, self-tested both directions.
GAT-3Consultation name fenceverdict.py · MUSCOGEE_FENCEA gated name leaving the system pre-consultation. Checked before the register is read.AUTOMATEDOver-broad, no override. Cannot catch an unwritten name.
GAT-4Whole-scene blockingbuild_cast_cards.py · D-08 gatePartial compliance. “A scene is not partially generable.”AUTOMATEDLive. Draft flag narrows it; omitting restores.
GAT-5Unreachable withholding classbuild_cast_cards.py · held_atrocityA model rendering mass killing in its default register. No flag touches it.AUTOMATED12 beats, 3 units, no override path.
GAT-6Hidden-state suppressionSTAGING_SYSTEM.md §2aA concealed motive being illustrated and thereby revealed. Only the observable consequence ships.AUTOMATEDBlanket exclusion; the routing field is populated on ~18 of 155.
GAT-7Prompt sanitisation, fail-closedbuild_cast_cards.py · strip_tags / WORKTALKInternal metadata reaching a model as a thing to draw. A sentence about the work is dropped whole.AUTOMATEDLive; 76 tags were leaking before it.
GAT-8Pre-spend refusal_bin/plan_generation.pyPaid generation against stale or self-contradictory inputs.AUTOMATEDLive. Spends nothing itself.
GAT-9Refuse rather than inferretrieve.py · persona.pyA parse failure masquerading as a fact. “Refusing to guess.”AUTOMATEDLive in both modules.
D3 · Authority & human-in-the-loop
AUT-1Five-tier authority orderCANON.md § Authority orderSource conflicts resolved by whichever was read last.HUMANLive. Tier 1 is read-only by rule.
AUT-2Build hierarchy L0–L4CAST_CARD_PROGRAM.md §1Hand-edits to generated files diverging from source. Edit the bible and rebuild.HYBRIDBacked by drift detection. L0 (the page) outranks L1.
AUT-3Automation-boundary testVISION.md §6Automating a decision whose errors are undetectable. Expensive and silent → a human catches it.HUMANFour categories named, incl. one never automated.
AUT-4Explicit sign-off queueOPEN_DECISIONS.md · QUEUE blockA decision needing the principal lost in a chronological log.HYBRIDLive — with 2 duplicated ids and 4 stale closed rows.
AUT-5Tier discipline / load pathCANON.md § Tier disciplineWork built on material never established upstream.HUMANStated; breached — pipeline stages 1–3 bypassed.
AUT-6Consumer interface restriction4-PRODUCTION/cast/AGENT_PROTOCOL.mdTwo agents reading one authority and reaching two answers. Exactly two files per unit.HUMANProtocol-enforced, not sandboxed. Weakest class here.
D4 · Change control, integrity & recovery
CHG-1Rejected-write stop rulePROJECT_INSTRUCTIONS.md §7Concurrent-edit loss. Never pass force; read the newer version and merge.HUMANWritten after two same-day incidents.
CHG-2Mandatory pre-write snapshots0-PROJECT/_verify/Irreversible edits in a project with no commit history.HUMAN46 snapshot sets. Not a substitute for VCS.
CHG-3Byte-collapse detectorcheck_knowledge_precedence.pyA silent authority-file overwrite. Fails above 40% loss; refuses to re-baseline while failing.AUTOMATEDMissed a 41% loss at the threshold.
CHG-4Cast-card drift detection_bin/check_cast_drift.pyA generated artifact silently diverging from its authorities.AUTOMATEDLive. Structurally blind to the governance tier.
CHG-5Identifier resolution_bin/check_ids.pyA citation to nothing. Every id must resolve to its owning register.AUTOMATEDLive. States it cannot detect a collision.
CHG-6Stale-instruction sweepcheck_closed_decisions.pyDocuments still arguing a settled decision.AUTOMATEDFound 11 stale files; reported clean on wreckage once.
CHG-7Computed ages, never typedCAST_INDEX.md R1 · check_age_spine.pyOne person aging inconsistently across scenes.AUTOMATED0 mismatches; visual sheets still breach the rule.
CHG-8Immutable release freezeDRAFT-01_FROZEN_2026-09-02/A shipped version quietly improved. SHA-256 on all 94 files.AUTOMATEDSealed. “A frozen draft that gets tidied is not a record.”
CHG-9Redistribution boundary.gitignoreLicensed primary sources redistributed by a repository.AUTOMATEDLive. Also excludes 5 guard scripts from VCS.
D5 · Third-party & delegated model risk
DEL-1Access verified on a held factDELEGATION_LOG.md · D-29A delegate fabricating results for a source it never received.HUMANLive, elevated into canon. Most transferable control here.
DEL-2Scope fence on delegable workDELEGATION_LOG.mdJudgment leaving the system. Every quotation verdict stays in-house.HUMANLive. Delegate reaches no local file, ever.
DEL-3Staged disposition of returnsdelegation/returned/ RAW + DISPOSITIONA delegated finding applied before it is assessed.HUMANLive, after fabricated findings stood ~1hr in 4 files.
DEL-4Falsifiable negativesknowledge/DELEGATION.mdAn unfalsifiable “no hits.” Enumerated verdicts with expected counts.HUMANLive. Four return-failure modes tracked.
DEL-5Export sanitisation gate_bin/build_exchange.pyLeaking internal reasoning to an external reviewer.AUTOMATEDLive. Refuses to write on any leak.
D6 · Ethical & consultation constraints
ETH-1Pre-production consultationD-08 · CANON.md · INDEX.mdCultural material depicted without the community's involvement.HYBRIDOpen and disclosed as open. Not a gate — a precondition.
ETH-2Placeholder-name disciplineCAST_INDEX.md R2A provisional name hardening into a fact. Ids are opaque; a name must never be the key.HYBRIDLive. Never invent a name for a real person.
ETH-3Persona capability refusedASSESSMENT_AJ-CHATBOT §4A generative persona speaking for a people in their conquerors' words. Tier 3: do not build.HUMANRuled before the capability existed, not after.
ETH-4Third-party content classificationsource-ip/SOURCE_INDEX.md §2Secondary media treated as evidence. Ten videos classed not sources.HUMANClassified; licenses still unrecorded.
D7 · Evaluation & independent review
EVL-175-point rubric with overrides6-QUALITY-ASSURANCE/RUBRIC.mdA good average concealing a disqualifying defect. 13 conditions checked first.HUMANRound 1: 66/75. Versions never overwritten.
EVL-2Dated, immutable rounds6-QUALITY-ASSURANCE/rounds/Scores drifting without a record of why. Philosophy changes logged separately from progress.HUMAN3 rounds. Two were re-runs of invalidated negatives.
EVL-3Cross-artifact consistency auditCROSS_ARTIFACT_AUDIT_2026-08-26.mdLayers agreeing with themselves while disagreeing with each other.HUMAN3 gaps fixed in-pass, 9 findings left open.
EVL-4Human page-check ledger_index/PAGE_CHECKED.mdOCR error entering the record as a quotation. One row = one person opened the volume.HUMANEmpty. Verified 3 Sep 2026.
D8 · Measurement integrity
MSR-1Empty-gate invalidationINDEX.md §4A vacuous pass. A gate that passes because it produced nothing to check is not a gate.HUMANStated and self-applied.
MSR-2Denominator disciplineINDEX.md §5Coverage measured against a directory listing rather than the ledger's rows.HUMANLive. Most software coverage metrics fail this.
MSR-3No burndown reportingSTAGING_PROGRAM.md §5bA velocity metric distorting quality work. Beats-closed does not measure success.HUMANLive. A rule about how governance may be reported.
Gaps · named controls not built or not wired
CHG-10Version control.git · commit 1f66deb, 3 Sep 2026The entire class of overwrite incident that produced CHG-1 to CHG-3. Was GAP-1 — the highest-leverage unbuilt control here.AUTOMATEDClosed 3 Sep 2026. 901 files, 17.3 MiB packed.
GAP-2Page-check recordingnothing sets page_checkedWould make the top gate level reachable. The gate reads the ledger; nothing writes to it.NOT BUILTNamed as a small build. First row identified.
GAP-3Intra-document contradiction checkno implementationProse contradicting a machine-read field in the same block. Nothing compares a file to itself.NOT BUILTOne instance found by a person.
GAP-4Tag-presence validationno implementationAn untagged claim — defined by canon as a bug — going undetected.NOT BUILTTwo undefined tag forms now in wide use.
GAP-5Subject-classification fieldstaging/_PROPOSED_IDENTITY_FIELD.mdThe consultation gate keying on wardrobe data, so a covered person can be missed.PROPOSEDBlocked on principle. Four fences compensate.
GAP-6Decision-count floorrecommended, not implementedA checker reporting clean because its input was destroyed.NOT BUILTRecommended 28 Aug. Unbuilt.
GAP-7Rights & permissions assessmentno document existsAn unassessed copyright, privacy or publicity exposure at release.NOT BUILTScored 3/5 for its absence. No owner assigned.

AUTOMATED a script blocks or exits non-zero · HYBRID a machine surfaces, a person adjudicates · HUMAN the control lives in a document and depends on someone following it — which the project itself classifies as the weakest form.

06 — Evaluation

Scored, dated, and re-run when a control turns out to be broken

A 75-point rubric sits deliberately outside the production apparatus, because the internal controls are self-graded by construction. Fifteen categories at 0–5, and 13 critical-failure conditions checked before the score and capable of overriding it entirely. Round 1 scored 66/75 — Strong band, with the two lowest categories scored down rather than argued up.

●The three rounds, and what each was for3

Round 01 — full rubric, full corpus · 26 Aug 2026

66/75, Strong. No critical-failure condition triggered; three given qualified rather than clean status. 119 tracked quotations, 34 caught as fabricated and purged. Six of the project's own false verdicts logged, all from the same cause, and the governing rule rewritten as a result. Five open questions carried forward by name.

Round 02 — re-run of invalidated negatives · 2 Sep 2026

Not a score. A mandated re-run after the search tool was found never to have executed. Four negatives re-confirmed against a 22% larger corpus; one absence held at exactly the same hit count, which the round treats as a strengthened verdict rather than a repeated one. Two leads left unruled by design — “no verdict was edited; these are the principal's to rule.”

Round 03 — purge-list re-verification · 2 Sep 2026

Ten condemned phrases re-tested across eleven volumes; all ten stayed absent. One entry was partly refuted and the scope ruling that followed made it narrower, not looser.

What the review process does not yet have. The rubric's own five-stage process calls for a bias audit run by someone not responsible for the original research, and a red-team pass aimed at disproving the work's central claims from outside. Round 1 rates stage 3 as “running, but not independent” and stage 4 as “partially running” — aimed at process integrity rather than substantive claims. Stage 5 is “not started.”

07 — Known gaps

Six open gaps, and one closed the day it was published

All drawn from the project's own records; none required outside discovery — which is the point. A control programme that cannot name its own gaps is producing confidence, not assurance. The first entry is kept here, closed, rather than deleted: a register that erases its own gaps once they shut is no more honest than one that never listed them.

01No version control, in a project whose worst incidents were overwritesCLOSED

Stood open as the highest-leverage unbuilt control here: a repository initialised with zero commits and 868 files staged, with forty-six manual snapshot folders substituting for it at far higher cost and lower coverage — no snapshot ever contained a cast card, so an entire artifact class had no undo at all. The project's own diagnosis: “git init and a first commit would have made the whole question a two-minute diff.”

Closed 3 September 2026 — commit 1f66deb, 901 files, 17.3 MiB packed.

And closing it found a live breach of another control. The staged index held 139 MB including the Papers of Andrew Jackson text layers and the 26 MB index built from them — material .gitignore already forbade in its own words, “primary sources are not ours to redistribute; a repo is a distribution mechanism.” The rule was written after the original git add, and an ignore rule does not apply retroactively to a path already in the index. The first commit would have shipped the corpus.

The general form, now recorded in the file itself: an exclusion written after the fact is not in force until the index is rebuilt — and the thing to check is git ls-files, not the ignore file. Same failure class the project logs elsewhere: a rule correctly written down, and a mechanism that silently did not carry it.
02The strictest gate has never been exercisedMEDIUM

The human page-check ledger is empty and no tooling exists to write to it, so the top permission level is unreachable and the whole corpus caps at paraphrase. The failure is safe — nothing can be misquoted — but the control is unproven, and an unproven control should not be counted as a working one.

Effort LOW · the first row to create is already identified
03Twenty-one of 48 live controls are automated; 27 depend on someone rememberingMEDIUM

By the project's own axiom — a rule a human must remember is not a gate — nearly half its controls are not gates. Several of the most consequential (never hand-edit below the authority layer; never regenerate from memory; the two-file consumer interface) are prose and prompts, not enforcement.

Effort VARIES · self-diagnosed, unresolved
04The specified pipeline was bypassed and the spec was not updatedMEDIUM

Stages 1–3 — character sheets, location plates, shot specifications — do not exist; the directories are empty. Images were generated from cast cards instead. The result may well be better, but a pipeline document describing a route nobody takes has stopped governing, and its stage gates cannot be evaluated.

Effort LOW · documented drift, not a defect in the output
05The consultation gate keys on an inferred attribute, not a declared oneMEDIUM

Coverage is inferred from wardrobe data, and a covered person correctly has none — so the gate can miss the people it exists to protect. Four compensating fences were added. The clean fix is a declared classification field, deliberately unbuilt because deciding who is classified is the judgment the consultation exists to inform.

Effort BLOCKED ON PRINCIPLE · mitigated, not closed
06Checkers have no input-sanity assertions, so a green result can be unfalsifiableMEDIUM

After an overwrite, four scripts read damaged inputs and reported clean. The project's verdict — “it is not clean, it is blind; a checker that cannot see its own input is worse than no checker, because it converts an unknown into a false assurance” — is exactly right, and the recommended remedy is still unimplemented.

Effort LOW · recommended 28 Aug, unbuilt
07No rights, permissions or privacy assessment existsMEDIUM

Scored 3/5 on the rubric specifically for this, and ten third-party assets have unrecorded provenance. Correct discipline is being observed in its absence — nothing paywalled reproduced, no cultural specifics invented — but the round's own phrasing stands: correct discipline, not compliance.

Effort MEDIUM · open since 26 Aug, no owner assigned
One live finding, offered rather than logged. The sign-off queue that the system declares the single authority on what is open currently contains two duplicated identifiers and four rows marked closed that were never removed. By the queue's own header rule that should be showing as a visible error. Minor — and exactly what a control register is for: the control that tracks everything else is itself untracked.

08 — What transfers

The mechanisms, without the period costume

The subject is a nineteenth-century frontier. The control architecture is not about that at all.

→Eight mechanisms that apply unchanged to any generative system8

Separate retrieval permission from assertion permission

A document being findable and a sentence being quotable are different privileges with different evidence requirements. Most retrieval systems collapse them and inherit a source's authority onto a lossy extraction of it.

Make the tool report what it could not see

A retrieval failure and a genuine absence are indistinguishable at the point of use. Printing scope, exclusions and known holes on every result — especially empty ones — is what stops an empty result being read as a finding.

Verify third-party access on a held fact, never on content

Asking a model to prove it has a document by quoting from it proves nothing — a fabricated quotation is precisely what a model without the document produces. Gate on metadata you already possess.

Fail closed, and say so in the error

Absent policy, absent classification, absent baseline — each defaults to the restrictive branch, and the refusal names which condition fired. A refusal a user can read is a control; a silent restriction is a bug report waiting to happen.

Surface, do not auto-remediate

Automated checks that fix what they find destroy the distinction between a defect and a deliberate exception. The cost is a queue somebody clears; the benefit is that the record stays interpretable.

Refuse a capability before it embarrasses you

A tiered feasibility assessment that approves two tiers and refuses the third on a stated rationale, written before the capability existed — naming the harm and the alternative rather than deferring to a review that never comes.

Count against the real denominator

Coverage measured against what exists on disk rather than what was supposed to exist will always look better than it is, and will hide precisely the items that were never created.

Keep an audit trail that moves in both directions

Reversed verdicts stay visible with their corrections attached, because a pass that only ever tightens is not auditing, it is flinching. A control programme that only ever adds restrictions is not measuring anything.

How this report was produced

The repository was read directly — all six tiers, the governance layer, the executable checks, the interpretive bibles, the staging schema and the QA folder — and the load-bearing claims were re-derived from the live files rather than from the project's summaries of itself. Where the system contradicts its own documentation, the contradiction is printed above rather than resolved silently.

← Red Eagle project hub

Assurance report · Red Eagle · compiled 3 September 2026 against the repository as it stood that day.
Verified live: 19 scripts in _bin/ · 5 in _index/ · 15,909 records in documents.jsonl · PAGE_CHECKED.md empty · the four gate levels and the consultation fence read from source.
Amended 3 Sep 2026: GAP-1 (no version control) closed the same day at commit 1f66deb, and is kept in the register as closed rather than removed. Control count moved 47 → 48 live, gaps 7 → 6.
Reported, not re-derived: round scores and counts, incident byte measurements, tag frequencies — each traceable to the dated file that records it.
Standing disclosure: consultation with the Poarch Band of Creek Indians and the Muscogee (Creek) Nation has not taken place. The work may not be published in its current form, and this document does not represent it as cleared.