assets/boards/README.md
Creating this directory and docs/art_bibles/ IS the concept-art program's first commit
(docs/proposals/CONCEPT_ART_PROGRAM.md §2.5 step 2). Everything below is the interface contract the
board pipeline and the gate both code to. Nothing here re-rules anything; every rule carries its source.
A DECISION SURFACE, not a mood wall. Three panels, three options per panel, exactly one marked
recommendation per panel, and one pick line. A board with two marked recommendations is a board that
failed to decide, and the deterministic gate rejects it (REALM_DESIGN_PROGRAM.md §3.2).
*This is the 3-PANEL shape. The other shape is the LEAF (next section): one density class, one row
per subject, one recommendation and one pick PER ROW. Both are decision surfaces and both refuse to
carry two recommendations for one decision; they differ only in whether the decision's unit is a
panel or a row, and board_shape on the manifest row is what says which.*
accurate option.
registry's own id space so a pick is an APPLY and not a re-authoring pass.
A 3-panel establishing board rules ONE subject at ONE density class. It cannot own a candidate sweep
across eight classes and nineteen subjects, and on 2026-08-02 it was asked to: 76 lane-G plates were
hung off BRD_0001 under nineteen invented panel values at option indices 1-4, against a manifest
row declaring panel_count=3 and options_per_panel=3. Nothing failed, because T-SHAPE reads the
manifest's own two numbers and every high-value tooth is keyed on the literal panel A or B — so
the five teeth that carry this program's rights and care discipline were exempt on 76 of 91 plates.
That is the repo's own "a search that cannot match reports zero" class, reproduced inside the board
gate.
The ruling, and it is structural rather than a patch:
each with its OWN MANIFEST.csv row — its own density_class_id, subject_canon_id,
board_shape, generation_class, care_tier, critic verdicts and pick columns — and its own
canon_scope in its content.json. A leaf that realizes creature rows is a creature leaf; a leaf
that realizes boss rows is a boss leaf. They are different boards because they answer different
questions and carry different care duties.
BRD_0001 returns to its 3-panel 15-plate shape. It is the flores_island region establishingboard (D1-01) and it holds fifteen plates: Panel A nine, Panel B six. The lane-G rows move to their
own leaves with their own board_ids. This also repairs the arithmetic — 91 plates on a 15-plate
board made T-PLATE-COUNT meaningless — and it stops a region board asserting character and boss
coverage that its own pending reasons say belong to other sheets.
PLATES.csv gains a stage column: draft · review · hero. Four seeds on one subject are the DRAFT stage of ONE plate, not four finished plates; recording them complete inflates every
downstream count by roughly 4x against floors that count finished work. generation_status then
reads "complete AT THIS STAGE", which is the only reading under which a candidate sweep and a
delivered plate are not byte-identical from the outside. The full column set and the rest of the
discipline are docs/CONCEPT_ART_PRODUCTION_PROGRAM.md §3.2d and §3.2e.
density_class_id must equal its board's. A leaf whose plates span eight classesis not a leaf; it is the thing this ruling exists to make unrepresentable.
Josh, twenty-fourth sitting 2026-07-29, verbatim: "Web page boards, and I'd like to keep those private
and eventually after everything's been selected even use it for marketing material."
public until every pick is made. The realm charter's no-published-form rule is honored by privacy
rather than by locality.
versioned in-repo. A pick that lives only on a web page is not canon.
stay barred from boards entirely (their licences do not clear marketing reuse, which is a licence
fact and is untouched by the previz amendment below). *The "private through selection" clause and
the "a previz_only plate can never enter the marketing set" clause were both narrowed by Josh's
thirty-first-sitting site ruling — see "PREVIZ IS LAWFUL" and "The site is a QUERY" below. The
BOARD pages stay private; the SITE is public and is a different surface.*
"Exactly one marked recommendation per panel, and one pick line" is the law for a 3-panel board and
it does not map onto a leaf of nineteen subjects. A leaf's unit of decision is the ROW, so its
recommendation and its pick are row-grain:
recommended_candidate, picked_candidate, picked_at and an amendment slot — exactly one recommendation per ROW, enforced the way exactly one per PANEL is
enforced today. The board's pick line becomes a COMPLETENESS ASSERTION over that table: the leaf
is picked when every row is.
T-ONE-REC therefore reads the grain the board's own board_shape declares — panel grain for the3-panel shapes, row grain for candidate-shaped leaves. One tooth, two grains, keyed on declared
data rather than on which shape the author had in mind.
docs/CONCEPT_ART_PRODUCTION_PROGRAM.md§2.4: recommended plate at full page-width, alternates as a collapsed strip, the entity's canon id
and its [SRC:] anchor visible as text, one approve control and one comment field). This section
only states that the DATA behind that page is row-grain too, rather than a board-grain cell
pretending to summarise nineteen decisions.
One board at a time until roughly 90 percent first-pass approval, then all remaining at once
(§2.6). The trailing window is ten reviewed boards, so the gate needs nine of the last ten taken
first-pass. first_pass_rate = boards_with_zero_regenerations / boards_reviewed is a query over
MANIFEST.csv, which is why regeneration_count and approval_state are columns and not memories.
docs/art_boards/
README.md this file
MANIFEST.csv one row per BOARD
PLATES.csv one row per PLATE
RECS.csv one row per DECISION ROW — the recommendation and the pick
REC_REASONS.csv one row per DECISION ROW — the vision review's evidence
<subject>/<board_id>/
content.json the authored content — the only hand-edited file
board.html the private web page (GENERATED, do not hand-edit)
board.md the in-repo mirror (GENERATED, do not hand-edit)
RECS.csv and REC_REASONS.csv are two tables and not one for the same reason MANIFEST and
PLATES are. RECS carries the DECISION the board records — one recommendation, one pick, one
amendment per row — and it is the table T-ONE-REC reads, so its recommended_candidate must sit in
the row's own option_index space (2, never O2). REC_REASONS carries the EVIDENCE a review gave
for that decision — row_verdict (PICK_READY / MIXED / REGENERATE_ALL), the one-line reason,
and the defects line — and it is re-written every review round while a pick is not.
harness/boards/render_board.py consumes both: the recommended candidate is marked on the row and
its reason printed beside it, and a row whose verdict is REGENERATE_ALL prints its regeneration
note and suppresses the recommendation, because a seated cell on a sent-back row is a placeholder the
gate requires and not a judgement anyone made.
Two tables and not one, deliberately: a flat table would carry the board's approval state on every
plate row, so a 15-plate board would hold fifteen copies of one pick — the exact duplicate-header and
short-row defect class this repo has already been bitten by. Splitting board from plate keeps the
approval single-sourced (§9.3).
Plate BINARIES never enter this repo. PIPE_ART rules "Nothing binary enters the canon repo; promoted
plates enter as manifest rows + hashes only." asset_path resolves under HUMANITY_ART_ROOT
(default E:/art/boards) at the ruled content-addressed form
<class_id>/<canon_id>/<plate_role>__<hash12>.<ext> — the density class, then a LIVE primary key in
that class's key_registry (docs/concept_art/density_model.csv), then the role and the first
twelve characters of generation_prompt_hash. docs/proposals/CONCEPT_ART_PROGRAM.md §4.5 was
superseded in place on 2026-08-03 to this form; the law it implements is
docs/CONCEPT_ART_PRODUCTION_PROGRAM.md §3.2, and harness/check_art_pointers.py (GATE 43) is the
tooth. The <subject>/<board_id>/ path above is the BOARD PAGE, not an asset address. Rejected
outputs go to E:/pipe_archive/ and are kept, never deleted — a rejected asset is the QA gate's
evidence, and under content addressing a regeneration physically cannot overwrite one.
|. Never : — critic_verdicts carries : inside each token. | is the separator the live registries already use (care_duty_tokens, decay_law_binding).
own_capture, museum_open_access, public_domain, licensed, generated_local, previz_only.
generation_class is living or unsettled must carry a rights value in that set. This reads generation_class, never
care_tier — the §3.3 field split, and the highest-value tooth in the gate.
previz_only is barred from PROMOTION AND FROM THE ART BIBLE — **narrowed from the unconditional existence bar on 2026-08-03; see "PREVIZ IS LAWFUL" below.** A previz_only plate may exist on a
board and may publish with its directional label visible; what it may never do is be PICKED, enter
an art bible, or reach a ship path. Panel A is fenced by T-PANELA-PREVIZ and every other panel by
T-MARKETING; both now read the narrowed rule, and both FAIL a previz_only row whose
directional_label is empty. Two teeth rather than one only so a single defect is never reported
twice.
rights_value IS A COMMITTED ROUTING CLASS, not an observation. A plate routed to museum_open_access may only be filled from that class; filling it from another is an amendment,
and the amendment changes generation_prompt_hash and therefore fires regeneration_required.
This is what lets the gate refuse a Panel-A row that is routed to generation before a single image
is acquired.
image_use_class is the IMAGE-side permission, and it is not the same field as generation_licence_ref — that one is the C-12 MODEL licence and reads n_a_lane_r on every Lane-R
plate, because no model ran. §3.4 rules the licensed rights value as "licensed (WITH THE LICENCE
IDENTIFIED)", and until this column existed there was nowhere on the row to identify it. It is the
image-lane analog of the book-substrate lane's use_class field, which §3.4 names as the precedent
to copy rather than invent. Grammar is TOKEN or TOKEN:<identifier> — the shape critic_verdicts
already uses, so no new punctuation. The closed vocabulary, each token carrying its ruling:
OWN-CAPTURE (§4.2a, zero marketing ambiguity) · PUBLIC-DOMAIN (§3.4, no licence subsists) ·
OPEN-ACCESS:<institution> (§4.2a — a museum's open-access grant is NOT automatically a marketing
grant) · LICENSED:<licence> (§3.4, the licence identified) · REFERENCE (carried over verbatim
from the book lane — held for internal reference, may inform a brief, NEVER reproduced; this is what
an owned magazine run actually is) · GENERATED-CLEAN-WEIGHTS (§4.3; the weights licence itself
stays in generation_licence_ref) · PREVIZ-ONLY (§3.4/§4.2a, internal only).
T-IMAGE-LICENCE fails a row whose rights value needs a permission class and whose
image_use_class is empty, names a class without naming the grant, uses a token outside the
vocabulary, or contradicts the rights value.
marketing_eligible is COMPUTED from the licence classes of the board's plates. The manifest cellis a CACHE of that derivation, kept so the marketing set stays a query over one table, and
T-MARKETING-COMPUTED fails any disagreement between the cell and the computed value — which is
what makes "computed, never asserted" true of the artifact rather than only of this sentence. It was
declared computed and was in fact hand-typed, and nothing checked it. A board computes TRUE only if
EVERY plate carries a rights value that clears marketing reuse: own_capture, public_domain,
generated_local. museum_open_access is deliberately not on that list (§4.2a: "a museum's
open-access grant is not automatically a marketing grant"), nor is licensed, which clears only
within its own terms. A board with no plate rights computes FALSE — nothing has cleared anything.
marketing_clear is the PLATE-GRAIN computation the public site reads, and it is computed, never stored by hand. A plate computes TRUE only if all three hold: its rights_value is in the
marketing-clear set (own_capture, public_domain, generated_local), the reveal firewall passed
for that row, and — if it is previz_only — its directional_label is non-empty. Board-grain
marketing_eligible stays exactly as it is; the two live side by side because the board question
("may this whole board be reused?") and the site question ("may this one image be published?") are
different questions, and the ruled site architecture is plate-grain.
is_private starts TRUE and only the marketing pass may flip it.Josh ruled the public marketing site in the thirty-first sitting, and the ruling is quoted verbatim
in docs/spine/DECISIONS_PENDING_JOSH.md:
"And access lock don't lock, no one knows my game yet and the concept art is great marketing,
should do a webpage for each region, and a subpage for each type of asset and aerial etc."
and, in the same entry: *"Tier honesty rides the public surface: PREVIZ_DIRECTIONAL plates publish
WITH their directional label visible (WIP concept art is normal studio marketing; the reference pass
revises them); reveal-gated content never publishes."*
That ruling and this file's old unconditional bar could not both be true. A previz_only plate
needs licence_class: previz_only in its hash payload for the C-12 demotion equation to fire and
rights_value: previz_only on its row for the licence posture to be honest — and both were the
exact tokens T-MARKETING failed on sight. So the tier could not be represented at all, while the
standing ruling required it to publish. Option B is taken:
previz_only plate may sit on a board and may publish. It may never be picked, never enter docs/art_bibles/, and never reach a
ship path — previz_only: true in its licence record is what the importer refuses.
directional_label is MANDATORY on any previz_only row. Non-empty, and rendered on thepublic page beside the image. That is the "tier honesty rides the public surface" clause made into
a column, so honesty is a property of the table rather than of whoever builds the page.
licence_class folds into generation_prompt_hash,so a model demoted from SHIPPABLE to PREVIZ_ONLY changes every filename and fires
regeneration_required by itself. Narrowing the bar does not soften that; it is what makes the
narrowed bar enforceable instead of aspirational.
museum_open_access still does notclear marketing reuse. Designer-facing canon refs and care registers stay on the board pages and
never reach a gallery page.
The public site (a page per region, subpages per asset and view type) emits ONLY rows whose computed
marketing_clear is TRUE. It never iterates PLATES.csv, and it never walks E:/art/boards.
museum_open_access plate and a reveal-gated plate one loop iterationaway from a public page. A query cannot: a row that does not compute clear is not in the result
set, so the ruling enforces itself and the site is structurally incapable of publishing what the
rules forbid.
is_private false AND marketing_eligible true AND writeback_status applied. Publishing a board and publishing a
plate are two different gates, and neither one satisfies the other.
docs/FACTORY_CONTRACT.md).The ruled medium is a web page that reaches a phone, so a board is published as a DEFAULT-PRIVATE
artifact page and its address is written back onto the manifest row's published_url. Two rules keep
a re-publish from reading as a different board:
published_url when re-deploying, or a conversation that did not originally publish the board mints a new address and published_url goes
stale — the row would then point at a board nobody is reading.
🏝️ for BRD_0001 and does not change on a re-publish. The browser tab icon ishow a reader finds the board again among open tabs; a changed icon reads as a new page. Record the
emoji here per board rather than re-choosing it, because a re-publishing session cannot read back
what the last one used. Pick a new one only if a board's whole subject changes.
python harness/read_boards.py # gate every board (0 pass · 1 fail · 2 unreadable) python harness/read_boards.py --board BRD_0001 # gate one python harness/read_boards.py --self-test # the must-fire / must-not-fire fixtures (3 = broken) python harness/boards/render_board.py --board BRD_0001 # re-render html + md from the rows python harness/boards/make_fixtures.py # regenerate the self-test fixture tree
read_boards.py is registered in the run_gates.py roster as boards. It gates PRESENCE and SHAPE
only and never CONTENT: whether a plate is beautiful, authentic, physically coherent, timid or slop
is the four adversarial critics' verdict, downstream, always.
Cultural authenticity (calibrated BOTH ways — care-tier inflation is a defect by ruling, and a critic
that only ever pushes toward restraint produces reverent empty places), physics coherence, AAAAA
de-slop with the unlabeled-relabel test run literally, and reveal discipline. A NO-GO regenerates the
board; Josh never sees a board that failed a floor. The gate refuses to let a published /
awaiting_pick / picked board carry a NO-GO verdict, or be missing any of the four.
| board | subject | class | shape | state | picked |
|---|---|---|---|---|---|
| BRD_0001 | flores_island (Ch 2) | D1-01 Region key art | place_3panel (3 x 3, 15 plates) | picked | A2 + A1 dressing (Josh 2026-08-06) · B2 · C-SQ-1 +3 consequence-cards (director 2026-08-11) |
| BRD_0002 | flores_island (Ch 2) | D1-02 Mood / lighting / weather sets | leaf_candidate_sheet (3 rows x 4, 12 plates) | critics_running | — |
| BRD_0003 | flores_island (Ch 2) | D1-03 Layouts - climactic sites | leaf_candidate_sheet (12 rows x 4, 48 plates) | critics_running | — |
| BRD_0004 | flores_island (Ch 2) | D1-04 Layouts - ordinary sites | leaf_candidate_sheet (12 rows x 4, 48 plates) | critics_running | — |
| BRD_0005 | flores_island (Ch 2) | D1-08 Civic monuments and public art | leaf_candidate_sheet (12 rows x 4, 24 plates) | critics_running | — |
| BRD_0006 | flores_island (Ch 2) | D1-09 NPCs - named persona | leaf_candidate_sheet (5 rows x 4, 20 plates) | critics_running | — |
| BRD_0007 | flores_island (Ch 2) | D1-11 NPCs - antagonist operatives | leaf_candidate_sheet (6 rows x 4, 9 plates) | critics_running | — |
| BRD_0008 | flores_island (Ch 2) | D1-13 Bosses - main | leaf_candidate_sheet (6 rows x 4, 24 plates) | critics_running | — |
| BRD_0009 | flores_island (Ch 2) | D1-14 Bosses - sub and environmental | leaf_candidate_sheet (9 rows x 4, 36 plates) | critics_running | — |
| BRD_0010 | flores_island (Ch 2) | D1-15 Creatures and fauna - species base | leaf_candidate_sheet (12 rows x 4, 48 plates) | critics_running | — |
| BRD_0011 | flores_island (Ch 2) | D1-16 Folklore and mythological beings | leaf_candidate_sheet (11 rows x 4, 35 plates) | critics_running | — |
| BRD_0012 | flores_island (Ch 2) | D1-26 Equipment and carried objects | leaf_candidate_sheet (4 rows x 4, 16 plates) | critics_running | — |
| BRD_0013 | flores_island (Ch 2) | D1-29 Familiars | leaf_candidate_sheet (5 rows x 4, 20 plates) | critics_running | — |
| BRD_0014 | flores_island (Ch 2) | D1-37 Inscription and script glyph plates | leaf_candidate_sheet (4 rows x 4, 16 plates) | critics_running | — |
| BRD_0015 | flores_island (Ch 2) | D1-40 Vril sites | leaf_candidate_sheet (11 rows x 4, 44 plates) | critics_running | — |
| BRD_0016 | flores_island (Ch 2) | D1-03 Layouts - climactic sites | leaf_candidate_sheet (5 rows x 4, 20 plates) | critics_running | — |
| BRD_0017 | flores_island (Ch 2) | D1-04 Layouts - ordinary sites | leaf_candidate_sheet (12 rows x 4, 30 plates) | critics_running | — |
| BRD_0018 | flores_island (Ch 2) | D1-04 Layouts - ordinary sites | leaf_candidate_sheet (12 rows x 4, 12 plates) | critics_running | — |
| BRD_0019 | flores_island (Ch 2) | D1-04 Layouts - ordinary sites | leaf_candidate_sheet (12 rows x 4, 21 plates) | critics_running | — |
| BRD_0020 | flores_island (Ch 2) | D1-04 Layouts - ordinary sites | leaf_candidate_sheet (11 rows x 4, 20 plates) | critics_running | — |
| BRD_0021 | flores_island (Ch 2) | D1-06 Dwelling variation within a settlement | leaf_candidate_sheet (5 rows x 4, 5 plates) | critics_running | — |
| BRD_0022 | flores_island (Ch 2) | D1-08 Civic monuments and public art | leaf_candidate_sheet (4 rows x 4, 4 plates) | critics_running | — |
| BRD_0023 | flores_island (Ch 2) | D1-09 NPCs - named persona | leaf_candidate_sheet (12 rows x 4, 18 plates) | critics_running | — |
| BRD_0024 | flores_island (Ch 2) | D1-09 NPCs - named persona | leaf_candidate_sheet (10 rows x 4, 22 plates) | critics_running | — |
| BRD_0025 | flores_island (Ch 2) | D1-10 NPCs - ambient crowd buckets | leaf_candidate_sheet (12 rows x 4, 48 plates) | critics_running | — |
| BRD_0026 | flores_island (Ch 2) | D1-10 NPCs - ambient crowd buckets | leaf_candidate_sheet (2 rows x 4, 8 plates) | critics_running | — |
| BRD_0027 | flores_island (Ch 2) | D1-15 Creatures and fauna - species base | leaf_candidate_sheet (12 rows x 4, 48 plates) | critics_running | — |
| BRD_0028 | flores_island (Ch 2) | D1-15 Creatures and fauna - species base | leaf_candidate_sheet (4 rows x 4, 16 plates) | critics_running | — |
| BRD_0029 | flores_island (Ch 2) | D1-19 Foliage and biome dressing sets | leaf_candidate_sheet (7 rows x 4, 13 plates) | critics_running | — |
| BRD_0030 | flores_island (Ch 2) | D1-36 Cinematic key frames | leaf_candidate_sheet (12 rows x 4, 36 plates) | critics_running | — |
MINTED 2026-08-03 by the art remediation migration, which is the migration the leaf ruling above orders. All 76 lane-G candidate plates moved off BRD_0001 onto the fourteen per-density-class leaf boards, BRD_0001 returned to its 3-panel 15-plate shape, every plate was re-keyed onto a live canon id and re-hashed against the corrected closed payload (so every filename changed and every pre-migration file is kept at E:/pipe_archive/art_boards/), and each plate gained a per-artifact licence record under docs/licence_records/art_boards_plates/. The row-grain decision surface is RECS.csv; every recommended_candidate on it is PROVISIONAL until the REC vision pass runs, and no leaf has run its four critics yet — which is why every leaf sits at critics_running and computes marketing_eligible false.
ART FINAL BUILD 2026-08-03 (the director rulings R-A..R-H plus every finding of the two adversarial critiques). The leaf shape is now ROW-PER-IMAGE: every distinct coverage image is its own leaf row at ROW:<plate_slug> and option_index is strictly the CANDIDATE axis (1..4 seeds of one brief), which is what the landed leaf_candidate_sheet shape rules and what T-SHAPE enforces. Fifteen leaves were minted to hold the rows inside the 12-row cap; no new board SHAPE was minted. Lane-R and refused rows carry no image and appear as pending on their own leaf's canon-coverage block, with the reason and the owning registry on the face of the board. The evidence record is docs/pipeline_review/ART_FINAL_BUILD_2026-08-03.md.