Design Memory Platform

Decisions

204 decisions · 19 rebirth · 32 evolved · 113 new
D208 newadoptedInterface25 Jul 2026

The clean AFAL platform: the Species taxonomy, the four-section IA, and the kill list

The six experimental bench sections are edited down to a clean platform information architecture: Species, then Generate, then Presets, then Parameters, then RNG - Generate placed directly under Species by Miles's ruling, because the loop is pick species, generate, examine, adjust, generate. The Species taxonomy is Miles's two-level structure, family then species: Growth (Spiral, Shell, Fern, Tree, Coral), Organisation (Phyllotaxis, Voronoi, Reaction-Diffusion), Surface (Hyperboloid, Minimal Surface, Membrane), Aggregation (Foam, Crystal, Packing), Flow (Meander, Dune, Ripple), Fracture (Crack, Branch Fracture). Planned species stay visible but locked, with the reason stated. THE KILL LIST, ruled item by item at the bench: retired from the clean platform as bench or GAAD-platform apparatus - the 144 world, the entire 1994 Growth Generator section, DEMO, PRESENTATION, Test D197, the Calm/Wild/Extreme modes (reborn as RNG Strength), the Gravity toggle, the Module picker (fixed to Cube), and MEMORY M1-M8. BREEDING is deferred - Miles: 'I have not got this to work so for now its out' - an honest cut, not a quiet one. Kept: Presets and the outside-envelope warning.

Rationale & optionsOptions considered
  • Carry the bench apparatus into the platform and hide it behind an advanced toggle (rejected - the bench sections are instruments for building AFAL, not for using it, and a hidden instrument is still maintenance surface)
  • Edit down to the four-section IA with an explicit kill list (chosen)

Rationale: The bench had grown six experimental sections, a 144 gallery and the Growth Generator - all apparatus for making AFAL work, none of it the platform someone uses afterwards. This is Q044's reduction applied to the interface: the panel gets simpler so the platform can grow. It is also the ruling that produced the day: the clean-panel HTML mockup built to explore this IA is what became the live preview, GLAS and the genome programme. Open within the taxonomy, recorded not resolved: Cone is built but absent from the tree and needs a home; the Growth FAMILY shares its name with the Growth GENE (T032 rules the gene's name; the family may need distinguishing).

P070P071
D207 evolvedadoptedGenome25 Jul 2026

The growth laws are evaluated in float64, once per host; the node graph places modules and does not compute the law

THE CANONICAL RULE IS CORRECTED. Reducing the angle modulo 360 is necessary but NOT sufficient. The index-angle product must be formed without losing precision - in float64, or by exact arithmetic on the integer index - because a modulo applied afterwards reduces the VALUE but cannot recover PRECISION already lost inside the product. THE BLENDER HOST CHANGES. A GLAS-conformant host computes the canonical instance set in float64 - Python, not the geometry-node graph - and uses nodes only to place the module at the computed transforms. Blender's fidelity then becomes float64 against float64 and sits inside the conformance tolerance for every species. NO SECOND EVALUATION PATH. The offered fallback of keeping float32 node evaluation for live viewport feedback, with a 0.1 mm tolerance for the helix species, is REJECTED. A fast approximate path is a second implementation of the growth laws inside the very host being made conformant, which is the drift this whole programme exists to remove, reintroduced one level down. One law implementation per host. If viewport responsiveness suffers, it is solved by vectorising the float64 path, never by re-implementing the law.

Rationale & optionsOptions considered
  • Keep the law in the float32 node graph and widen the fidelity tolerance (rejected - no float32 tolerance is both safe and useful for Phyllotaxis, and a tolerance wide enough to pass it would be wider than the drift the test exists to catch)
  • Float64 Python for Phyllotaxis, float32 nodes for the helix species (rejected - two paths in one host is two implementations of one law)
  • Float64 Python for the law in every species, nodes for instancing only (chosen)

Rationale: The Code Technician measured float32 divergence to size the Blender fidelity tolerance and found a structural fault instead. Phyllotaxis is not float32-viable at bench counts: with the mod-360 rule in place it still drifts 1.79 mm at 200 points and 14.4 mm at 800, and the bench's own EXTREMES demo carries an 800-point bloom, so this is not a corner case. The Specification Owner reproduced the figures independently before accepting them and matched the bench table to two decimal places. The cause is precision, not trigonometry. Phyllotaxis' golden angle of roughly 137.5 degrees makes the index-angle product large within a few hundred points - at index 800 it is 110,006 degrees, where one float32 ULP is 0.0078 degrees, arcing to 19 mm at that radius. The modulo was specified after the product, so it shrank the number without restoring what the product had already thrown away. That is a fault in the rule as written on 25 Jul, found by measurement, and corrected here. The helix species appeared to survive in the PROXY at around 12 micron - a figure the confirmation run below overturned; it is kept here only as the state of knowledge when this ruling was made. Module-scale error is negligible everywhere at roughly 5e-8. Worth recording plainly: the conformance test has not been built yet and has already forced a real architectural improvement in the Blender host. It also vindicates splitting conformance from fidelity in D205 - the fault lived entirely on the fidelity side, and a single blended test would have muddled a host's renderer with the laws themselves. CONFIRMATION RUN, real Blender 5.1.2 output against the canonical float64 law, engine version 8, same evening: the structural finding HOLDS and the proxy was optimistic throughout. Phyllotaxis measures 0.897 mm at 200 points, 7.18 mm at 800 and 321.6 mm at 5000 - about 1.2 times the proxy's figures. THE CONFIRMATION ALSO BROKE A SECOND FINDING. The helix species are NOT float32-friendly in real Blender; that was an artefact of the proxy, which modelled argument precision only and so under-predicted them by two orders of magnitude. Measured at 5000 instances and 30 m radius: Spiral 1.330 mm against a proxy 0.012, Shell 1.330 against 0.012, Hyperboloid 1.308 against 0.012, Cone 0.329 against 0.010 - a factor of about 110 on three of the four. Three of the four helix species therefore breach the millimetre that matters, and the rejected fallback of float32 nodes with a 0.1 mm helix tolerance would have missed by a factor of thirteen. That fallback was rejected on principle before these numbers existed, and the numbers now reject it on their own account. Small cases remain clean - Shell at 220 points and 11 m radius measures 4 micron - so the fault is driven by count and radius together, not by species alone. Scale error is float32 storage noise throughout at around 1.6e-7. SECOND CONFIRMATION RUN, same evening, closed the vertical gap: zResid, the vertical LAW drift, is micron-scale throughout and tracks prediction - Shell 220 at rise 0.03 measures 0.00029 mm, Spiral 5000 at rise 0.03 measures 0.0087 mm and at rise 0.30 measures 0.068 mm. Rise 1.0 measures exactly zero because every z is then an integer, exact in float32. The vertical axis multiplies index by rise ONCE where the angle multiplies index by step and then feeds transcendentals, which is why z stays benign while xy does not. maxXY tracked the first run unchanged, confirming the angle law is independent of Rise. One reporting distinction the bench drew correctly: the engine's constant z offset of minus half the height is gravity centring - PLACEMENT, not law - and was reported separately. The conformance comparison is on law-space output; a host's constant placement transform is declared and excluded. MECHANISM CORRECTED ON MEASUREMENT: the real graph is RADIAN-NATIVE with no reduction anywhere - float32(radians(step)) is inexact the moment it is stored, and that storage error rides up multiplied by the index. A radian-native emulation reproduces Blender to four decimal places, which is the proof. Two consequences sharpen the ruling: no node-graph patch can fix it, since two pi itself is inexact in float32; and the bench now holds a float32 emulator validated to four decimal places against real Blender, so future sizing questions need no Blender round-trip.

P070
D206 evolvedadoptedGenome25 Jul 2026

Comparison happens before rounding; a genome writes only the genes its species uses

THREE RULES, all from the Code Technician's second review. ONE - the conformance test compares UNROUNDED float64 values within an absolute tolerance, not rounded strings. Lengths compare within 1e-9 m, angles within 1e-9 degrees, ratios within 1e-12. Rounding to the stated precision is for writing and reading the file, never for deciding whether two hosts agree. TWO - the module is a GENE, not a top-level field. The instanced unit changes the phenotype, so it belongs in the parameters block that the language defines, exactly like radius or growth. The genome format itself never learns what a module is. The module's GEOMETRY remains out of scope: the conformance test compares instance positions and module scales, and whether a host renders a cube faithfully is a fidelity question (D205). THREE - a genome writes ONLY the genes its species actually uses. Phyllotaxis does not use Twist, so a Phyllotaxis genome carries no twist. The language file is the authority on which genes a species uses. A reader must reject a genome that omits a gene its declared language version says the species needs.

Rationale & optionsOptions considered
  • Compare rounded strings exactly (rejected - rounding is discontinuous, so a value sitting a hair from a boundary flips on a 1 ULP library difference and reports a phantom failure; sin, cos and pow are not bit-identical across V8 and Python even in float64)
  • Compare rounded values within one ULP of the stated precision (rejected - that grants a full millimetre of slack on lengths, which is exactly the size of drift the test exists to catch)
  • Compare unrounded float64 within a tolerance far above library noise and far below the precision that matters (chosen)
  • Write every gene always, inert ones included (rejected - an inert value in the file is a lie about what determines the form, and it is the T032 disease written down: a gene that appears to act and does not, or worse, one a later language version quietly activates)
  • Write only the species' active genes (chosen)

Rationale: The tolerance was sized rather than guessed. One float64 ULP at 30 m is 3.553e-15 m, so a 1e-9 m tolerance sits about 281,000 times above the noise a runtime's maths library can produce and a million times below the millimetre that actually matters to a building. It cannot hide real drift and it cannot manufacture a phantom failure. Comparing before rounding also removes the discontinuity that caused the problem: rounding is a cliff, and any test standing on a cliff edge will eventually fall off it. The module ruling is the language-free principle earning its keep. The format was told never to enumerate genes, and the moment a specific gene needed a home the answer was already written: it goes where the language defines it. No amendment to the format was needed at all. Writing only active genes follows from sufficiency, which already demands that a genome contain what is needed to rebuild the form and no more. The obvious objection - that a later language version might activate a gene the old genome lacks - is answered by the language version already pinned in every file: a genome is rebuilt by the version that wrote it, which is why that field exists.

P070
D205 evolvedadoptedGenome25 Jul 2026

In a genome the parameters are authoritative; the seed is provenance

A genome encodes its form ONCE, in the resolved parameters. A host rebuilds the form from the parameters and never from the seed. The rng block stays in the file but is reclassified: it records how these parameters came to be rolled, and it is the input to BREEDING descendants. It is not part of the rebuild path, so the named algorithm and its draw order sit outside the conformance test and belong to the breeding specification when that is written. TWO TESTS, not one, and they belong to different owners. The CONFORMANCE test is the format's: both hosts compute the derived instance set in float64 by the canonical evaluation order, round to the stated precision and compare exactly - it proves the LAWS agree. The FIDELITY check is a host's own: a host's actually evaluated geometry compared against that canonical set within a stated tolerance - it proves the HOST renders what the genome says. Blender's float32 geometry-node evaluation is a fidelity question, not a conformance one. CANONICAL EVALUATION ORDER is pinned by the format: the rotation angle is reduced modulo 360 degrees BEFORE it is converted to radians and passed to sin and cos.

Rationale & optionsOptions considered
  • Seed authoritative, host re-rolls parameters from it (rejected - it needs the per-species windows, which are not in the file and live in the language file where they are tuned over time, so the same genome would silently mean a different form in a later language version; fatal in a memory platform, where a genome recorded in July must rebuild identically in 2031)
  • Both authoritative, host chooses (rejected - two encodings of one form is how they disagree)
  • Parameters authoritative, seed kept as provenance and breeding input (chosen)

Rationale: The Code Technician's review found the fault: the draft carried both resolved parameters and a seed, encoding the form twice without saying which wins, and that ambiguity decided what the conformance test would actually execute. Sufficiency settles it. The format already requires that everything needed to rebuild the form exactly is in the file; a seed is only sufficient alongside the per-species roll windows, which are language-file property and change as species are tuned. Parameters are inert and dated - they mean the same thing in 2031 as tonight. The ruling dissolves a second bench flag as a side effect: with parameters authoritative, mulberry32 against Python's Mersenne Twister and the exact draw sequence stop mattering for rebuild, and become a breeding problem to be solved when breeding revives. The float32 flag was verified rather than accepted on description. At 5000 instances and 30 degrees a step, one float32 ULP on an accumulated angle of 2618 radians is 2.686 mm of arc at 11 m radius, so 'match exactly to the millimetre' could not have held. Reducing the angle modulo 360 first brings the same case to 0.005 mm, a factor of roughly five hundred, which is why the fix is a pinned evaluation order rather than a tolerance. A tolerance would have hidden real drift; an evaluation order removes the cause.

P070
D204 newadoptedGenome25 Jul 2026

A GAAD genome carries its ancestry; biology's amnesia is not inherited with the metaphor

The lineage block in the genome format is REQUIRED, not optional. A genome carries its own stable id, the id of its parent, the id of the lineage it belongs to, and its generation number. A root genome carries a null parent and generation zero. The ENTIRE evolutionary history is not stored inside each file. Ancestry is DERIVED by walking parent to parent, so the history is complete without every child duplicating its ancestors. The lineage id and generation number are carried as well as the parent so that an orphaned genome, one whose chain is broken by a lost ancestor, still knows which journey it belonged to and how deep in it it sat. This promotes id from optional to required: a parent reference needs something to point at.

Rationale & optionsOptions considered
  • Genome carries no parent, biology-faithful, lineage stored separately (rejected - it makes a genome a specimen, and a design memory platform whose genomes cannot say where they came from has sacrificed its premise for metaphorical tidiness)
  • Genome carries its full ancestry inline (rejected - every child duplicates every ancestor, files grow without bound, and the same history is then stored in as many places as there are descendants to disagree)
  • Genome carries parent, lineage id and generation; full ancestry derived by walking the chain (chosen)

Rationale: Miles ruled it by naming where GAAD parts company with the metaphor it borrowed (Q046). In biology a genome carries the result of inheritance, not a pointer to the ancestor, and ancestry is reconstructed from similarity afterwards. GAAD breaks that on purpose, and the break is the platform: Q043 states the thesis as a journey, and a genome with no parent has no journey, only a shape. The borrowing rule this sets for everything downstream: GAAD takes the MECHANISM from biology - genes, mutation, selection, generations - and refuses its amnesia. It also unblocks the roadmap. Parent and child brought to life, a 2x2 growing to 12x12, and film scenes built in HTML are all lineage work, and all of them were waiting on this answer. F053's export champion gains its best version too, since a champion that reaches Revit carrying its ancestry is design memory entering the industry's model rather than staying inside GAAD.

P070
D203 newadoptedBranding25 Jul 2026

The web surface is the GAAD Glasshouse, abbreviated GLAS

F052, the surface where GAAD's languages grow, is named the GAAD Glasshouse. GLAS is a SURFACE and not a place: it can be hosted on the web, inside Blender, one day inside the GAAD product itself as a commercial tool, and inside somebody else's product too - GLAS-in-Revit and the like. The host is interchangeable and the browser is merely the first of them. GLAS grows and GAAD remembers, which is the line between the two. The name carries no language in it and no qualifier such as preview, demo or beta. Nav label, page and asset naming follow from it. The short form is GLAS. GG is NOT available: it already means Growth Generator across the records (the GG-array collections in F046, the GG RNG windows in Q042, the arithmetic-versus-geometric finding in A0020, the GG twigs in D200, and Miles's own line in P069, 'and GG returns 32 years later'). GLAS also sits in the house style, where four capitals is what GAAD already uses for the things that matter - AFAL, GRAL, PRAL, TWAL, GALF - and it says the word.

Rationale & optionsOptions considered
  • AFAL Live Preview, the bench's working name (rejected - accurate today and wrong by autumn, since lineage, the world grid and film scenes are all coming to the same surface and none of them are AFAL; and 'preview' says not the real one yet when the page runs the real laws)
  • The Growing Room (the Specification Owner's lean - sibling to F031's reading room, plain, needs no explanation)
  • GAAD Live (rejected - says it runs, says nothing about what it is for)
  • GAAD Glasshouse (chosen by Miles)
  • Short form GG (rejected - already means Growth Generator in seven places across the records; two meanings for one abbreviation is exactly the rot a thirty-year record cannot afford)
  • Short form GLAS (chosen by Miles)

Rationale: A glasshouse is a real building type, which suits a platform made by an architect, and it is the building made for growing things - which is what the surface is for, whatever language is running. It is also made of glass so you can see in, which is what a browser is and what GAAD claims about itself: the journey should be legible, not sealed inside a .blend. The name had to survive what is coming. Lineage, a 2x2 growing to 12x12, and film scenes built in HTML are all headed for this page, and a name naming today's first tenant would have had to be thrown away. Q045 settled that AFAL is a testing ground rather than the point, so the name stays language-free by the same rule that keeps GALF engine-free. Miles widened the definition the same evening: GLAS can be on the web or in Blender, and one day GLAS-in-the-product. That makes GLAS the constant across every host GAAD will ever have, with Blender as scaffolding, the web as reach and the product as the endpoint - which is P054's renderer-as-adapter argument one level up. It also carries P054's licence consequence: GAAD as a commercial product is only possible outside Blender's GPL, so a surface that already runs host-free is what makes that road passable. Everything GLAS depends on must therefore be host-free too, which is exactly what D202 requires of the genome and GALF requires of the language files. Miles then named a fourth host of a different class: GLAS-in-Revit. The first three are GAAD's own; Revit is Autodesk's, closed, with its own API, units and geometry kernel, so embedding there demands portability rather than mere host-freedom. It is also the host with the most commercial weight, putting generative form-finding where architects already work, with nothing unfamiliar to install - and it is the ground Miles has led BIM on for twenty years. The scale ruling made the same evening is what makes it practical: building-size objects stated in metres to millimetre precision is BIM's native tongue, not Blender's, so a GAAD genome lands in Revit already speaking the language. The cost to weigh is that every host multiplies the number of places the growth laws are implemented, which makes D202's single genome and its same-file-same-form test more load-bearing with each one, not less.

P070P054
D202 evolvedadoptedGenome25 Jul 2026

The genome is one file and one format, wherever it is written

A genome carries what a form is: its species, its parameters, its seed, and its population count - count is included because D197 puts it in the exponent, so a genome without it cannot be rebuilt faithfully. One schema, carrying its own version number. AFAL at the bench, the F052 web surface and the Navigator all read and write that same file and mean the same thing by it. Neither side may quietly add a field the other does not know. The format stays engine-free in the way GALF already requires, so no Blender-shaped assumption leaks into it. The decision buys a TEST, not only a transport: the same genome opened in both engines must grow the same form, and that comparison can be run rather than trusted. OWNERSHIP, agreed with Miles the same day: the Specification Owner writes the format, because it is a specification and the seat exists to keep it neutral; the Code Technician supplies what a specimen carries at the live bench today, says whether anything specified is impractical, then builds both ends and runs the comparison. Spec, build, verify, rule - the ordinary shape of the work. Sequence: format first, then export, then import. Building the export before the format is settled is how a second format gets born.

Rationale & optionsOptions considered
  • Let the web write its own JSON now and reconcile later (rejected - that is the drift being cured, moved up one level and made harder to see)
  • Adopt the bench's existing specimen shape as it stands (rejected as the whole answer - cheapest, but the shape grew inside Blender and would carry engine-shaped assumptions the web must then honour forever; it is still the input the neutral format is derived from, so nothing is lost)
  • Define one neutral genome format, derived from the existing specimen (chosen)

Rationale: F052 put a second copy of the AFAL growth laws into the world, in JavaScript beside the add-on's Python, and two copies drift. A website showing a form Blender will not reproduce breaks the one promise GAAD makes. The genome file is what ends that, because it makes agreement checkable instead of hoped for. It is also the floor under everything Miles wants next on the web surface: a child is a mutated genome, a stage in a 2x2 or 12x12 world is a genome, and a film scene is a sequence of genomes. None of the lineage, world or film work can start cleanly until the file exists. The concept is not new here and must not be reinvented - D139 already ruled that the remembered circle on the Navigator lineage IS a genome, and AFAL specimens already carry their genes at the bench with count stored beside scale since D197. Curing drift in the laws while inventing a second format for the file would be the same disease one level up.

P070P054
D201 evolvedadoptedWebsite25 Jul 2026

The Records Hub is the one web-facing record view; the per-type timelines retire

On the website, the single Records Hub (gaad_records.html - search box, type-filter row, expandable detail rows) is the only record view a visitor reaches. The six per-type timeline pages (decisions, features, pivotal moments, quotes, terminology, releases) are retired FROM THE WEBSITE: their deployable files become hash-preserving redirects to the Hub, so every existing deep link (e.g. #D197, #F045) still resolves. The homepage records graph dots and the six stat cards now point at the Hub - dots as #<id> which the Hub searches and highlights, cards as #type=<key> which pre-selects that filter. Hash deep-linking (#ID and #type=key) was added to the Hub to carry this. The timeline HTML still generates INSIDE the bundle's Records/ folder because gaad_build.py imports those generators; only the web-facing copies are retired, so nothing in the build breaks.

Rationale & optionsOptions considered
  • Re-chrome the bespoke timeline pages to match the Hub and cut their ~30 category filters (rejected: keeps two record formats to maintain forever, the duplication GAAD exists to remove)
  • Delete the timeline generators outright (rejected: gaad_build.py imports them to write the bundle's own Records/ copies; deleting breaks the build - retire the web output, not the code)
  • Retire the timelines from the website, Hub becomes the single view, redirects preserve old links (chosen)

Rationale: Two faults drove it, both Miles's: the timeline pages carried foreign chrome (different fonts, no site header) so navigating to them jumped/shook the layout (T031), and their filter row had grown to 30-plus per-category buttons. The Hub already fixes both - site chrome, a clean type-filter row, plus a search box the timelines never had - and one source of truth is GAAD's founding instinct, the same reason the diary got one page and one format. Detail is not lost: the Hub's rows expand, and the graph dots now land on the exact record, searched and highlighted.

D200 evolvedadoptedGenerator24 Jul 2026

Growth Generator module: Cube default, Sphere retained

The Growth Generator keeps a Cube or Sphere module choice, with Cube the default and primary module. Miles: 'we can leave sphere in but cube works best'.

Rationale & optionsOptions considered
  • Drop Sphere (rejected: it makes the beaded forms Miles called GG twigs)
  • Keep Sphere with Cube as default (chosen)

Rationale: Cube reads best for the accumulating twisted-blade forms; Sphere strings a growth into beads and is kept for when that is wanted. Sphere arrived in v3_024 and was fixed in v3_025; the fix also exposed and closed a long-masked no-op in the GG value writer. Drafted at the bench as DR-2.

D199 evolvedadoptedConvention24 Jul 2026

Filenames carry descriptive words after the version

Amends D149. From v3_020 onward a prototype version filename carries 2 to 4 descriptive words after the version token, underscore-joined, e.g. afal_prototype_v3_020_gg_memory_frame.py. No spaces: the .py installs as a Blender add-on and the filename becomes its Python module name. The # Filename header carries the same string; the bl_info name keeps only the version. Earlier files are not renamed. Ruled by Miles at the bench: he agreed the underscore form and said 'only new filenames from now'.

Rationale & optionsOptions considered
  • Spaces between the words (rejected: breaks the add-on module name and shell tooling)
  • Underscore-joined words after the version (chosen)

Rationale: The version history reads at a glance without opening each file. Underscores keep the filename a valid Python module name. Drafted at the bench as DR-1 in the first daily handover zip; filed by the Specification Owner per the pipeline.

D198 evolvedadoptedProcess24 Jul 2026

The fourth GAAD seat: Claude Code joins as Code Technician

Claude Code holds the fourth GAAD seat, named Code Technician on Miles's ruling ('Code Technician (working locally ha ha)'). The seat works locally at the prototype bench in 2_Working under the Specification Owner's spec: it builds, verifies with check_blender_script.py before any version reaches Miles, retires superseded versions, and drafts records and diary notes for the daily handover zip. It never files records, never edits language files, never touches 1_Live, never cuts bundles beyond the handover zip, and never touches a .blend. Rulings stay with the Chief Architect; the record trail stays with the Specification Owner, who assigns all numbers. The seat is not a fourth mind: it is Claude on a different surface holding a different job, named as a seat because it is the only actor with write access to the estate, and write access without a named seat is a governance gap. Its standing orders live on the estate itself: CLAUDE.md and BENCH_HANDOVER.md in 2_Working/AFAL.

Rationale & optionsOptions considered
  • Bench Engineer (the working name it carried for its first day; a real title in hardware/electronics; retired on the ruling)
  • Clerk of Works (Miles's joke, briefly misfiled as a ruling and reverted the same hour)
  • Resident Engineer / Site Engineer / Field Engineer (construction titles for the engineer stationed where the work is; Resident Engineer was Claude's lean)
  • Build Engineer / Toolsmith (IT alternatives; Toolsmith from Brooks's surgical team, 1975)
  • Code Engineer (rejected for the collision: the Specification Owner also writes code - what separates the seats is ground, not code)
  • Code Technician (chosen - proposed by Miles himself)

Rationale: The name does the governance by itself: in Miles's industry a technician executes, details and verifies under a professional's direction and never signs the design, which is the seat's remit to the letter. It is also the founder's own first title - GAAD began with the instinct of an architectural technician, and the newest seat extends the same word. The precedent is the film seats: when work needed different hats, seats were ruled for it without touching platform governance. Drafted at the bench as DR-1, the first record to travel the handover pipeline (bench drafts with placeholder ids, Miles carries, the Specification Owner files) - the draft correctly refused to guess record numbers.

D197 evolvedadoptedLanguages24 Jul 2026

Growth is a total end-to-tip ratio, not a per-instance multiplier

AFAL rule s7 is reparameterised. Growth is the TOTAL ratio between the tip instance and the base instance, not the multiplier applied between one instance and the next. The engine derives the per-instance figure as growth^(1/(count-1)) and the geometry rule becomes scale_i = growth^(i/(count-1)). Growth 0.2 therefore means a tip one fifth of base at any Population. Population leaves the exponent: it sets how long a form is and Growth sets how much it tapers. The 0 to 1.0 domain set on 23 Jul stands, and the whole of it is usable at any count, so the three per-mode windows (Calm 0.94 to 1.0, Wild 0.992 to 1.0, Extreme 0.997 to 1.0) collapse into one. Existing specimens convert losslessly with ratio = old_scale^(count-1), Count being stored on the specimen beside Scale. The rejected first route rides along in inverted form: the panel shows the DERIVED per-instance figure, so the compounding is never hidden from the person at the dial.

Rationale & optionsOptions considered
  • Leave s7 as scale_i = growth^i and show the tip scale live in the panel (rejected as the whole answer - honest and cheap, but it makes the coupling visible rather than removing it; kept as a rider, inverted to show the per-instance figure)
  • Leave s7 and bound Growth by the current count (rejected - makes the dial safe but the same number still means a different form at a different Population)
  • Reparameterise Growth as the total end-to-tip ratio (chosen)

Rationale: Growth and Population were not independent. The tip was growth^(count-1), so Population sat in the exponent and one dial meant a different form at every count. Two faults followed. Above 1.0 it ran away, which is why Growth was capped to taper only on 23 Jul. Below 1.0 most of the travel was dead, because a visible tip needed above 0.954 at count 50 and above 0.995 at count 500, which is why three modes had to carry three different windows for one dial. Under a total ratio the runaway cannot return, since a ratio is bounded by definition, and the whole dial is usable at any population. The consequence Miles weighed and accepted is genetic rather than cosmetic: mutating Population no longer changes the taper. Count changes length, Growth changes taper, and the genes stop fighting, which is what makes the crossover landed on 23 Jul mean anything.

D196 evolvedadoptedLanguages23 Jul 2026

AFAL focuses on the singularity - GAAD owns the population, AFAL owns the stage

AFAL Studio's centre of gravity moves from the 12x12 world to a SINGLE STAGE. AFAL's job is to answer one question: given a parameter vector and a stage location, what geometry appears. Everything above that - the grid, the generations, lineage and Backtrack, selection, champions and dead ends - belongs to GAAD and is not rebuilt in AFAL. The 144-stage world is demoted from the whole world to one optional test harness among the grid sizes GAAD already offers, kept for when a spread is wanted. This also settles the question left open on 22 Jul: AFAL is a GENERAL growth framework whose first validated behaviour is the spiral, not the spiral language.

Rationale & optionsOptions considered
  • Keep the 12x12 world as AFAL's primary form and grow capability inside it (rejected - every capability is paid for 144 times, so the honest budget per stage stays tiny, which is why the forms are cubes on a line rather than architecture)
  • Build AFAL's own selection, crossover and lineage so a population can be bred inside the studio (rejected - duplicates machinery GAAD already has and PRAL and TWAL already rely on)
  • Single stage as the working default, 144 retained as an optional harness (chosen)

Rationale: Miles's word: 144 stages was always an odd ball, GAAD can already choose any grid and one day nxn, and when AFAL connects to GAAD only one stage has to work. PRAL and TWAL carry no population machinery of their own; they say what one stage is and GAAD does the rest, so AFAL should be no different. Two things follow. The per-stage budget stops being divided by 144, which is what makes the swappable module, the growth-behaviour library (F044) and the fidelity the nature research needs affordable at all. And it is the shortest route off the T4 ceiling, because T5 is the connector and a connector only ever needs one stage, which is what the engine already is once the world wrapper is removed.

P068
D195 evolvedadoptedBugfix22 Jul 2026

Bug fix: string options_considered char-split in the decisions page and markdown

generate_decisions_html.py iterated options_considered as a list, so the records that store it as a prose string (D149, D150, D168, D169, D187, D188-D194) rendered one bullet per character. Fixed: a string now renders as a paragraph, a list as bullets. generate_records_markdown.py's fmt_list had the same fault (a comma between every character) and now returns strings unchanged. The Records Hub was already correct - its render_value checks the type.

Rationale & options

Rationale: A renderer must not iterate a string as a list. The convention is a list (157 of 178 non-empty), but strings are schema-valid and prose options read as paragraphs, so the renderers handle both rather than forcing the twelve into lists.

D194 evolvedadoptedTooling22 Jul 2026

The language-file renderer is built (A0014): JSON to branded HTML page

generate_language_html.py (Records/, modelled on the tech-spec generators) renders any Languages/*.json to its branded 18-section page: chrome lifted from a sibling page, content rendered generically by shape (bullets, tables, key/value, block headings), record ids auto-linked to ../records/. AFAL's page (v0.004) is generated and its homepage card now links to it, marked DRAFT. This is the renderer A0014 recorded as missing (the phantom 'gaad_spec_render' never existed).

Rationale & options

Options considered: Hand-write AFAL's page (rejected: another orphan, breaks JSON-as-truth); build the renderer on the tech-spec pattern (chosen).

Rationale: JSON is the source of truth; the page is a view of it. Sourcing chrome from a sibling keeps AFAL consistent with the others. Remaining A0014 work: regenerate the other six pages through it (eyeball-compare first) and wire it into gaad_build.py with the conformance table.

D193 evolvedadoptedWebsite22 Jul 2026

The stack diagram's language band is also generated from the language files

architecture.html's Figure 1 (the engine-socket stack) now has its language-boxes band generated by generate_stack_langs.py (Records/), reading each language's name and platform_status, sorted LIVE first then alphabetical, written between FIG1_LANGS markers. AFAL appears as a seventh box automatically. With this and D192, both architecture.html figures - the readiness ladder and the stack - are generated from the language files; neither can drift from the caption again.

Rationale & options

Options considered: Hand-add AFAL's box and re-space the packed SVG (rejected: unverifiable, stays hand-maintained); generate the boxes band (chosen). The rest of Figure 1 stays static illustration.

Rationale: Completes D192: no hand-drawn language figure remains on the site. LIVE reads from platform_status active; boxes fit dynamically, so a new language needs no hand-editing.

D192 evolvedadoptedWebsite22 Jul 2026

The website readiness ladder is generated from the language files, not hand-drawn

architecture.html's readiness ladder is now generated by generate_language_ladder.py (Records/, sibling to the tech-spec generators): it reads each Languages/*.json readiness_level, sorts by rung descending, and writes the ladder SVG between LADDER markers. One dot per language, filled to its rung and hollow above; the amber 'in progress' state is dropped. Columns fit dynamically, so a new language or a climbed rung appears with no hand-editing. AFAL now shows among the T4s automatically.

Rationale & options

Options considered: Hand-add AFAL as a seventh column to the packed SVG (rejected: unverifiable reflow, and it stays hand-maintained and drifts); keep amber by inventing a status field (rejected: not a field in the files, would be hand-decided per language); generate from the language files and drop amber (chosen).

Rationale: Generate-from-source kills the staleness permanently and makes the figure's own 'read straight from each language file' note finally true - the picture becomes a view of the data, not a second copy that drifts. Amber dropped for honesty: one rung per language (D165); a nuance with no home in the files has no place in a generated figure.

D191 evolvedadoptedLanguages22 Jul 2026

AFAL promoted to T4 - rules agreed and the prototype runs; name kept AFAL

AFAL readiness raised from T2 to T4, climbed in order: T1 verified (D189), T2 rules formed and code-matched (D190), T3 Language agreed (ruled on the three seats' convergence - Miles named it, ChatGPT built and documented the prototype, Claude formalised and verified the file against source), T4 met by AFAL Studio v0.2.3 generating in Blender. Name kept as AFAL; the ALAL / Artificial Life rename was considered and dropped.

Rationale & options

Options considered: Stop at T3 (understates it - the prototype demonstrably runs); promote to T4 (chosen); go higher (rejected - no connector and no GAAD integration, so T5-T7 would be false).

Rationale: The rung is earned on evidence, not granted for time: rungs 1-4 are each genuinely met. T4 is the honest ceiling until AFAL has its own connector and runs through GAAD rather than standalone.

D190 evolvedadoptedLanguages22 Jul 2026

AFAL rules formalised from the v0.2.3 technical-truth pass, verified against code (v0.003)

The AFAL Technical Rules Package (technical-truth pass 001, anchored to AFAL Studio v0.2.3) was verified line-by-line against the source by the Specification Owner - mode ranges, seed, rise generation, all six mutation formulas, the engine's path/orientation/scale formulas, primitive size and panel labels all matched. AFAL updated to v0.003: s7/s8/s9 now carry the exact per-gene formulas, the whole growth rule, the seed and the mutation model as rule; proposed items kept separate in s16. Resolved s18 unknowns: growth = exponential uniform scale; twist = path-angle increment only (not torsion or local rotation); rotate has two roles; mutation is additive/independent/in-place and not replayable; the seed is implicit. Code-truth: the current path is a constant-radius helix, not a logarithmic spiral. v0.002 retired.

Rationale & options

Options considered: File the technical-truth doc as-is on the developer's word (rejected: technical truth must be checked against the code before it becomes rule); verify then file (chosen).

Rationale: Every material claim in the doc checked out against AFAL Studio v0.2.3, so the implemented behaviour is safe to file as rule; proposed items are intentions, not rule, and stay separate. Rung stays T2 - the rules are now precisely formed and code-matched, but T3 (formal three-seat agreement) is the Chief Architect's call and the prototype already runs, so a T3 ruling would carry AFAL to T4.

D189 evolvedadoptedLanguages22 Jul 2026

AFAL T1 research verified; language reconciled to the spiral engine (v0.002)

AFAL T1 research (pass 001, six read sources) accepted as verifying the parametric, deterministic identity, the design-exploration purpose, the rise-plus-rotation architectural precedent, and the natural 3D spiral as inspiration. AFAL updated to v0.002: grammar reconciled from the filed array/offset/mirror to the real AFAL Studio engine (index-based spiral - radius, rise, rotate, twist, compounding growth); Evidence (s11) and Knowledge Status (s18) populated; reference_case grounded as the AFAL Spiral Species; Constraints and Implementation moved from unknown to present. v0.001 retired to Superseded.

Rationale & options

Options considered: Bank only s11/s18 and leave the array/mirror grammar (rejected: Evidence about spirals would contradict Rules about arrays); reconcile the grammar to the engine (chosen, since code and research agree on it).

Rationale: T1 is source material checked, and six sources were read at relevant-sections depth (P063 bar). The reading grounds AFAL's core and, with the code, fixes the grammar mis-filed at birth. Rung stays T2: rules now correctly formed on verified T1, but T3 needs formal three-seat agreement and the prototype sits ahead of the rung. Specification Owner and Architecture Reviewer both recommend T2.

D188 newadoptedLanguages22 Jul 2026

AFAL born - the architectural form language; form splits out of ARAL

Architectural form becomes its own GALF language, AFAL (Architectural Form, an AL), rather than an expansion of ARAL. AFAL owns deterministic build-by-rule - array, offset, mirror and their kin - while ARAL stays about art and emergence. Filed as gaad_afal_language_file_v0_001, starting at readiness T2 Rules formed.

Rationale & options

Options considered: Expand ARAL's panel with 3D-form menus and promote parts to T7 later (rejected: the TRL ladder is one rung per language, so a part cannot hold its own rung while inside ARAL); make the form generator platform engine with no rung (rejected: a rung-bearing language was wanted); a new language AFAL (chosen).

Rationale: The readiness ladder (D165) is one honest number per language, so promoting part of ARAL is not available while the part sits inside ARAL. A separate language gives form its own rung and keeps ARAL about emergence, avoiding hollowing ARAL to a catalogue. Miles's call, 22 Jul 2026, keep it simple in the spirit of GAAD.

D187 evolvedactivePlatform18 Jul 2026

The world grid extends to 12x12; the addon enum is the single allowed-size authority

WORLD grid presets extended from 9x9 to 12x12 (10, 11, 12 added), the top one labelled '12x12 Table' after the times-table grid Miles learnt multiplication on. Adding the enum entries was not enough: three hardcoded 2<=n<=9 guards silently degraded 10/11/12 breeds to 3x3 - the generator's _grid_size(), the live-preview callback, and the fresh-file default. All three raised to 12. Going forward the addon enum is the one place the allowed sizes are declared, and every consumer reads int(gaad_grid_size) bounded 2..12.

Rationale & options

Options considered: Add only 12x12 (leaves a 9->12 gap in the ladder); add 10/11/12 (chosen, no gap); make grid size a free integer (rejected - the enum documents and constrains the tested set).

Rationale: Same class of bug as the generator's own historic cap-at-5, which silently degraded 6-9 until widened to 9. Centralising the allowed set on the enum stops the next preset addition from hitting a fourth hidden guard. Proven in Blender: a full 144-stage 12x12 world bred in 1.8s across PRAL and TWAL.

P065
D186 newadoptedSpec17 Jul 2026

GALF v0.008: the base vocabulary written, the 18 sections made normative

GALF v0.008 is cut and adopted. It writes the base relationship vocabulary the contract has always referred to and never had (ten types, extras declarable per language, has/holds/'is one of' retired), and makes section addressing normative: a language file carries all 18 sections by code s1-s18, each holding content or stating unknown - never omitted. Conformance becomes generated from Languages/, never typed. MHAL v0.007 is the pilot and the only file on the spine: 10 of 18 present, Required 6 of 11. Sequence ruled by Miles: GALF first, then the generator, then the languages one at a time. The website drifts meanwhile - accepted knowingly, not overlooked (A0010). 17 Jul 20:10, same day: Miles ruled all languages onto the spine rather than one at a time, and all six are migrated. Coverage, measured not claimed - FWAL v0.009 18/18 and Required 11 of 11 (the most complete language in the estate, and the ringfenced draft); ARAL v0.002 16/18, 11 of 11; MHAL v0.007 11/18, 7 of 11; TWAL v1.001 10/18, 8 of 11; PRAL v0.003 8/18, 6 of 11; GRAL v0.022 5/18, 4 of 11 - the thinnest file, and the one anchored to Miles's own built building. Every old version retired to Languages/Superseded; nothing lost, proved key by key. Three findings went to actions: TWAL's retired types (A0012), ARAL declaring types but stating no triples (A0013), the generator still absent (A0014).

Rationale & optionsOptions considered
  • Migrate all six languages now
  • GALF v0.008 first, then the generator, then one language at a time
  • Leave the contract as it stands

Rationale: Miles read MHAL's s4 and s6 against the contract and found no common framework across the languages. The measurement backed him: sections were addressable only by guessing each file's key names, content sat in x_ extensions because no section claimed it, and the conformance table was typed by hand and rated MHAL v0.004 while MHAL was at v0.006. T030 opened the same day on the missing vocabulary. Contract first, because six files claiming conformance to a contract that does not ask for the spine would be reworked when it does.

D185 newadoptedWebsite17 Jul 2026

The site earns its search traffic: a discoverability layer

The website carries a deliberate discoverability layer, added at 1_021 to 1_023 and published 17 Jul: og and twitter share cards on all five hand-maintained pages, each with title, description and image, so every share unfurls; per-episode anchor ids so each episode has its own shareable URL; sitemap.xml, robots.txt and a branded 404; canonical tags on the hand-maintained pages; JSON-LD structured data (WebSite on the homepage, Person on About, Blog with all episodes on Episodes); and search-phrase titles and meta descriptions, with every visible heading kept in Miles's voice. Google Search Console verified the same day, sitemap submitted, so future SEO decisions are made from measured search data, not guesses. Boundary: generated record and language pages carry no canonicals - hand-editing generated HTML is forbidden, so their canonical tags await a versioned change to the page shell in gaad_html_modern.py.

Rationale & optionsOptions considered
  • Leave discovery to chance and links from LinkedIn
  • Add the in-file layer and measure via Search Console

Rationale: EP5's publish showed shares landing without preview cards and Google finding the site by luck: only index.html had og tags, no sitemap or robots existed, and titles carried no phrases people actually search. The layer costs nothing visible - the voice of every heading is untouched - and Search Console turns traffic into ground truth the same way the records do for development.

D184 newopenWebsite17 Jul 2026

Diaries to the website

Publish the diaries on the GAAD website as a fresh, regularly updated stream. OPEN - the shape is not yet decided: which diary publishes (personal, technical, or both), whether it replaces or joins the stalled Daily section, and the route by which diary pairs (which travel in their own zip under D159, outside the live bundle) enter a website cut. Only pairs Miles has edited and marked final may publish - DRAFT pairs never go public. | 24 Jul update, Miles's direction: start with the newest pair - 24 Jul publishes first once Miles's red pen marks it final - then backfill the older pairs progressively. Starting from today means the stream is live immediately and history arrives behind it, rather than the launch waiting on a backlog edit. Still open to rule: which diary leads (personal, technical, or the pair), whether the stream replaces or joins the stalled Daily section (last entry 10 Jul), and the transport route by which final pairs from 6_Diary enter a website cut. | 24 Jul, ruled by Miles: the surface is DIARY, singular, at diary.html; Diary takes the Follow the build slot in the nav, beside Episodes, on every page (the homepage Follow the build section stays, gaining a Read the diary button). The built page's shape - the personal diary leads inline, the technical diary linked behind each day, month blocks with day chips as the index - stands as the working proposal. Still open: the formal lead-diary ruling, replace-or-join the stalled Daily section, the transport route from 6_Diary, and the DRAFT gate: six entries await Miles's red pen before any publish.

Rationale & optionsOptions considered
  • Publish the personal diary as a new Diary section replacing Daily; hold the technical diary
  • Publish both diary pages
  • Keep diaries private and leave Daily as is

Rationale: Freshness came up while reviewing how to attract more Google traffic: the site updates only when an episode lands, while the diaries are written every session and are the purest form of the site's premise - the process shared as it happens. Daily stopped at 10 Jul and a visibly stalled log reads worse than none. Raised by Miles on 17 Jul; recorded open for his word on the shape.

D183 newadoptedWebsite16 Jul 2026

The language counts on the site are a parameter, not prose

The number of architectural languages is derived, never typed. gaad_site_stats.py counts the language files in Languages/ for the total and those whose platform_status is active for the running count, then writes the number words into index.html and architecture.html between markers - headings, ledes, figure captions and the meta description alike. The homepage heading is Miles's wording: six architectural languages, two of them live. The lede's claim that one is anchored to a real, completed building is GRAL and stays a separate count on purpose.

Rationale & optionsOptions considered
  • Fix the wrong numbers by hand
  • Derive both numbers from the language files

Rationale: Miles found architecture.html saying Five languages in its heading while its own card grid said Six, and asked for the number to be a parameter so the two can never disagree and a seventh language changes them everywhere. The same disease as D177: a count that existed only as typed prose had no source, so nothing could regenerate it and nothing could check it. Checking also found the bundle's Website folder behind the 1_017 publish - the source and the publish had swapped places - and the pages were synced back before the fix was applied.

D182 newadoptedPanel16 Jul 2026

The MHAL tab holds the invented block and the real one as separate sections

The MHAL tab becomes a parent panel with two collapsible sections: Prototype 0_008, preserved exactly as it was, and Reference Blocks - Study, which builds any of the five real blocks from city data. The two keep separate namespaces: the study names everything ME_* so that the prototype's Clear MHAL, which removes any object named Block_*, Parcel_* or MHAL_*, cannot touch it, and Clear Study cannot touch the prototype. An offset slider places the study beside the prototype block, or at zero, overlaid on it.

Rationale & optionsOptions considered
  • Two separate panels in the same tab
  • A second script registering its own panel
  • One parent panel with two collapsible sections

Rationale: Miles asked for the prototype to be preserved as is in a cascade menu with the study added beside it. Separate namespaces were not a preference: with the names as first written, one press of Clear MHAL would have deleted the whole study. The offset going to zero is the point of the pairing - the invented block and the measured one land on each other, and the question of whether the prototype's 244 m x 80 m block should adopt the verified 60.96 m depth stops being an assertion and becomes something you can see. That question is open.

P064
D181 newadoptedArchitecture16 Jul 2026

A reference block is the city's tax block, not our frame

Membership of a reference block is decided by the city's own BBL - borough, block, lot - and not by the bounding box GAAD calculated for it. The frame's job is reduced to finding the block: every lot inside it is read for its block number, the dominant block wins, and only its lots and their buildings are built. Buildings are matched to the same block by base_bbl. The ~25 m tolerance still describes how the block was located; it no longer describes what belongs to it.

Rationale & optionsOptions considered
  • Tighten the frame - a rotated box aligned to the 29 degree grid
  • Accept the overshoot and say so in the read-out
  • Filter by the city's tax block and let the frame only find it

Rationale: The Upper West Side block returned 216 parcels. Filtered to the city's own block it holds 90, so more than half of what the frame caught belonged to the neighbours. The cause was geometry, not data: a north-aligned box around a grid tilted 29 degrees east of north scoops in the corners of the blocks around it, and on a 213 m west-side block that is 47,500 sq m of box around 13,006 sq m of block - 3.7 times the thing it was meant to hold. Midtown East's short Lexington block hid the fault at thirteen lots. A tighter frame would have been a better calculation; the BBL is not a calculation at all. It is the city's definition of exactly this block, so the evidence grade moves from Calculated to Verified and the tolerance stops applying to membership.

P064
D180 newadoptedLanguages16 Jul 2026

The MHAL reference blocks carry their own map links

Each of MHAL's five reference blocks carries links out to the maps that answer the questions the block raises: OpenStreetMap and Google Maps from the existing reference_address, and NYC ZoLa zoomed to the block's frame, which answers the 1811-did-not-fix list per lot - zoning, FAR, land use, tax lots. Search links only: no coordinates were invented to make them. Street View was adopted and then ruled out by Miles. A historic layer is adopted but NOT built: the durable form is the Bromley 1911 plate per block in NYPL Digital Collections, and plate identification is unfinished - two plates verified, one probable.

Rationale & optionsOptions considered
  • JSON only - no links, the addresses are enough
  • Address-derived search links only
  • Search links plus ZoLa, Street View and a historic atlas layer

Rationale: Miles asked for the links and named the historic layer as the one he wanted most: this is emergent by history. The block descriptions were already carrying the claim that the grid persists while parcels mutate; the links let anyone check it in one click rather than take the file's word. ZoLa needed block geometry rather than an address, which is what drove the frame work recorded in the language file as zola_bbox_evidence. The historic layer stalled on research - NYPL archived Map Warper in April 2021, and the plate lookups need the atlas index map read by eye. Miles halted it: no more research on this.

D179 newadoptedLanguages16 Jul 2026

Open GIS enters MHAL as a study set, never as world input

MHAL's worlds stay invented. Real city data does not become MHAL input: no real parcels are fed to the genome and no real block becomes an MHAL world. GIS is a study set - what exists, measured, standing beside the language so the language can be judged against it. First and only study city: Manhattan.

Rationale & optionsOptions considered
  • Real parcels as MHAL input - the genome fills surveyed lots
  • GIS as context geometry only - a backdrop the AL respects
  • GIS as a study set - measured reality beside the invented world

Rationale: Miles's words: not real, but we can lean from what there is existing. The distinction is the whole value. If real parcels became input, MHAL would stop inventing and start tracing, and the language would be judged on how well it copied. As a study set the real block does the opposite job: it gives the invented block something honest to answer to. It also keeps the data out of the platform - the study is research-side under D170, so no addon, no records, no D161 gate. Manhattan only for now: MHAL already carries the verified 1811 grid, so the Commissioners' plan and what got built on it can be read against each other.

P064
D178 newadoptedRecords16 Jul 2026

Record vocabularies are enforced at the write, starting with origin

The origin field is a one-word provenance enum. Its vocabulary is not written twice: gaad_html_modern.py's ORIGIN_COLOUR map IS the vocabulary, exported as ORIGIN_VOCAB, and gaad_validate.py imports it and fails Schema on any value outside it. An empty origin stays legal - the field is optional. Vocabulary agreed as new / evolved / rebirth / 1994; '2026 Rebirth' is retired into 'rebirth' (nine records) and '1994' is added to the colour map, where it had been used nineteen times without ever being recognised. The five records carrying prose in origin - D145, D149, D150, D168, D169 - have that text moved to rationale, where prose belongs.

Rationale & optionsOptions considered
  • Leave it - five records, cosmetic
  • Make the generator defensive against unknown values
  • Enforce the vocabulary at the validator

Rationale: Found because Claude wrote paragraphs into origin on all eight of 15 Jul's decisions - the longest 402 characters - and the generator rendered each as a pill that ran off the side of the card. The validator could not have caught it: it checked that a field was non-empty and never checked what was in it. Claude had diagnosed exactly this failure four hours earlier, in this same session, and then walked into it. The eight also fell out of the page's header count, which reads by origin - it said 87 new when the truth was 95. This is the lean beachhead for the wider vocabulary problem, because origin needed no agreement: its list already existed in the colour map. The feature statuses are the hard case - 11 values across 39 records, including 'in-progress' AND 'in progress' - and they still wait on Miles, because 'built' versus 'adopted' is a judgement, not a typo. Note the two categories that had drifted apart in plain sight: '2026 Rebirth' and 'rebirth' meant the same thing and were counted separately for months, and '1994' had never been coloured because the map was behind the data. Neither was visible until something forced a look at the field.

D177 newadoptedWebsite16 Jul 2026

The homepage stats and records graph are generated, not typed

gaad_site_stats.py reads the record JSON and rewrites two blocks of index.html between markers: the stat cards and the records graph SVG. Counts, id ranges, the date window, the plotted series and every dot link are derived from the data. The script owns only what sits between its markers and leaves the rest of the page alone. It runs on every website update.

Rationale & optionsOptions considered
  • A standing rule in SKILL.md to update the numbers by hand on every web update
  • A generator that reads the record JSON

Rationale: Miles asked for the homepage graph to be updated and added a standing rule: remember to do this on all web updates, as dates need to be current. Checking the page found the stat cards claiming 157 decisions against a live 172, and 84 terms against 94 - a drift of fifteen decisions that no tool could have caught. The homepage was the one part of the estate with no source: the numbers existed only in the HTML, so nothing could regenerate them and nothing could check them. That is why they drifted silently for fifteen decisions. A rule that depends on remembering fails on the first busy morning; this brings the homepage under the same JSON-as-truth discipline the records have always had. Open: the script sits in Scripts/ and is not called by gaad_build.py, so it has no Validate step and has not been through D161.

D176 newadoptedLanguages16 Jul 2026

FWAL stays at T3 - a prototype means a panel

FWAL remains T3, Language agreed. A script that generates and prints to a console does not earn T4. In GAAD a prototype means a panel that can be pressed, as ARAL and MHAL both have. No FWAL panel exists.

Rationale & optionsOptions considered
  • FWAL to T4 on the strength of a generator that runs, with an infancy note like MHAL's amber
  • FWAL stays T3 until a panel exists

Rationale: A FWAL generator script written on 15 Jul rolls compositions from the verified 12 ft bay module and passes its own conformance checks, which by D165's words is T4, Prototype runs. Adding readiness pills to the website forced the question. Miles's call. Promoting FWAL would have made T4 mean two different things depending on which language you looked at, and the ladder would have stopped measuring anything. It also removes a second problem: the FWAL generator lives in 4_Research, which by D170 never enters Live, so FWAL's T4 would have rested on a script the platform will never ship.

D175 newadoptedWebsite16 Jul 2026

Language cards carry readiness and version, colour-coded by rung

The homepage language section shows six cards - ARAL added, heading and lede changed from five to six. Each card carries a pill reading rung and version (for example T7 Live in GAAD, v0.002), read from that language file's own readiness_level (D165) and version rather than typed into the page, and links to that language's HTML view. The tagline returns as a quiet second line beneath the pill. Frames and pills are coloured by rung: GAAD Gold for T7 Live in GAAD, Cyan for T4 Prototype runs, brand Light Grey for T3 Language agreed.

Rationale & optionsOptions considered
  • Pill reading LANGUAGE, rung, version
  • Pill reading rung and version only - the language name is already the card's gold tag

Rationale: Miles asked for the language HTML files to be added to the website and the card pills to show status and version. Miles's call on both. Naming the language in the pill said it twice and made the pill too long to sit on one line. Sourcing rung and version from the language file means the website cannot drift from the language files, which is the same JSON-as-truth discipline the records already hold. The colour is the readiness ladder made visible at a glance: two gold, two cyan, two light grey.

D174 newadoptedGenerator15 Jul 2026

ARAL places on the full stage - the label reserve is removed

The 24 m front label reserve is removed from ARAL (aral_prototype_v1_024). Placement is symmetric: X and Y both +/- 32.5 m, in plan_population and in mutate_plan's add-object path. The plan summary records label_reserve_m as 0.0, so the genome stays honest about it.

Rationale & optionsOptions considered
  • Keep the reserve, matching the main generator's stage convention
  • Drop it - ARAL draws no labels, so the strip is dead space

Rationale: Miles saw an empty strip at the front of the ARAL stage and asked why objects avoided it. It was the LABEL_RESERVE, 24 m, carried as-built from generator v0_56 into the ARAL prototype: Y placement ran +32.5 back but only -18.5 front. Miles's word: that is a bug, I never requested this, there is no text label. ARAL never draws front labels, so the reserve reserved nothing. It was inherited rather than chosen - the clearest example yet of a convention travelling into a language that had no use for it. Existing tapes recorded under older versions keep their old positions; the rule shapes new generations only.

D173 newadoptedInterface15 Jul 2026

Pause retired from the ARAL transport, Forward takes its slot

Pause is removed entirely from the ARAL prototype (aral_prototype_v1_026) - the button, the operator, and the aral_paused flag everywhere it was checked. In its transport slot sits Forward: steps the playhead ahead one recorded generation, replay only, never generates, the exact mirror of Rewind. At the live edge it reports that the tape has ended. The transport is now Rewind / Play / Stop / Forward.

Rationale & optionsOptions considered
  • Keep Pause alongside Stop
  • Retire Pause, put Forward in its slot

Rationale: Miles: the pause button serves no purpose as we have a stop button. Miles's call, and correct: Stop already covered everything Pause did. The tape had Rewind but no Forward, so the playhead could only be stepped in one direction - an asymmetry nobody had noticed while Pause occupied the slot Forward wanted.

D172 newadoptedInterface15 Jul 2026

The tape is optional - Tape ON / Tape OFF, and taped runs buffer

A Tape ON / Tape OFF radio in the ARAL MUTATION box (aral_prototype_v1_025). OFF records nothing: Mutate xN and Play run at full rebuild speed, STATUS reports (untaped), any prior tape is left frozen and untouched, and the Mutation Scrub greys out while an untaped run is live. ON now buffers: a Mutate xN run accumulates in plain Python memory and commits to the scene once at run end, whatever the exit - count, Stop or Esc.

Rationale & optionsOptions considered
  • Tape OFF only - the record traded for raw speed
  • Buffered commit only - a free win, but the rebuild cost remains
  • Both

Rationale: Miles asked whether removing per-generation storage would let Mutate xN run visibly faster. Reading the code found two costs: the scene rebuild per generation, and _hist_push copying the entire history list each generation - a cost that grows with tape length. Both, because they solve different halves. The buffer removes a cost that grows with tape length and takes nothing away - full tape, full Scrub. The radio gives the sprint mode Miles asked for and is honest about what it costs: an unrecorded run has no Scrub, no Rewind, no replay. Greying the Scrub during an untaped run prevents the worst failure, where the slider drags a stale tape under a live stage.

D171 newadoptedProcess15 Jul 2026

Research becomes the fifth zip, with its own audit trail

A fifth zip, gaad_research, joins live, working, diaries and website. It carries its own audit trail: an index recording, per document, its subject, artefact, origin, source and verification status - at document level AND at section level, since a research document is almost never one status. Ids are local to the zip and are not record ids. The fence around a quarantined artefact becomes a field in the index rather than a note beside a file.

Rationale & optionsOptions considered
  • Local-only, never travels, one line in CURRENT_ACTIONS pointing at the folder
  • A fifth zip carrying its own index and audit trail

Rationale: D170 kept research out of Live, which meant research would not travel: the zips are the session context transfer, and a ring fence note written on 15 Jul would have reached nobody. Research Pass 001 proved the need in a single document: its B5 rows were Verified from a named source, its A rows Extractable, its C rows Unknown. One document-level status would have had to lie about two thirds of it. Section-level status has precedent in D131, where each Tech Spec section carries its own date. Open: whether the zip carries its own JSON-to-HTML builder or the index is JSON only.

D170 newadoptedRecords15 Jul 2026

Research stays out of Live - it is not a record type

Research does not become a record type. No gaad_research.json in Records/, no Records Hub tab, no generator in gaad_build.py, no Validate step, no manifest entry, and no D161 gate. Research is what was done to find out; records are what GAAD decided. The two stay apart.

Rationale & optionsOptions considered
  • An eleventh record file and tenth Hub tab, with per-section verification status
  • Research kept entirely outside Live

Rationale: Miles proposed a Research record category to capture 4_Research with document- and section-level verification status. Reviewing it exposed that the evidence vocabulary FWAL uses (Verified / Derived / Supported interpretation / Approximate / Unverified / Unknown / Extractable) lives inside one language file as x_evidence_vocabulary, and a platform record type cannot borrow a language's private terms. Miles's call. Nothing in 4_Research makes a platform claim, so nothing there needs the platform's gates. Keeping research out of Live also kills the promotion problem the record type would have forced: FWAL's evidence vocabulary can stay experimental and language-local instead of being promoted to GALF just to serve a records feature. The same instinct that keeps the ARAL bench out of the Connector keeps research out of the records.

D169 newopenInterface14 Jul 2026

OPEN - reinstate the honest placed/skipped status readout in the ARAL prototype, and settle its wording

OPEN, for Miles's action. The honest object-count readout built in aral_prototype_v1_018 (the real one - see T027) reports requested / placed / skipped in the always-open STATUS box, so 'I asked for 64 and got 16' is explained on the panel: '16 of 64 placed, 48 skipped (no room), conformance PASS'. It appears only when objects were actually dropped; a full placement still reads '64 objects, conformance PASS'. The live prototype chain (aral_prototype_v1_020) does NOT carry it - the chain was built from v1_017, which had the underlying rolled/skipped data but not the readout. Reinstating it is a small forward fix (about eight lines in the Generate status block; the data is already computed). NOT done in bundle 0_135 by Miles's call. The open part is the WORDING: Miles asked the same session for the STATUS text to be SHORTENED because it truncates in a narrow panel, and this readout makes the line longer in exactly the case that matters. So the two wants pull against each other and the phrasing needs settling before the code lands.

Rationale & options

Options considered: 1 - reinstate the v1_018 wording verbatim: honest and already proven, but longest, and truncates in a narrow panel. 2 - reinstate tightened, e.g. '16/64 placed, 48 no room, PASS': same information, fits better, but new wording to agree. 3 - leave it out: rejected - the readout is the answer to a real question Miles asked twice, and its absence is what let the same discovery be made by eye.

Rationale: Found while reconciling the ARAL version collision (T027) - Miles had rediscovered by eye a behaviour the previous session had already built a readout for. Worth recording rather than just fixing, because the readout has already proved its value twice over. It was built to answer 'why did I ask for 60 and get 16?', and the same session it went missing from the working chain, Miles reached the same conclusion unaided by watching Harmony refuse to place objects that had no room. The panel should not make him re-derive what it already knows. The wording tension against the shorten-the-status request is a genuine design question, not a typo, so it is his call rather than a silent fix.

D168 newadoptedProcess14 Jul 2026

2_Working is split into Code and Blender - the text/binary wall built by construction

2_Working is restructured from one folder per language workset (aral_development / mhal_development / twal_development) into a flat two-folder split: 2_Working/Code holds every current script and note, with a single shared 2_Working/Code/Superseded for retired versions; 2_Working/Blender holds .blend files only. Code is the stable home Claude Code launches from - its name never changes, so no tool has to chase a version-numbered folder. Blender is the wall: no code tool reads, edits, moves or deletes anything inside it, and nothing in Code is ever a .blend. The rule is carried in a CLAUDE.md house-rules file at the root of Code (the working-area twin of SKILL.md), which Claude Code reads at the start of every session. Filename collisions from flattening are fixed by renaming, not by re-nesting (the two generic read_me.txt files became mhal_read_me.txt and twal_read_me.txt).

Rationale & options

Options considered: A - flat Code/ with all scripts together (chosen): simplest for a single tool launch point; language is already carried in the filename prefix, so nothing is lost. B - Code/ with per-language subfolders: preserves the existing grouping but adds a level for no gain once filenames are prefixed. C - split inside each workset (aral_development/Code + /Blender): keeps the wall but defeats the single stable launch point, since each workset would need pointing at separately. Miles chose A after testing it against his own one-version-per-chain habit: retired versions are swept to Superseded, so Code never accumulates hundreds of files.

Rationale: Miles, working session - the ARAL edit loop had become a dozen download-and-drop rounds in one day. The wall is the point. Git and Claude Code are excellent for text and poor for large binaries, so the line between 'in version control / editable by tools' and 'never touched' is exactly the line between text and .blend. Trusting a tool not to touch a .blend sitting next to the .py is thinner protection than making it structurally impossible; the folder layout enforces what a promise cannot. The restructure also surfaced that the mixing had already begun - a stray aral_prototype_v1_006.blend was found inside aral_development/Superseded and moved to Blender/. This resolves the SEPARATION half of D166.

D167 adoptedPlatform14 Jul 2026

ARAL prototype transport is the proving ground for a platform lineage transport (F036)

The ARAL prototype's tape-deck transport (Play/Stop/Pause/Rewind over a prototype-local plan history, aral_prototype_v1_013) is the PROVING GROUND for a real platform feature: a lineage transport (F036) that scrubs the GAAD design memory - Rewind / Play / Fast Forward / Pause - driving the Navigator, lineage.json and Backtrack (F006). REVISED 14 Jul: originally recorded as throwaway scaffolding disabled at wiring; Miles's call is that the transport INTERACTION graduates into the platform rather than dying. So at wiring the prototype-local history is retired (one lineage system, nothing destroyed - the platform Navigator owns history), but the transport controls themselves graduate to drive that Navigator. The prototype proved the interaction; the platform inherits it. Fast Forward is the platform addition (prototype has Rewind only, since forward = breed new).

Rationale & options

Rationale: Building a per-generation history inside the ARAL prototype (to support Rewind) duplicates the platform's lineage system in miniature. That is acceptable as prototype scaffolding - it unblocks real-time exploration of emergent mutation behaviour today (Q038, the first real-time run) - but it must not harden into a parallel history that competes with GAAD's Navigator once ARAL graduates. Recording the boundary now prevents accidental double-build later. Miles's call, 14 Jul 2026. REVISION: the transport turned out to reveal a genuine platform interaction (a playback head for the lineage), not just a prototype convenience. Recording it as graduating (via F036) rather than disposable, so the proven interaction is carried forward not rebuilt from scratch. Miles's call, 14 Jul 2026.

D166 openProcess14 Jul 2026

OPEN - workspace separation, arrival automation, and version-control strategy

OPEN, not yet resolved. Three linked questions about how the GAAD workspace is structured and moved between Miles and the AI seats: (1) SEPARATION - should Miles's live Blender area (.blend files, Generations output, rendered Images) be walled off in a folder the AI never zips or extracts into, so no bundle extract can ever overwrite his work? Pros: overwrite safety by construction, clear ownership, leaner zips, respects the different work tempos. Cons: weakens code-to-output provenance, one more folder to manage, possible re-link if the .blend references Scripts by relative path, and the record must still note which .blend pairs with which bundle. Blocking sub-question: does the .blend load the addon/scripts by relative path from the bundle, or from Blender's installed addons directory? That answer decides whether separation is a simple move or needs re-linking. (2) ARRIVAL AUTOMATION - the current process is manual (download to 3_Archive, extract live to 1_Live, manually delete + replace 5_Website, handle working, drop diaries into 6_Diary). Candidate fix: a gaad_unpack.bat that archives the current bundle, extracts live, clean-replaces website, replaces dev folders, and adds new diaries - one command, no manual deletes, no folder pile-up. (3) VERSION CONTROL / TOOLING - whether to move some or all of this onto Git/GitHub and/or use Claude coworker tools instead of manual zip exchange. See rationale for the full discussion to be had. Bundle-set change already made this session (three zips to four: live, working [dev only], diaries, website - all date-stamped) is the first step and should be recorded/formalised when this decision resolves. UPDATE 14 Jul 2026 (second session): question (1) SEPARATION is now RESOLVED and built - see D168. The wall exists on disk: 2_Working/Code holds all text (scripts, notes) and 2_Working/Blender holds .blend files only, with Claude Code instructed never to enter Blender/. The blocking sub-question fell away in practice: ARAL is run as a script from the Text Editor, not loaded by the .blend, so the move needed no re-linking. Question (3) VERSION CONTROL is part-answered: Claude Code v2.1.209 is installed on Miles's machine (native Windows installer, no Node, Max plan), launched from 2_Working/Code, and proven - it read CLAUDE.md and honoured the wall rule unprompted. But Miles judged the terminal loop TOO SLOW for his way of working and reverted to the chat loop for real edits the same session, so Claude Code is installed and available rather than adopted. NEW HARD FINDING: the whole GAAD estate lives inside OneDrive, and Git and OneDrive fight over the .git folder (sync corruption). Git is installed but deliberately NOT initialised. Any Git copy must therefore live OUTSIDE OneDrive - that location is the next sub-decision. Question (2) ARRIVAL AUTOMATION remains untouched. The Claude Desktop Code tab and Git are PARKED by Miles's call, to be taken up deliberately rather than bolted on mid-session. D166 stays OPEN on (2) and the unresolved half of (3).

Rationale & options

Rationale: The manual zip-shuffle workflow has produced real friction this session: duplicate bundle folders piling up in 1_Live (0_131, 0_132 x3), a stale website publish two nights ago, diaries buried inside the working zip, and overwrite anxiety on the working folder. These are symptoms of moving a versioned codebase by hand. The separation question, the arrival-automation question, and the version-control question are one cluster and should be decided together rather than piecemeal. To be discussed with Miles: Git/GitHub for true version history and safe merges; Claude coworker / Claude Code and other AI tooling for reducing the manual handoff. No change adopted yet - this records the open thread so it is not lost and is decided deliberately.

D165 adoptedPlatform13 Jul 2026

Technology Readiness Level (TRL) - one 1-to-7 maturity ladder for languages, adopted from NASA

A language's maturity is expressed as a single Technology Readiness Level (TRL) on a 1-to-7 ladder adopted from NASA's TRL scale (the established, widely recognised term, kept so the model is instantly legible), replacing scattered status tables. The scale starts at 1 (readiness scales count from 1; research is real work, not level zero). The seven rungs, each a 2-3 word achievement name: T1 Research verified (source material checked); T2 Rules formed (generative rules stated, not yet formalised - 'seed' is deliberately NOT used here, it is reserved for the RNG sense); T3 Language agreed (GALF-conforming language file, agreed across the three seats); T4 Prototype runs (standalone .py generates in Blender); T5 Connector ready (the eight-verb contract satisfied); T6 GAAD connected (registered and running through GAAD, not the prototype); T7 Live in GAAD (signed off via the release gate, verified end to end). Public notation is the T-code (T1..T7); NASA/TRL is never printed on the visible ladder, only recorded here. NASA mapping: GAAD 1-5 line up one-for-one with TRL 1-5; GAAD 6 Wired resembles TRL 6-7 (demonstrated in relevant/operational environment); GAAD 7 Live resembles TRL 8-9 (qualified through test, then proven in operation) - this is where NASA folds testing in, which is why GAAD folds QA into Live rather than making it a separate rung. The two contracts are GATES on rungs, not rungs: GALF gates T3 (definition contract), the Connector gates T5 (runtime contract); the D161 release gate (Validate Scripts) gates T7. TRL measures READINESS TO RUN in GAAD, not the quality of the language - a mature paper definition can sit low (per NASA's caution that readiness is not maturity). The 'resembles' mapping is a likeness, not a claim of NASA certification: GAAD is software with two contract gates NASA has no equivalent for, NASA is hardware with a manufacturing dimension GAAD lacks. Website mapping: LIVE = T7; DORMANT = T3-T6. Standing today: PRAL T7, TWAL T7, ARAL T4, MHAL T4 (amber - prototype present but not yet verified running by the Specification Owner), GRAL T3, FWAL T3. Status vocabulary on the readiness table uses NASA's register: Achieved (rung met), In progress (present but not yet verified, e.g. MHAL T4), Not started (planned, not begun) - 'achieved' is used rather than 'reached'.

Rationale & options

Rationale: The language/prototype/contract picture had grown into three overlapping tables that were getting messy to hold. Computer science solved this with readiness ladders (NASA TRL, adopted across defence, energy, healthcare, aerospace) - one scale, common language, gates on rungs. Folding GAAD's stages, its two contracts and its QA step into one TRL scale makes each language a single honest number and sets up a future where the level is a real field each language file stores and the website derives its status from, rather than a hand-typed label (the D151 aim). Adopted NASA's TRL name and scale at Miles's steer, 13 Jul 2026. TRL kept as the standard name rather than a bespoke acronym so a technical reader recognises it on sight; scale starts at 1 to match readiness-scale convention; rung names expanded to 2-3 words so each reads as a clear achievement; an amber state marks present-but-unverified (MHAL prototype), so the ladder is honest about what has been seen to run.

D164 adoptedWebsite13 Jul 2026

Architecture page notes a running prototype where one exists, without adding a status state

The Languages cards on architecture.html carry a small factual prototype note where a language has a working prototype that runs in Blender but is not yet wired through the Connector: 'Prototype: running in Blender, not yet connected'. The two status states (LIVE / DORMANT) are unchanged - the note sits alongside the status pill, it is not a third state and no vocabulary or language-file field changes. The note appears on ARAL (F035, MSC 2.4 panel) and MHAL (mhal_prototype_v1_008); GRAL and FWAL carry no note (no running prototype). Lightweight by choice: a fuller structural approach (a real prototype/wired state drawn from each language file, matching the addon's three rows) is noted as possible later work, not done here.

Rationale & options

Rationale: 'Dormant' collapses two different situations: a language with nothing built, and a language with a prototype already generating form in Blender (ARAL was breeding live tonight). The site was truthful but incomplete - it hid the prototype layer. A small factual note closes that gap cheaply and honestly without touching the status vocabulary or the schema. Agreed by Miles 13 Jul 2026, 20:12.

D163 adoptedWebsite13 Jul 2026

Architecture page shows six languages with single-word LIVE/DORMANT status; ARAL added as Dormant

The hand-authored architecture.html is updated so both diagrams (Figure 1 four-layer stack and the Languages cards) show all six languages and read status honestly from one vocabulary: single-word LIVE (teal) or DORMANT (grey), the display faces of platform_status active/unintegrated per D151. PRAL and TWAL are LIVE (TWAL per D158); GRAL, FWAL, MHAL and ARAL are DORMANT. ARAL is added as the sixth language tile/card (title 'Art', Dormant) - the art language (D154), kept distinct from its MSc 2.4 seed, which is behaviour not a language (D157) and does not appear on the language diagrams. Descriptor tails on the status pills (e.g. 'Built, real project') are retired in favour of the bare status word, so the pill makes a status claim only. Figure 1 re-spaced from five to six tiles within the same frame with matching implement-arrows.

Rationale & options

Rationale: The published page pre-dated TWAL's graduation and showed stale/ mixed statuses (TWAL Dormant, PRAL 'ACTIVE', descriptor pills that were not statuses). The page promises status shown honestly straight from each language file; two clean states delivered on that and stop a descriptor being mistaken for a status. Recording the change keeps the site and the records in agreement and prevents a future publish reintroducing the tails. Changes approved as rendered images by Miles, 13 Jul 2026.

D162 adoptedWebsite12 Jul 2026

Public site instrumented with Google Analytics (GA4), injected at source

The public GAAD site is instrumented with Google Analytics 4, tag G-G1FTB7K68M, injected at source per the JSON/generator discipline rather than hand-pasted per page. All 29 publish pages verified tagged; future pages inherit automatically. Shipped in publish 1_012, superseding the never-deployed 1_011.

Rationale & options

Rationale: Following the build publicly is only measurable with basic audience data. Injecting the tag at source keeps it consistent with the platform rule that outputs are generated, not hand-edited, so no page is missed and new pages are covered by default.

D161 adoptedProcess12 Jul 2026

No addon release without tracing the change against the assert contracts

Before any addon/script release, the Specification Owner must (1) trace the change against gaad_assert.py's expectations - the asserts are platform CONTRACTS (e.g. 'Reset leaves GAAD_World absent'), not just tests; (2) name which Validate Scripts steps the change touches, so Miles runs those first; (3) Miles runs Validate Scripts (F030) as the release gate - green before anything else builds on the change. The empty-stages-on-Reset failure (v1_013/014, 18/26 fail, reverted in v1_015) was catchable by reading the Reset assert alone.

Rationale & options

Rationale: The AI seat cannot run Blender, so the proving run only executes on Miles's machine. Four versions shipped tonight that Validate would have failed instantly. D135 built one assert library for exactly this; the discipline of reading it pre-release was missing. 24 seconds of Validate beats an evening of cascade debugging.

D160 openLanguage12 Jul 2026

TWAL tower count vs grid size needs resolution

OPEN - flagged for resolution, not yet settled. TWAL's tower count (target 40 in the standalone) and the platform's stage grid size (3x3, 6x6, NxN) are currently independent, so a dense tower target on a large grid produces very cluttered stages, and a small grid can under-fill. The relationship between how many towers a TWAL city holds and the stage/grid size it renders into must be defined - fixed target, grid-relative scaling, or a per-stage density rule.

Rationale & options

Rationale: Surfaced when TWAL ran through GAAD at 6x6 (D158): the 40-tower city per stage read as clutter across a large grid, exactly the 'development zone may become cluttered' concern from the 1994 thesis (Fig 3.10). Density was accepted for now (Miles, 12 Jul), but the tower-to-grid relationship is unresolved and should be decided before TWAL evolution work continues.

D159 adoptedProcess12 Jul 2026

Session diary lives at estate root (GAAD/6_Diary) - retires HANDOVER rule 7

The session diary pair (gaad_diary_YYYYMMDD.md + gaad_diary_technical_YYYYMMDD.md) lives in GAAD/6_Diary at the local estate root, not inside any working folder or the main bundle. This retires HANDOVER rule 7 ('diaries travel with worksets'): a session now spans many languages and platform areas, so the diary's scope is the whole session, and its location must match that scope. The bundle no longer carries a diary folder; gaad_home.py no longer lists one.

Rationale & options

Rationale: Rule 7 was written when a session was one workset (one fenced language). That is no longer true - today's session touched ARAL, housekeeping, panels, folder structure and TWAL. Filing the diary inside one language folder miscategorised a whole-project record.

D158 adoptedLanguage12 Jul 2026

TWAL graduated - fence lifted (D144 closed)

TWAL is graduated into the GAAD platform and verified live: its connector (twal_connector_v1_001.py) ships in Scripts/ and its prototype in Prototype/, so the GAAD generator finds the connector and TWAL generates THROUGH GAAD (confirmed in Blender by Miles, 12 Jul 2026). TWAL moves from the addon's Wired row to Live (addon v1_005); PRAL and TWAL are both Live. The D144 ringfence is lifted. The standalone TWAL in 2_Working is now superseded by the graduated copy - one source of truth is the bundle.

Rationale & options

Rationale: TWAL reached full platform parity on 09 Jul (24/24 validate). Graduation was held until a through-GAAD generate was proven, not assumed - the honest bar for lifting a fence. Confirmed working, so banked.

D157 adoptedGALF12 Jul 2026

Languages compose by reference - separation of concerns is not isolation

Qualifies D154. A language must not mix concerns inside its own file, but languages are expected to COMPOSE by reference where scales or concerns nest: one language invokes another as the authority on that concern, and the relationship is declared, never smuggled. Worked example (Miles, 12 Jul 2026): MHAL owns the grid, blocks and urban grammar; when a block needs buildings, MHAL uses TWAL for the building rules rather than growing its own. The plan does not design the buildings, it commissions them. Composition relationships are declared in the language files and will be carried at Connector level when cross-language invocation is built. Settled by Chief Architect, 12 Jul 2026.

Rationale & options

Rationale: D154's prohibition alone could read as isolation. Composition is a positive rule of its own: it keeps each language the single honest authority on its concern while letting the family build at every scale - and it matters at Connector level, where cross-language invocation will need declared relationships to ride on.

D157 adoptedGALF12 Jul 2026

A Language Seed is behaviour, not code

The 1994 AutoLISP listings (A6, A16, A17) will not be transcribed into GAAD. A Language Seed is captured as published BEHAVIOUR - primitive, rules, gene semantics and printed outputs - and the rebirth rebuilds fresh against those replay targets. Applied first to MSc 2.4: the seed source (gaad_msc_2_4_source_v0_001) holds the behaviour; aral_prototype v1_002+ rebuilds it in Python/Blender. Miles: 'we will do so much better than AutoLISP.'

Rationale & options

Rationale: Generalises to every future seed, including ones where no code ever existed (a canvas, an animation). The behaviour is the language; the implementation is the era.

D156 adoptedProcess11 Jul 2026

Standing rules - diary pair, UK clock, HTML-not-JSON

Three standing rules confirmed: (a) every handover session produces the diary pair (gaad_diary_YYYYMMDD.md personal + gaad_diary_technical_YYYYMMDD.md) into the workset diary/ folder, D149 names; (b) all dates/times use Miles's UK clock (Europe/London), established at chat start, never the AI session's clock; (c) structured artefacts (language files, records, specs) are presented to Miles as brand-styled HTML, not raw JSON, unless he asks for JSON.

Rationale & options

Rationale: Captured after each was needed in-session 11 Jul 2026. Written into HANDOVER and SKILL.md.

D155 adoptedConventions11 Jul 2026

s-notation reserved for GALF contract sections

The s-prefix notation (s1 to s18) refers ONLY to the 18 GALF contract sections. Research and experimental content (x_ keys) never uses s-notation; it is tagged x. Applies to all language-file and contract renders.

Rationale & options

Rationale: Keeps 's5' unambiguous - always GALF section 5, never a research block. Matches how the GALF spec refers to its own sections.

D154 adoptedLanguages11 Jul 2026

ARAL born - the art language; languages do not mix

ARAL (Falling-free art language) is created as GAAD's language for art, split from the PRAL prototype line at v1_010. Gravity (F034) and the sphere migrate to ARAL; PRAL resets to its five 1994 primitives and the ground (pral_prototype_v1_011). ARAL starts with two orientation-free solids (cube, sphere). Principle: a language does not mix concerns - architecture and art are separate languages.

Rationale & options

Rationale: Miles: 'this does not mix languages'. ARAL will have a life of its own, a Latham-lineage generator the ambition. Version lines restart per language (D149).

D153 adoptedConventions11 Jul 2026

Dimensional standard - metric units and precision

Metres (m) and square metres (m2) are reported to 2 decimal places (10.95 m, 864.00 m2). Lengths below one centimetre are reported in whole millimetres (6 mm, not 0.006 m). Verified precision finer than a whole millimetre rounds to whole mm (44.5 mm to 45 mm). Ratios, counts and non-length values are exempt. The unit is always stated.

Rationale & options

Rationale: Consistent units make cross-language comparison and generation reliable and stop both false precision and lost precision. Adopted into GALF s18 (D152). Contributed by Miles.

D152 adoptedGALF11 Jul 2026

Honest Knowledge - GALF s18 Knowledge Status adopted

GALF gains section 18, Knowledge Status (Recommended): a seven-level evidence vocabulary (VERIFIED, DERIVED, SUPPORTED_INTERPRETATION, APPROXIMATE, EXTRACTABLE, UNVERIFIED, UNKNOWN), a per-parameter provenance schema (name, value, units, evidence_status, source, date_verified, verified_by, notes), and the dimensional standard. The Confidence field is held OPEN. The 7-level vocabulary and MHAL's 4-level V/C/P/I coexist by seat decision. GALF grew 17 to 18 sections.

Rationale & options

Rationale: Generalises Honest Geometry (fake no geometry) to Honest Knowledge (fake no confidence). Proven in FWAL and MHAL before adoption. GAAD's first contract amendment through the full three-seat process (D140). Ratified by all three seats 11 Jul 2026.

P059
D151 adoptedWebsite11 Jul 2026

Language status display labels - DORMANT displays stored platform_status unintegrated; ACTIVE is earned

On the website, a language tile or card displays the friendly label DORMANT wherever the language file stores platform_status = unintegrated, and ACTIVE where it stores platform_status = active. Stored values never change to match display (GALF v0.005 s5.2: friendly labels may display, stored values may not drift). The prior tile label 'genome' is retired - it was not a status from any file. A tile flips to ACTIVE only when the language earns platform_status = active under D147 (a working Connector); TWAL flips first, at graduation.

Rationale & options

Rationale: The Architecture page promises status shown honestly, straight from each language file - 'genome' broke that promise. DORMANT is the display face of the stored vocabulary, permitted explicitly by the GALF v0.005 friendly-label provision, and reads better to a first-time visitor than 'unintegrated'. Settled by Chief Architect + Specification Owner, 11 Jul 2026.

P057
D150 newopenPlatform10 Jul 2026

Standalone .cel files on disk - the 1994 gene bank as a folder (OPEN)

OPEN - held by Miles, 10 Jul 2026. Question: should the CEL envelope (D148), which currently lives only as the 'cel' field inside TWAL stage files, ALSO be written as standalone .cel files on disk - a gene bank folder echoing the 1994 pattern (four .CEL files per visit, visit counter in filename, e.g. 7_2_BL.CEL)? Candidate shape if adopted: an export verb or automatic per-champion write, lowercase 1_-era names under D149. Not scheduled; decide when the TWAL road quietens.

Rationale & options

Options considered: Write .cel files per champion; export-on-demand verb; keep CEL embedded only (status quo).

Rationale: Miles, on discovering the CEL field live in stage files the same day TWAL connected. The CEL data exists and replays correctly from inside stage files, so standalone files are sentiment plus interoperability rather than necessity - but the 1994 echo has real narrative and archival value. Held rather than decided.

P057
D149 newadoptedStandards10 Jul 2026

Filenaming and folder standard, second edition - lowercase, underscore-only, three digits, the 1_ era

Supersedes D031's naming and folder sections; applies to the CURRENT ORBIT (TWAL Development set) and everything new - legacy files keep their names until naturally re-versioned, no mass rename ever. Rules: (1) FOLDERS: a cut is '[project] development N_NNN\' with the .blend and start_here at root, scripts in scripts\, plus per-need languages\ / spec\ / prototype\ / generations\ / reports\; the zip name equals the folder name. (2) VERSIONED FILENAMES for anything needing side-by-side versions or rollback: scripts, specs, language files, prototypes, connectors, test runners. (3) FIXED NAMES for contracts (imported/consumed by exact name, e.g. gaad_palette.py, lineage.json), current-state files (current_actions, handover) and records (the bundle track versions the set) - version lives inside the file. (4) Generated reports in caps with owner prefix (TWAL_CONNECTOR_REPORT.txt). (5) All-lowercase filenames - explicitly including the gaad prefix: new-era documents are gaad_twal_language_v1_001.md, not GAAD_...; D032 (GAAD always capitalised) governs prose, labels and output, never filenames. (6) Characters: a-z, 0-9, underscore only; the single dot belongs to the extension; dates as 2026_07_10; versions ALWAYS underscore form, dotted versions permitted only inside headers and prose; the version is ALWAYS the LAST element of the name, immediately before the extension (gaad_twal_language_v1_001.md, gaad_language_connector_twal_v1_001.md). (8) NO FILLER WORDS: a name never contains a word that adds no meaning - 'file' above all (everything is a file); gaad_twal_language_v1_001.md, never ..._language_file_... (7) Three-digit zero-padded versions, and THE 1_ ERA: files renamed or created under this standard start at v1_001 - 1_ sorts after every legacy 0_ version (promotion, not restart, honouring provenance) and marks the naming era on sight. (9) DATES in filenames are ISO 8601 basic form: 20260710 - unambiguous, sorts, no separators. (10) LENGTH: names aim for 30 characters or fewer (Miles: keep things tight); if a name wants to encode more, the metadata belongs in a record, not the name - names identify, records describe. (11) The convention is DOCUMENTED WHERE THE FILES LIVE: a short naming section in START_HERE and SKILL.md pointing at this decision. (12) NOUN ORDER: owner before tool - gaad_twal_connector_v1_001, never gaad_connector_twal or gaad_language_connector_twal; names family-sort by language and read in speaking order. (13) LANGUAGE TRIOS are named for the language itself: gaad_twal_v1_001.md/.json/.html - the file IS the language on paper; 'language', 'contract' and 'definition' rejected as fillers (Miles, final). STANDARD DECLARED FINAL AND MANDATORY (Miles, 10 Jul 2026): every file the Specification Owner generates from this point follows D149 without exception; HANDOVER carries it as a standing rule.

Rationale & options

Options considered: Platform-wide rename (rejected: breaks links and provenance); keep the zoo documented (rejected: defects remain); dotted versions in filenames (rejected: Miles - no dots or hyphens in names); capitalised names (rejected: case-sensitivity risk, no benefit).

Rationale: Miles + Specification Owner working session, 10 Jul 2026 (queued from the TWAL wiring day). Seven version schemes were in live use, with two real defects: lexical sort breaks on unpadded versions (v0_9 vs v0_18), and the same artefact spelt two ways (connector 0.6 in-header vs v0_6 on disk) taxes every cross-reference. Lowercase kills the Linux case-sensitivity 404 class on the website. Underscore-only keeps names shell-, URL- and pipeline-safe. The contract/versioned split states what the platform already practises (fixed palette, versioned generator). Orbit scoping avoids breaking published links and recorded provenance. Second edition checked against industry and research-data-management standards (10 Jul 2026): snake_case all-lowercase is the established best practice in data engineering and the Python ecosystem; version-as-last-element, leading zeros for sort order, ISO 8601 dates, concise names, and documenting the convention beside the files are all standard guidance (UBC RDM, Harvard HMS, Stanford Libraries, PEP 8 norms). D149 adopts the standard rather than inventing one; the only local strictures are no-hyphens (consistency over kebab-case) and the 30-character tightness.

D148 adopted10 Jul 2026

.CEL is a shared platform envelope; each language owns its payload

The serialize/.CEL format is defined ONCE at platform level as a shared envelope - language, language_version, galf_version, payload - with the payload schema owned by each language. The wrapper that makes any stage replayable under the language that made it is written once and inherited by every language; the 1994 .CEL idea preserved as one design-memory format. Defined in the Connector spec (platform side), not per language. Settled by Chief Architect + Specification Owner, 10 Jul 2026; Architecture Reviewer notification pending (same pattern as GALF v0.005). One of the three open three-seat decisions from T021 / the Connector spec s10.

Rationale & options

Rationale: One wrapper written once beats five written differently: replay depends on the envelope fields being uniform across languages, and per-language envelopes would be five chances to break design memory. The payload stays language-owned so the envelope adds no coupling.

D147 adopted10 Jul 2026

platform_status=active REQUIRES a working Connector - PRAL grandfathered with a dated exception

A language may only claim platform_status=active if it ships a conforming, working Connector implementation - contractual, not convention, so the status stays honest ('active' must mean 'actually runs'). PRAL, active via pre-Connector native wiring, holds a written dated exception (10 Jul 2026) until it is ported to the Connector verbs; a ticket tracks the port so the exception is temporary by design. Enters GALF at its next version cut. Settled by Chief Architect + Specification Owner, 10 Jul 2026; Architecture Reviewer notification pending (same pattern as GALF v0.005). One of the three open three-seat decisions from T021 / the Connector spec s10.

Rationale & options

Rationale: GAAD's records are only worth what their honesty guarantees; a status nobody enforces is decoration. The grandfather clause keeps the rule strict without falsifying PRAL's real, working status - one honest exception beats a loose rule, and the port ticket makes the exception self-erasing.

D146 adopted10 Jul 2026

The GAAD Language Connector is a separate platform spec, referencing GALF - not part of GALF

The Connector is its own specification with its own version track (v0.001 already cut), referencing GALF but never merged into it. GALF stays engine-neutral by SILENCE (names no software); the Connector stays neutral by ABSTRACTION (names verbs, never a vendor). Confirms the assumption the v0.001 draft was written on. Settled by Chief Architect + Specification Owner, 10 Jul 2026; Architecture Reviewer notification pending (same pattern as GALF v0.005). One of the three open three-seat decisions from T021 / the Connector spec s10.

Rationale & options

Rationale: Keeps both contracts honest about what they are: GALF cannot own a runtime interface without breaking its own neutrality rule (the T021 finding), and merging them would couple the language definition to the platform runtime. Matches D145's discipline of keeping distinct senses apart.

D145 newacceptedNaming09 Jul 2026

Two senses of 'architecture' kept apart; GALF retained over ALF

The word 'architecture' carries two unrelated senses in GAAD and they are kept distinct. (1) The design-school sense - 'architectural language' as the grammar of a building (the architectural language of Fallingwater) - stays lowercase in prose and is formalised as the platform term 'Architectural Language' (a GALF-conforming language: PRAL/GRAL/MHAL/FWAL/TWAL). (2) The system-structure sense - how the framework, languages, connector and engine connect - is named 'The Architecture' (capitalised) only as a website page/section title, never as a bare noun in prose. The framework keeps its agreed name GALF (GAAD Architectural Language Framework); the proposed rename to 'ALF' is rejected.

Rationale & optionsOptions considered
  • Page named 'Architecture' (bare) - rejected: ambiguous across the two senses
  • Page named 'Framework' - rejected: collides with GALF, which is the framework
  • Rename GALF -> ALF and add Core/Foundation/Fabric (Reviewer suggestion) - rejected: costly rename + unneeded nouns
  • Page named 'The Architecture' (capitalised, system-structure sense) + keep GALF - chosen

Rationale: Raised by Miles from architectural-school usage ('what is the architectural language of Fallingwater') versus the computing sense ('the architecture of how hardware and software connect'), prompted while building the website language/framework page. ChatGPT (Architecture Reviewer) proposed ALF + Core/Foundation/Fabric. GAAD's own name (Genetic Aided Architectural Design) already claims 'architectural' for the design sense, and the audience spans both architecture-school and software/BIM readers, so an unqualified 'Architecture' page would read ambiguously. 'The Architecture' as a proper-noun page title reads as system structure by context (beside Story/Platform/Records) without colliding with the design sense. Renaming GALF to ALF was rejected because GALF is baked into every language file's conforms_to, spec filenames, D140 and the website, so a rename ripples widely for no functional gain; and 'Framework' as a page name sits too close to GALF (which IS the framework). New nouns (Core/Foundation/Fabric) were declined as vocabulary not yet needed.

D144 rebirthadoptedDesign Language09 Jul 2026

MHAL Blender prototype is a ringfenced, Claude-owned standalone - GALF-conformant, GAAD untouched

The MHAL Blender explorer (MHAL_Prototype_0_008.py, evolved from an uploaded 0_005c) is a standalone prototype that Claude (Specification Owner) owns and iterates. It is ringfenced from the GAAD platform 'for now': it lives outside the bundle, adds no GAAD records or pipeline dependencies, and no MHAL work modifies GAAD scripts. The fence only comes down on Miles's explicit instruction. Even while ringfenced, the prototype is built to STRICTLY ALIGN with MHAL v0.003 and HONOUR GALF v0.005 - it emits the platform contact-point stamp (language/language_version/galf_version), the MHAL type-level and per-instance relationship triples, the honest City>District>Block hierarchy, the Scale Resolution Axis, and per-concept status - so its JSON can port into GAAD later without rework.

Rationale & optionsOptions considered
  • Fold the prototype into the GAAD bundle now (rejected - couples exploratory work to the live platform and violates 'GAAD must remain as current')
  • Keep it standalone but GALF-agnostic (rejected - would need a rework to port later; cheap to honour GALF now)
  • Standalone, Claude-owned, ringfenced, GALF-conformant (adopted)

Rationale: Keeps exploratory MHAL geometry work moving fast without risking the live GAAD bundle, while proving something valuable to GAAD itself: that GALF works as a real contract an independent standalone can honour from the outside. Ownership with a clear boundary means the prototype can be freely iterated (colour-by-term, standing legend, fast geometry, safe clear) without touching platform state, yet lands cleanly if and when it is brought inside.

P053
D143 rebirthadoptedConvention08 Jul 2026

Languages/ folder: Architectural Language files live apart from platform specs

The bundle gains a top-level Languages/ folder holding the Architectural Language file trios (md/json/html): GAAD_PRAL_v0_001, GAAD_GRAL_v0_021, GAAD_MHAL_v0_003, and future languages (FWAL). Spec/ holds what the platform PROMISES (Lineage, SmokeTest, DL, and the GALF contract per D142); Languages/ holds the implementations that conform to it.

Rationale & optionsOptions considered
  • Spec/Languages/ subfolder (rejected - the languages are peers of the spec concept, not children of it)
  • Keep everything in Spec/ (rejected - the folder no longer says what a file is)

Rationale: Spec/ was starting to conflate two kinds of document: platform specifications and conforming language implementations. Separating them mirrors the GALF architecture itself - contract in Spec/, implementations in Languages/ - and gives every future language an obvious home.

D142 rebirthadoptedConvention08 Jul 2026

GALF stewardship: owned by the Specification Owner, versioned on the GAAD spec track

GALF is owned by the Specification Owner (Claude) and lives in the bundle's Spec/ folder under GAAD file naming: Spec/GAAD_GALF_v0_0X_Architectural_Language_Contract_Specification.md (+ .json mirror). v0.004 is the stewardship version - content is the agreed v0.003 verbatim; only ownership, naming and the Resolution Axis freeze pointer (now v0.005) changed. The externally-named v0.003 files are removed from Spec/ (one authoritative copy, drop discipline); the agreed v0.003 share bundle remains the record of the three-seat agreement (D140).

Rationale & optionsOptions considered
  • Keep external GALF naming inside Spec/ (rejected - two naming schemes in one folder invites drift)

Rationale: Miles handed GALF ownership to the Specification Owner on 08 Jul 2026. Bringing it under GAAD naming and the Spec/ folder makes the contract a first-class platform specification alongside Lineage, SmokeTest and DL, versioned and validated with everything else.

P052
D141 rebirthadoptedArchitecture08 Jul 2026

GRAL is the first Architectural Language built on the GALF contract

GRAL (Garden Room Architectural Language) is recognised as the first Architectural Language built on the GALF contract - no longer just a prototype. Its conformance pass to GALF v0.003 (terminology linkage of platform terms, mandatory status vocabulary mapping) is the template every subsequent language follows.

Rationale & optionsOptions considered
  • PRAL first, as the platform-active language (rejected as the template case - PRAL is knowledge-thin; GRAL exercises the full contract)

Rationale: Miles, on agreeing GALF v0.003: the project changes direction here - the simple decision gives GAAD a foundation for every language that follows (Q027). GRAL earns first position: it is the knowledge-richest language, grounded in the real garden room, and its v0.020 file stress-tested the contract before agreement.

P052
D140 rebirthadoptedArchitecture08 Jul 2026

Adopt GALF - the GAAD Architectural Language Framework contract (v0.003, agreed by all three seats)

GALF (GAAD Architectural Language Framework) defines the Architectural Language Contract that every GAAD Architectural Language implements. GAAD is the platform; GALF is the contract; PRAL, GRAL, MHAL, FWAL and future languages are implementations. v0.003 agreed 08 Jul 2026 by all three seats: 16 contract sections with requirement levels (Relationships Required; Mission/Identity/Validation never empty); two-axis language status (knowledge_status / platform_status - PRAL is platform-active); typed relationship triples for internal-coherence validation; no tool names in the contract body; every stage file records language, language_version and galf_version; validation layer 3 is the F030 proving run. Resolution Axis remains EXPERIMENTAL pending the FWAL acid test (freeze at v0.004 only if unchanged). MAHL removed as accidental. Contract filed at Spec/GALF_Architectural_Language_Contract_v0_003.md.

Rationale & optionsOptions considered
  • Per-language ad hoc definitions with no shared contract (rejected - languages would drift; the platform could not validate them uniformly)
  • Tie the contract to the current Blender implementation (rejected - implementation independence is absolute; the contract says what a language IS, never how it executes)

Rationale: Concept by Miles with ChatGPT (v0.002); Specification Owner review produced seven amendments (v0.003 draft), tested against real language files GRAL v0.020 and MHAL v0.002 which earned two further contract rules (mandatory status vocabulary; internal coherence - MHAL's Hierarchy contradicted its own Relationships three ways); Architecture Reviewer approved with four minor amendments, all applied. The contract absorbs parked features F016/F017/F018 and extends the standing stage-file language precondition with galf_version. Three-seat process working as designed.

D139 rebirthadoptedTerminology08 Jul 2026

The remembered circle on the Navigator lineage is a Genome

Each circle on the Navigator lineage array is a Genome: the complete genetic makeup of one remembered design at one generation. The square in the Generator stays a Stage (where design happens, D134). The Backtrack button and prompts name it - 'Select Genome for Backtrack', 'Backtrack to Genome - String {s} / Gen {g}'.

Rationale & optionsOptions considered
  • Disc (rejected - describes the shape, not the meaning; not genetic)
  • Cell (rejected - already means a building-block shape in GAAD's vocabulary; overloading it blurs shape-unit vs whole-design)
  • Individual / Specimen (viable GA terms; Genome preferred as it names the design's genetic content, which is what Backtrack replays)

Rationale: 'Genome' layers cleanly with GAAD's existing vocabulary: a Genome is expressed into cells/shapes (box/cube, column/cylinder - the 1994 'cell' vocabulary), so the Navigator holds each design's genome and each genome builds from cells. This avoids overloading 'cell', which already means a building-block shape unit, and it is more precise than 'disc' (which only named the shape) - a whole remembered individual deserves a whole-organism term. Reinforces the D134 split: square = Stage (design happens), circle = Genome (design remembered).

D138 rebirthadoptedInteraction08 Jul 2026

Backtrack button self-labels in three states and arms red

The Backtrack button (F006) now tells the whole arm/confirm flow through its own label and colour. In the Generator, idle, it reads 'Backtrack' with no colour. The first press opens the Navigator and the button turns red, reading 'Select Stage for Backtrack'. Selecting a lineage disc relabels it, still red, to 'Backtrack to String {s} / Gen {g}'. Committing replays the chosen stage and returns to the Generator, where the button is plain 'Backtrack' again.

Rationale & optionsOptions considered
  • Leave the static 'Backtrack' label with a separate status message (rejected - the button should carry its own state, as Isolate did)
  • Show only 'Backtrack to Gen {g}' (superseded - the string is part of the identity; the label now names String and Gen, matching the Navigator disc)

Rationale: Backtrack is a two-context verb (D133): press once to open the Navigator, select a disc, press again to commit. Nothing on the button said which step you were on. Reusing the self-labelling grammar of the retired Isolate toggle - live text plus a red (row.alert) armed state - makes the sequence legible without a separate status line, and the red signals 'you are mid-Backtrack, one more click commits'. Panel-only change; the operator already did the two-context work.

D137 rebirthadoptedInteraction08 Jul 2026

The Isolator is its own scene; Generator / Navigator / Isolator are peer scene-jumps

GAAD now has three peer scenes: GAAD Generator (where design happens), GAAD Navigator (where design is remembered, D134), and the new GAAD Isolator (where one stage is studied on its own). The panel top row switches between them - Generator / Navigator / Isolator - each a single click, none a toggle. Pressing Isolator LINKS the selected Generator stage's objects into the Isolator scene (the same objects and materials, never duplicated, so colour mode stays in sync automatically) and switches there, with its own HUD titled 'Isolator - Stage N'. Isolator is Generator-fed for now; isolating a remembered stage from a Navigator disc via replay is a later pass.

Rationale & optionsOptions considered
  • Keep the visibility toggle in the Generator scene (rejected - the restore dance is the bug source)
  • Duplicate the stage into the Isolator (rejected - drift and double the objects/materials; linking shares one source)
  • Replay the stage from its lineage file into the Isolator (deferred - needed for isolating a remembered Navigator stage, not for the live Generator case)

Rationale: The old Isolate Stage (F004) toggled object visibility inside the Generator scene and stashed/restored the view and label state on exit - the exact machinery behind the v0.95-v0.97 label-restore bugs. Making the Isolator a separate scene fed by object links means the Generator scene is never mutated, so there is nothing to restore and that whole class of bug disappears. It also makes scene-switching the single, consistent navigation model. Linking (not duplicating) keeps one source of truth for geometry and materials, so a colour-mode change in the Generator is reflected in the Isolator with no sync code.

D136 rebirthadoptedVisualisation08 Jul 2026

Records-over-time dots deep-link to individual records

On the homepage Records-over-time graph, each line carries a small dot in the line's own colour on every day that series gained a record, and each dot is a hyperlink into the matching record page anchored at a specific record (records/gaad_<type>.html#<id>). Dots are increment-only (none on flat runs); a dot targets the record that took the count to that level, and the final dot of each line is pinned to the newest record of that type.

Rationale & optionsOptions considered
  • Plain white dots at every vertex (rejected - noisy, and no link value)
  • Dots link only to the record-type page top (rejected - does not reach the individual record)
  • Regenerate the whole graph from JSON to guarantee dot-on-line alignment (deferred - would shift the approved hand-authored lines; kept the lines, read each dot's count off its existing y instead)
  • Dot opens a date-filtered view of all records from that day (deferred - larger build; current model is one dot, one specific record)

Rationale: Turns a decorative trend line into a navigable index: the graph is not just a picture of accumulation, it is a way into the records themselves. Record pages already carry per-record id anchors, so no records change was needed. Ids run in strict date order per series, so a dot's cumulative level maps cleanly to a real id; an invisible 5px hit-circle sits behind each 1.8px dot so the small targets stay clickable. One dot marks a day the count rose, so it opens the top record of that step rather than every record from that day.

D135 evolvedadoptedProcess07 Jul 2026

Hardening the build loop: maths before code, pure layout module, headless smoke test, scene-state ownership, drop discipline

Five practices adopted after the Bauhaus-persistence and disc-spacing troubleshoot cycles (07 Jul): (1) MATHS BEFORE CODE - any geometry or layout change gets a stated derivation (inputs, formula, worked example at 60/85/100m) agreed before scripting; Miles's 'confirm the maths first' demand ended the disc saga in one message. (2) PURE LAYOUT MODULE - layout arithmetic moves to a bpy-free gaad_tree_layout.py (the gaad_palette pattern) with a test file asserting invariants: pitch >= largest disc diameter (no overlap ever), radius >= half x sqrt2 (containment), connector endpoints on circumference. (3) HEADLESS SMOKE TEST - blender --background --python gaad_smoke_test.py builds a synthetic two-string lineage, runs generator + tree for real, asserts disc bounds do not intersect, materials match the active colour mode in BOTH scenes, labels carry stamps, stage files parse; catches the runtime class of bug (Bauhaus) invisible to sandbox syntax checks. Spec: Spec/GAAD_Smoke_Test_v0_01. (4) SCENE-STATE OWNERSHIP - any state crossing scenes gets a named source of truth at design time (colour mode: the Generator scene); the smoke test asserts the sync. (5) DROP DISCIPLINE - every mid-session file drop lists which files move together; shared modules use defensive reload-and-fallback imports; fast iteration days prefer micro-bundle zips over loose files. Build order: smoke test first (multiplies Miles's testing), layout module second.

Rationale & optionsOptions considered
  • Continue drop-and-eyeball iteration - rejected: two multi-cycle troubleshoots in one afternoon, both preventable (one by an invariant check, one by a runtime assertion)
  • Full CI pipeline - deferred: the headless smoke test gives most of the value at a fraction of the setup; revisit with the Claude Code evaluation

Rationale: The sandbox can prove syntax and pure maths but never runtime scene behaviour; Miles can prove runtime but should not be the first line of defence for arithmetic. These practices put each check where it is cheapest.

D134 1994adoptedInterface07 Jul 2026

Navigator stages are circles: square is where design happens, circle is where design is remembered

Navigator lineage stages are circular discs (tree v0_11), returning to the 1994 evolutionary tree language (Figs 3.21 / 3.28 / 3.29 - specimens under glass, cells in a lineage). The World keeps square stages. The geometry itself now distinguishes the two scenes at a glance: square = plot/site, the unit of WORK; circle = cell/specimen, the unit of MEMORY. Disc diameter = stage size, same thickness, colours (neutral / DEADEND_RED / CURRENT_GOLD), engine stamps and connectors unchanged; raw-mesh 48-segment disc, zero bpy.ops (v0_6 fast-geometry discipline). Proposed by Miles ('circles like 1994 - they look more genetic'), runtime-confirmed same day ('such a quick fix fable - love it').

Rationale & optionsOptions considered
  • Keep squares in both scenes (rejected: World and Navigator shared one visual grammar, so screenshots and glances could not tell work from memory apart)
  • Circles in both scenes (rejected: the World IS a site - square stages are the right architectural unit for the place where design happens)

Rationale: Semantic separation encoded in geometry; alignment with the 1994 plates, the website hero's dots-on-a-path, and Q024's atoms (atoms are round). The scene boundary now quietly teaches the Evolve/Backtrack distinction on every crossing.

P050
D133 evolvedagreed - engine in buildInteraction07 Jul 2026

Backtrack interaction: the Navigator is the Track decision point; the button commits, selection never does

Agreed flow (Miles, 07 Jul): pressing Backtrack in the Generator switches to the Navigator scene (skipped if already there). The user selects any past stage on any string - the backtrack target. A second press of the button (contextually relabelled, e.g. 'Backtrack to Gen N') performs the return: the target generation's full grid replays in the Generator world, the historical champion restored and highlighted - the world exactly as it stood. Selecting a stage and breeding then follows the D132 string rules. Selection alone NEVER commits anything; only the button press does. Rapid Stage Select is disabled for the entire F006 build (addon v0_93 development guard) so a click on a replayed grid can never trigger an accidental breed. Boundary behaviour keeps the 1994 warnings, starting with the progenitor warning verbatim.

Rationale & optionsOptions considered
  • Single-step Backtrack (one generation per press, 1994 Track loop exactly) - superseded by Miles's Navigator flow: seeing the whole lineage and jumping to the pivot beats blind stepping; the Genetic Tree was 1994's answer to the same need
  • Reuse the existing Back to Generation operator with the selected stage as target - rejected: overloads an operator that means something different and splits Backtrack across two buttons
  • Click-commits in the Navigator (Rapid-style) - rejected: with clicks-as-commitments live, a stray click would open phantom strings; the button is the commitment

Rationale: The Navigator-as-Track-decision-point is faithful to 1994 in spirit - the Genetic Tree was where you could see where to go. One button, two contexts, honest labels. Engine lands in addon v0_93.

D132 evolvedadoptedArchitecture07 Jul 2026

Lineage storage: flat sN_gNN stage files + lineage.json master record (Lineage Spec v0.01)

Generations now write to a flat Generations/ set: lineage.json (the master array record - strings, pivots, current_position, global creation index) plus one s{string}_g{generation}.json stage file per breed (s3_g07.json). Lexical sort of the filenames IS the genetic array, the 1994 discipline (one folder, the names tell the story) with the 2026 upgrade that JSON content is the single source of truth and filenames are a human-readable mirror. Development caps: 9 strings, 99 generations, defined once as constants, with honest warnings at every boundary. Strings are first-class records (id, parent_string, pivot_generation, pivot_variant_id, status active/preserved - no deleted status by design). The 1994 visit counter becomes DERIVED, never stored: visit n at depth g = the nth string through that depth, shown as an homage label (g07 visit 2) that can never drift. Breeding at a string tip extends it; breeding from a backtracked mid-string position opens a new string with its pivot recorded; pivot selections append to pivot_selection_events, never overwriting the historical selection_event. First Generation ARCHIVES any existing lineage set into Generations/archive_<timestamp>/ (moved, never deleted). Stage files today carry full parameters for all variants with sibling_seeds alongside; D030 seed-slimming is a later size optimisation, not a structure change. Old gen_XXX data is untouched and ignored. Shipped in generator v0_46, unit-tested with a simulated Fig 3.29 session. Full schema: Spec/GAAD_Lineage_v0_01_Storage_Specification.md.

Rationale & optionsOptions considered
  • Depth+visit in the filename, 1994-faithful (gen_007_v2.json) - rejected: string membership stays implicit, reconstructed by chaining parent refs
  • Subfolder per string (s002/s002_g007.json) - rejected after discussion: one glob reads the whole array, lexical sort shows the strings anyway, no orphan folders, simplest generator code; 1994 kept all .CEL files in one folder and it worked
  • Bare tree of stages with parent pointers, strings derived at display time - rejected: the string is the unit the designer thinks in, and it gives status/pivot/creation metadata a home; the model stays convertible since stage rows + pivots contain the full tree
  • Branch/fork naming from version control - rejected: branch implies merging (design strings never merge), loses the genetic register, and string is the 1994 word - provenance, not sentiment

Rationale: Backtrack (F006) is part of classic GAAD's engine grammar, not an add-on vocabulary (Q025), and its storage is the load-bearing wall for F024, D038 scoring and the Design Memory vision (Q026). Storage schemas are the hardest thing to change once real sessions have written data, hence spec before code. Stages are the atoms of the memory - every one preserved and replayable as a 3D view (Q024); dead ends become preserved strings, the Rebirth's deliberate upgrade on 1994's discarded dead ends. Caps chosen for development sanity, one edit to lift.

D131 newadoptedConvention07 Jul 2026

Technical Spec sections carry a per-section date, bumped when the section changes

Each Technical Specification section now carries its own date field, seeded at 2026-07-01 for all twelve sections. When a section's content is updated, its date is bumped to the date of that update. The Records Hub surfaces this in the Date column, and the tech spec schema gained a date entry describing the rule.

Rationale & optionsOptions considered
  • Leave tech spec sections undated (rejected - the Hub Date column read as empty, and a spec section has a real 'last updated' moment worth recording)
  • Reuse the single top-level spec date for every section (rejected - sections change independently, so a per-section date is more truthful and more useful)
  • Show a dash for empty cells (rejected - a real date carries information a placeholder does not)

Rationale: A spec section's currency matters. A per-section date shows at a glance when each part was last touched and fills the Hub Date column meaningfully. Seeding all sections at 2026-07-01 gives a clean baseline to diverge from as sections are revised.

D130 newadoptedRecords07 Jul 2026

Records Hub: auto-link record references (D/P/T/F/Q) to their pages

In the Records Hub, any record reference - D129, P024, T012, F006, Q021 and the like - appearing in a field value, whether in a related-records list or inline in decision, rationale, moment or description prose, is now rendered as a hyperlink to that record on its dedicated page (D to gaad_decisions.html#D###, P to pivotal moments, T to tickets, F to features, Q to quotes). Quote cards gained per-record id anchors so quote links resolve; the other record pages already had them, with scroll-margin already set to clear the sticky header.

Rationale & optionsOptions considered
  • Link references to positions within the Hub SPA (rejected - the Hub renders rows dynamically, so in-page anchors are unreliable; the static record pages carry stable per-record anchors)
  • Only linkify the explicit related fields (rejected - references also appear inline in prose, so linkifying at the value renderer covers both)
  • Validate each reference before linking (deferred - the parity checker already guards related fields, and a missing anchor simply does not scroll)

Rationale: Cross-references were dead text that forced manual lookup. Auto-linking at the single render_value choke point turns the whole record set into a navigable web with one change, reusing the anchors and scroll-margin the record pages already provide.

D129 newadoptedRecords07 Jul 2026

Records Hub: Date column after ID, date out of Status, key types newest-first

In the Records Hub table, a record's date now has its own column immediately after ID, instead of sitting as a badge inside the Status column. The Status column keeps only status, category and origin badges. Decisions, pivotal moments and features are listed newest-first (descending ID), so the latest work is at the top and the earliest at the bottom.

Rationale & optionsOptions considered
  • Rewire every record-type normalizer to carry the date separately (rejected - the renderer can lift the existing date badge into the new column at a single point, leaving the normalizers untouched)
  • Leave the date as a Status badge (rejected - it read as a status and was easy to miss; a dedicated column scans far better)
  • Sort every record type newest-first (deferred - only decisions, pivotal moments and features were requested; other types keep their order for now)

Rationale: A record's date is a first-class attribute and reads better in its own column than buried among status badges. Newest-first matches how the individual record pages already sort, and puts the most recent activity where the eye lands first.

D128 newadoptedConvention06 Jul 2026

Website publish package versioned on its own 1_### track (gaad_website_publish_#_###)

The website publish package (the deployable index.html plus the records/ folder served at 4bim.com/gaad) is versioned independently of the GAAD Development 0_### bundle, on its own track. Filename standard: gaad_website_publish_#_###. The first published package - the 06 Jul 2026 go-live (P049) - is designated 1_001 retrospectively; the next cut will be 1_002. The site track is decoupled from the development-bundle numbering because the public site is republished on its own cadence (content freshness, copy and link fixes) that does not map one-to-one onto development bundles.

Rationale & optionsOptions considered
  • Reuse the development-bundle number for the publish zip (rejected - the site republishes on a different cadence than bundle cuts; a shared number would either force needless site cuts or leave gaps)
  • No version on the publish zip, overwrite in place (rejected - loses the ability to reference or roll back a specific published state)
  • Date-stamped filename (rejected - a monotonic 1_### line is easier to cite in records and sorts predictably)

Rationale: The site went public on 06 Jul 2026 (P049) as a single deployable package. Giving it its own 1_### line, distinct from the 0_### development bundles, lets the public site be refreshed and cited on its own terms while keeping a clean, roll-back-able history. Supports CURRENT_ACTIONS item 3 (automate records publish to the website), where each cut assembles a publish package: that package now has a defined name and number.

P049
D127 newadoptedIdentity06 Jul 2026

Brand v1.2 rollout: /Brand masters, logo on every report, reports link home

The agreed logo (solid gold deltas, bases on the letter baseline at cap height; lockup: white rule at 85% with centred gold node trimmed to the wordmark - brand v1.2, P049) was rolled out across the platform. A new /Brand folder joins the bundle with the masters: lockup and wordmark as PNG (harvested from a verified genuine Space Grotesk render) and SVG, a gaad_logo_export.html tool that renders with the true fonts in the browser and exports pixel-perfect PNGs at 800/1600/3200px, and a README of the geometry rules. All 13 record HTML pages now open with the logo: gaad_html_modern.py embeds Brand/gaad_logo_wordmark.png as a data URI at build time (single source, offline-proof, no font dependency), page titles standardised to bold gold sans matching the Records Hub, duplicate text wordmarks removed, and the logo is wrapped in a link to ../index.html so every report clicks home to the website. Four standalone documents (audit, team roles, both architecture pages) were patched directly and will need a manual touch if the header changes again.

Rationale & optionsOptions considered
  • Web-font text wordmark in report headers (rejected - font-fallback failure observed on the website; reports must render correctly offline)
  • Reference the logo PNG by relative path (rejected - reports are single-file by design)
  • Embed the /Brand PNG as a data URI at build time from one source (chosen)

Rationale: One source of truth for the mark, mirroring the gaad_palette.py dedup pattern: change the PNG in /Brand, re-run gaad_build.py, every generated report updates. The ../index.html link is correct at the published site (records/ sits beside index.html) and a harmless dead click in the local bundle.

P049
D126 newadoptedRecords06 Jul 2026

Records HTML restructured: flat tables with category filter buttons

Three HTML views were restructured around one pattern Miles approved on the audit: a single flat table with an All-plus-categories filter button row. (1) gaad_audit.html: the seven per-category tables flattened into one 41-row table with columns Item / 1994 / Rebirth / Comment / Category (Comment folds the old ID and Status columns), category filter buttons, all expandable Reference/Development notes preserved. (2) The Records Hub (generate_records_hub_html.py): sidebar-and-cards replaced by a flat ID / Title / Detail / Status / Type table with type filter buttons and counts, cross-record search kept, two-line detail preview with expander, and a dynamic page title (H1 and document.title follow the active type). Terminology gets its own column view inside the Hub: Title / Thesis 1994 / Rebirth 2026 / Notes / Status / Type, with the Cells-vocabulary schema mapped by fallback so no row is blank. (3) Features page ordering fixed to newest-first (F### descending), matching every other log page.

Rationale & optionsOptions considered
  • Keep per-category tables on the audit (rejected - Miles asked for one flat table)
  • Convert the long-form log pages (decisions, PMs, tickets) to tables too (rejected - card layout reads better for long rationale text; they already carry filter buttons)
  • Flat table + filter buttons on audit, Hub and Hub-terminology only (chosen)

Rationale: Miles's verdict on the audit rework: 'wow this feature audit with category buttons is very good - please remember this.' The pattern gives one sortable scan of everything while the buttons restore the grouping that flattening removes. Applied only where content is genuinely tabular; forcing decisions or tickets into rows would be a regression. Note: gaad_audit.html is standalone (not rebuilt by gaad_build.py), so its restructure lives in the HTML itself.

P049
D125 newadoptedInteraction06 Jul 2026

Rapid Stage Select hardened against watcher loss (T015, addon v0_91)

The Rapid Stage Select watcher (F022, D119) could stop firing after an undo/redo, a Navigator visit or Reset GAAD Platform, because Blender clears bpy.msgbus subscriptions across those events and a breed interrupted before its finally ran could leave the re-entry busy flag latched. v0_91 makes the watcher self-healing through one shared recovery helper, _gaad_rapid_rearm(), which clears the busy flag and re-subscribes the active-object watcher. It is now called from four places: new undo_post and redo_post persistent handlers (the prime cause), at the end of the Reset GAAD Platform operator, on file load (replacing the load-only re-arm of v0_79), and from a new update callback on the gaad_rapid_select toggle so flipping it OFF then ON is a user-accessible recovery. Separately, the busy flag now carries a time() stamp and self-clears after a 2 s timeout in the notify guard, so an interrupted fire path can never wedge Rapid permanently. Re-subscribing does not itself breed: subscribe_rna notifies only on later changes, so the active object restored by an undo is not treated as a click. The change is additive - while Rapid is working normally there is no behaviour change - and it does not touch the single gaad.generate breeding path (D119).

Rationale & optionsOptions considered
  • Re-arm only on file load as in v0_79 (rejected - does not cover undo/redo, Reset or a mid-session loss)
  • A modal operator capturing clicks instead of msgbus (rejected - heavier, and D119 chose the additive msgbus watcher deliberately)
  • One shared _gaad_rapid_rearm() wired to undo_post / redo_post / Reset / toggle-ON, plus a timestamped busy timeout (chosen)

Rationale: T015 was the highest-priority open defect (Phigh): clicks silently stopped breeding, which is worse than a crash because nothing signals the loss. Routing every subscription-dropping event through one helper keeps the recovery logic in a single place, and the toggle-ON path gives Miles a manual reset if any unforeseen route still drops it. The busy timeout is the belt-and-braces guarantee that the flag can never wedge. Backtrack (F006) remains the eventual safety net for a misclick while ON; this decision only hardens the watcher, it does not add undo of a breed.

P048
D124 newadoptedPanel05 Jul 2026

Live panel is the spec of record; v2_7 direction built and evolved into the EVOLVE working hub

The panel mock-up line (v2_0..v2_7) served its purpose and is retired - the live addon panel is now the spec of record (Miles: 'panel is live, mock-up is dead'; cut_bundle v0.2 makes the Spec pair optional). The built direction: a LANGUAGE section at the top (AL radio with Objects inside, gated to PRAL), WORLD holding only language-independent scene settings, and EVOLVE as the working hub - First Generation (renamed from Initial Generation, auto-collapses LANGUAGE and WORLD on success), Next Generation, Rapid Stage Select, an always-active Colour pair ([Colour | Grey]) that live-recolours the world and Navigator at any generation, a single Show / Hide Labels toggle, and MUTATION (renamed from EVOLUTION) as a collapsible sub-section with its Population sub-group. Generator and Navigator scene jumps plus an icon-only Collapse / Expand All sit on an always-visible top row, with Reset GAAD Platform (was Reset World) on a slim row beneath; Reset collapses the panel on completion. STATUS is two short grouped lines (run state, then versions). All sections are collapsible chevrons; native Blender sub-panels were rejected because they cannot be collapsed programmatically, which would break Collapse All. Shape colours moved to the shared Scripts/gaad_palette.py, the single palette source for generator, tree and addon.

Rationale & optionsOptions considered
  • Native Blender sub-panels (bl_parent_id) as mocked in v2_4 (rejected - no Python API to collapse them, breaking Collapse All)
  • Prop-driven chevron sections with the v2_7 structure (chosen)
  • Keep maintaining the mock-up pair in lockstep with the live panel (rejected - the live panel moved faster; retired instead)

Rationale: The panel stabilised through hands-on iteration (addon v0_86 to v0_90) faster than the mock-up could track, so the artefact that people actually use is the honest spec. The EVOLVE hub groups everything touched per-cycle; set-once sections collapse away at Gen 1.

D123 newadoptedNaming05 Jul 2026

Architectural Language (AL) adopted: PRAL / GRAL / MHAL

The selectable vocabularies under GAAD are named Architectural Languages (ALs): PRAL (Primitives Architectural Language, built), GRAL (Garden Room Architectural Language, not yet built) and MHAL (Manhattan Architectural Language, not yet built). PAL is retired in favour of PRAL and MAL in favour of MHAL. HAL / House is left out of scope by Miles's call and is not shown in the picker; it remains in the historical records untouched. Design Language (DL) stays reserved for the master spec (D102). The panel picker is labelled Language; the scene property is gaad_architectural_language (replacing the gaad_design_language hook).

Rationale & optionsOptions considered
  • Keep calling the picker Design Language (matches D099/D102 wording but overloads DL, the master spec)
  • Architectural Language with PRAL / GRAL / MHAL (chosen - clean split from the master DL, pronounceable set)
  • Keep the original PAL / MAL acronyms

Rationale: AL keeps a clean three-layer hierarchy (GAAD platform, DL master spec, ALs as selectable vocabularies, Objects within an AL). PRAL is unmistakably Primitives where PAL read as a word; MHAL removes the MAL/HAL near-collision and keeps HAL free for House. Each acronym is a short distinctive prefix plus AL.

D122 newadoptedInteraction05 Jul 2026

Stage tools hardened: property-first resolver, Stage disarms Rapid, Present Stage render (F025)

The VIEW stage tools were reworked. Isolate Stage now resolves the target stage from the shared gaad_stage_number property carried by both the stage floor and the buildings, with exact-integer matching, replacing a fragile active-object name-regex that could silently do nothing; it now reports what it did. Pressing a stage tool disarms Rapid Stage Select first, so the selecting click can no longer breed the next generation before the view command runs. The Stage button became a self-labelling toggle (Isolate Stage / Show All Stages, drawn red while isolated). A separate Present Stage button (F025) renders the selected stage to a clean PNG in a new //Image folder: black studio world, key and fill sun rig, framed camera, other stages hidden from the render, materials as chosen (Brand or Grey).

Rationale & optionsOptions considered
  • Keep name-regex resolution and only patch the no-op
  • Resolve from the shared gaad_stage_number property, as champion selection already does (chosen)
  • Block the Stage button while Rapid is on, rather than disarm Rapid

Rationale: The real cause of Stage appearing dead was Rapid Stage Select breeding on the selecting click; disarming Rapid makes the stage tools behave as pure view commands. Property-first resolution mirrors the proven champion-selection path and removes a whole substring-leak class of bug (Stage_2 matching Stage_20).

D121 newadoptedPanel03 Jul 2026

EVOLVE and GENERATE panel groups; scene/HUD name rename OPEN

The seven action buttons at the base of the WORLD section are lifted out to TWO new top-level always-open panel sections, peer with WORLD / EVOLUTION / VIEW: EVOLVE (Initial Generation, Next Generation, Rapid Stage Select, Reset World) and GENERATE (Generator, Navigator, Navigator Report). Always-reachable whatever else the user has collapsed - matches the fact that these are the busiest controls. Rests on the same panel grammar as WORLD/EVOLUTION (D110 EVOLVE stance): world identity, evolutionary pressure, working actions, navigation, all named for what they actually do. Reset World stays with EVOLVE because reset IS an evolution action (resetting the world's evolution). SUB-QUESTION LEFT OPEN: whether the Design Studio scene (D058) and the corner HUD title should also rename to 'Generate' to align with the panel section - Miles's call: leave both unchanged for now, capture as an open decision to revisit.

Rationale & optionsOptions considered
  • One 'STUDIO' group holding all seven buttons
  • Two groups: EVOLVE + NAVIGATE
  • Two groups: EVOLVE + GENERATE (chosen, Miles's call - GENERATE mirrors what those buttons return to)

Rationale: The seven buttons had accumulated three different jobs in one place: breed/progress the world (Initial, Next, Rapid, Reset), jump to a different scene (Generator, Navigator), open a report (Navigator Report). Grouping them under one name always felt forced. Two honest sub-groups match the actions: EVOLVE is what the working session is DOING, GENERATE is where the design lives (return to the Generator scene, jump to the Navigator scene, read the report). Both always-open so they don't hide when other sections collapse - the panel's busiest controls should never be one click away from reachable. The sub-question of renaming the scene/HUD (currently 'Generator' from D058) is left open because that name is threaded through the code and records; a later session can address the naming with proper supersedes to D058 rather than half-doing it now.

D120 newadoptedArchitecture03 Jul 2026

Stage Size selector: five square options (60/100/150/200/300 m)

The WORLD panel gains a Stage Size selector alongside Grid Size. Stage Size is a five-value enum of square footprints: 60, 100, 150, 200, 300 metres. Gutter is fixed at 18% of stage size so the visual proportion holds at every scale (pitch = size + gutter). The 85 m Rebirth default is retired; the new default is 100 m - the closest urban-block choice on a clean number, matching the Chicago Loop scale. Rectangular stages (Manhattan-style ~80 x 275 m blocks) are captured as F023 for a later build - they touch the generator, Navigator, camera framing and spec together and deserve their own session. The old dropdown called Stage Size is renamed Grid Size (it was always the NxN grid selector, not physical size). Locked to Initial Generation with the other WORLD controls.

Rationale & optionsOptions considered
  • Keep the single 85 m stage from the Rebirth default
  • Add square-only selector with five preset sizes (chosen)
  • Add rectangular option immediately (deferred to F023 - own session)

Rationale: Reference block sizes: Portland 60 m walkable grid, Chicago Loop 100 m, Barcelona Eixample 113 m, London mews 50-80 m, Manhattan 80x275 m (rectangular), suburban US 400 m+. Five square presets cover the walkable-to-campus range with clean round numbers; 100 m is the honest current default. Gutter as a fixed 18% keeps visual proportion consistent - a 300 m block on a 60 m gutter would look packed, 60 m on a 60 m gutter would look sparse. Rectangular Manhattan blocks are genuinely different urban DNA and give the designer a real new tool, but adding them alongside the selector risks a half-built change - separated as F023.

D119 newadoptedInteraction03 Jul 2026

Rapid Stage Select shipped as an additive toggle (F022 v1, addon v0_79 + generator v0_40)

F022 is built as 'Rapid Stage Select': a toggle button in CREATE directly under Next Generation. While ON, clicking any object carrying gaad_variant_id breeds the next generation from it immediately, firing the SAME gaad.generate operator - Rapid adds a trigger, never a second breeding path. Next Generation keeps its exact existing behaviour (Miles's explicit call: keep current functionality, add the new button). Mechanism: a bpy.msgbus subscription on the active object, deferred one tick via bpy.app.timers with a window override, guarded by a busy flag, the Navigator-scene check, and the generator's own deselect-after-build. Re-armed on file load. Companion generator change (v0_40): when the toggle is ON, end-of-build framing raises clip_end but SKIPS the view_all recentre, so the user's viewpoint survives every breed; toggle OFF keeps the D034 reframe. The addon bump also carried the stage-label position fix (labels stacked at the world origin because v0_38+ from_pydata surfaces keep their origin at (0,0,0); the builder now reads the stage centre from the world-space bounding box).

Rationale & optionsOptions considered
  • Replace Next Generation with click-to-breed
  • A modal operator capturing clicks
  • Additive toggle + msgbus watcher firing the existing operator (chosen, Miles's call)

Rationale: First live test (P048): 'works v well and is super fast' and 'not distracting - keeps the human engaged' - the EVOLVE stance of D110 made real, running at 0.3s per generation (D118). Additive-toggle preserves the safe two-step for inspection (EXPLORE) and costs nothing when off. Known v1 limits, accepted: a misclick breeds while ON (Backtrack F006 is the eventual safety net, deferred - big topic, Miles), and the watcher can be lost after a Navigator visit or platform reset (T015, open - msgbus is cleared on undo/redo; hardening pass queued as addon v0_80).

P048
D118 newadoptedGenerator03 Jul 2026

Shared shape materials and batch datablock handling (generator v0_39)

The generator uses ONE shared material per primitive type for the whole GAAD world (GAAD_Cube_Material, GAAD_Pyramid_Material, GAAD_Dome_Material, GAAD_Wedge_Material, GAAD_Cylinder_Material), created once and reused by every object on every stage across generations, replacing one uniquely named material per primitive. Alongside it, the remaining per-primitive and per-datablock Python costs are removed: material_index is set with mesh.polygons.foreach_set, scene clearing collects every object across all stages into a single bpy.data.batch_remove (the T006-safe pattern) and purge_orphans batch-removes per pass, cos/sin are computed once per primitive rather than per vertex, unit geometries are cached, and the replay JSON is written at mm precision (3 decimals) with indent=1. The JSON remains the full per-object record including colour; stage surface materials are unchanged.

Rationale & optionsOptions considered
  • Keep one uniquely named material per primitive
  • Deduplicate materials by colour value
  • One shared material per shape type, world-wide (chosen, Miles's call)

Rationale: At a full 9x9 (~3,488 objects) Next Generation was creating ~3,488 near-identical materials and purging the previous ~3,488 one at a time - roughly 7,000 datablock operations per click for what is really a five-colour palette, since an object's colour is always its shape's palette colour (an inherited colour only survives while the shape stays the same). Shape-type materials are simpler and more honest than colour-keyed deduplication: the material IS the shape's identity. Measured baseline was 12.8s per Next Generation at 9x9/3,488; this pass targets the datablock churn and Python loops that remained after D116 removed bpy.ops from the per-stage path. VERIFIED in Blender 03 Jul 2026: 0.3s per Next Generation at 9x9 with 6,041 objects (was 12.8s at ~3,488) - roughly 40x faster at nearly double the population. Closes T012.

D117 newadoptedProcess03 Jul 2026

Session capstone: test-driven panel-lean and generation-performance pass (bundle 0_113)

A single working session took the addon from v0_72 to v0_78 and the generator from v0_35 to v0_38 through a tight build-test-fix loop with Miles. The day's design decisions, captured individually, were: lean the panel to only built controls (D113); keep the Integrity Check off the generation path with STATUS readouts instead (D114); make stage labels an on-demand panel action (D115); and make per-stage generation geometry bpy.ops-free (D116). Live Blender testing drove three tickets to fixes: 9x9 generation speed (T012, ~9s down to ~4s and lower), empty-preview clipping (T013), and first-run default-object clutter plus an unframed view (T014). The D112 automation - cut_bundle.py, the validator parity gate and D105 orphaned-file WARN, and the static-check Blender-runtime layer - was completed and used to cut the bundle. This record is the single index for the day; D113-D116 and T012-T014 hold the detail.

Rationale & optionsOptions considered
  • Leave only the granular D113-D116 + T012-T014
  • Add a capstone decision indexing them (chosen)
  • Fold everything into one decision instead of granular records

Rationale: The guiding principle held throughout: generation writes JSON only, and everything visual - labels, reports, the Integrity Check - renders on demand, so the working loop stays fast (Miles's 'no HTML updates per generation; replay on demand' call). One capstone ties the day's granular records into a coherent move rather than a scatter of edits, and records the working method D112 set up: build-test-fix in one session, records captured at the end.

D116 newadoptedGenerator03 Jul 2026

Per-stage generation geometry is bpy.ops-free (from_pydata surfaces and joined buildings)

Every per-stage object the generator builds is now raw mesh via from_pydata, with no bpy.ops in the per-stage loop. The buildings were already joined-mesh (D106); the stage surface is converted from bpy.ops.primitive_cube_add + transform_apply to from_pydata (generator v0_38), matching the addon preview's geometry. The only remaining bpy.ops per generation are one-time (champion frame, title panel, view framing) and do not scale with grid size.

Rationale & optionsOptions considered
  • Leave the surface on bpy.ops
  • Batch the surfaces then apply the scale once
  • Build the surface as raw mesh via from_pydata (chosen)

Rationale: Each bpy.ops forces a full dependency-graph re-evaluation of a scene that grows as the build proceeds - a quadratic cost that bit hardest at 9x9 (162 surface ops). Direct mesh-data creation removes them, so 9x9 does the same handful of scene re-evaluations as 3x3.

D115 newadoptedDesign03 Jul 2026

Stage id labels are an on-demand panel action, not generator-built

The generator no longer builds the per-stage id labels (generator v0_36); they were the expensive per-stage bpy.ops.text_add (one extruded text object per stage, each forcing a scene re-evaluation). Labels are now a VIEW > Show / Hide Stage Labels toggle (addon v0_76) that builds font-curve labels for the current stages on demand with no bpy.ops, and removes them with the T006-safe pattern. Labels do not persist across generations.

Rationale & optionsOptions considered
  • Keep labels built by the generator
  • A generator flag to build labels only when set
  • On-demand panel toggle; the generator builds none (chosen)

Rationale: Labels are a viewing aid, not design data, so they should not tax every generation. Moving them off the generation path was the single biggest 9x9 speed win (roughly 9s to 4s). Building on demand honours the same JSON-now / render-on-demand principle as reports (D114).

D114 newadoptedProcess03 Jul 2026

Integrity Check stays off the generation path; STATUS carries integrity and generation-time readouts

A brief experiment (addon v0_74) ran a silent Integrity Check after every generation; it was removed (v0_76). Generation writes JSON only and renders no HTML - the Integrity Check renders on demand from its button (JSON-now, render-on-demand). The STATUS panel gains a readout of the last Integrity Check result (pass / fail), updated on load and on the button, and a live generation-time readout in seconds after each run (addon v0_78).

Rationale & optionsOptions considered
  • Keep the per-generation integrity check
  • Run only the fast runtime checks after generation
  • Remove it from the generation path; STATUS line plus on-demand button instead (chosen)

Rationale: The integrity check validates bundle structure, addon source and HTML records - none of which a generation changes - so running it per generation was pure cost (file reads plus an HTML report write) for no signal, and it worsened the already-slow 9x9 generation. Miles's principle: no HTML updates per generation; data lives in JSON and reports replay on demand, like Navigator Report. The STATUS line gives the same feedback without the cost.

D113 newadoptedDesign03 Jul 2026

Panel lean pass: remove Garden Room, the Design Language quick-select, and dead properties

In the working-loop panel (addon v0_73) remove the Design Language quick-select (Primitives / Garden Room) and the Garden Room leaf. Primitives is the only built language, so the Objects picker shows directly under CREATE. Remove three scene properties left registered but never drawn since earlier section deletions: gaad_show_design_language, gaad_dl_subtab, gaad_show_mutation. Keep the gaad_design_language enum (with GARDEN_ROOM and MANHATTAN) in registration as the future GRAL / MAL hook; it simply leaves the panel until a second language is built.

Rationale & optionsOptions considered
  • Leave the quick-select and Garden Room in place
  • Remove Garden Room only (leaves a pointless one-option selector)
  • Remove the quick-select, show the picker directly, keep the enum as a hook (chosen)

Rationale: Applies D111 (built things earn panel space). Garden Room was an orphan leaf - selecting it only showed 'No object set', with no GRAL generator behind it and the generator never reading the enum. With a single built language a selector is dead weight. Keeping the enum registered preserves the hook without showing an unbuilt control (D072: no placeholders).

D112 newadoptedProcess03 Jul 2026

Development efficiency: GAAD Skill, bundle automation, session-per-bundle

Direction agreed with Miles after he observed sessions slowing: (1) a GAAD SKILL - a durable skill file encoding the standing rules (four-point version check, JSON -> MD -> HTML regeneration order, bundle lockstep and naming, no em dashes, record schemas, zip procedure) so every session starts with the rules loaded instead of re-taught from memory; (2) BUNDLE AUTOMATION - a tools script (cut_bundle.py) performing version bumps, full regeneration, static check, lockstep verification and zip in one command; (3) SESSION-PER-BUNDLE - start each bundle in a fresh conversation, with HANDOVER.md plus CURRENT_ACTIONS.md as the context transfer (long conversations are the main cause of slower processing and stale-context errors); (4) evaluate CLAUDE CODE for working directly in the local Development folder and running the static check against real Blender (blender --background) - runtime testing this chat environment cannot do. Skill + automation build is the centrepiece of an upcoming bundle. Artifacts were considered and skipped: the Records Hub already serves that role, offline and versioned.

Rationale & optionsOptions considered
  • Continue as-is with memory summaries
  • Skill + automation + fresh sessions (chosen)
  • Move all development to Claude Code immediately (evaluate first instead)

Rationale: The conversation itself had become the store of procedure - slow to carry, fragile to transfer, and the breeding ground for errors like T008. Encoding procedure as files (skill + scripts) makes it durable, versioned and testable, in the same spirit as the records system itself.

D111 newadoptedPanel03 Jul 2026

Panel v2_3: the working-loop panel (batched UX amendment)

The batched amendment under the D107 sanction-then-batch protocol, covering the rapid UX rounds Miles drove by live testing (addon v0_69 through v0_72, mock-up v2_2/v2_3 in lockstep): (1) Stage Size promoted from the buried Parameters sub-tab to the foot of GAAD Lab directly above Reset - matching the working flow Reset -> pick Stage Size -> Initial Generation; always editable. (2) LIVE STAGE PLATFORM PREVIEW: changing Stage Size between runs rebuilds the empty platform to NxN immediately (pure-mesh, no bpy.ops in the update callback, T006 safe pattern, generator-parity layout; only Stage_N_Surface objects are swept - Navigator lineage surfaces are never touched; mid-run the change is a no-op until the next Initial Generation). (3) Design Language quick-select at the top of CREATE: Primitives, then Garden Room - same property as the old selector. (4) Orthogonal moved to the bottom of Evolution Rules with the terse label 'Orthogonal' (degrees text removed). (5) The truncated 'Choose the object set...' header line removed; toggles stand alone. (6) Parameters emptied. (7) The DESIGN LANGUAGE section DELETED: after the above it held a duplicated selector, four unbuilt placeholders and one functional leaf - Objects - which is rescued into CREATE under the quick-select, contract view intact; non-PAL languages show 'No object set for this language yet.' Manhattan (MAL) loses its panel presence until built; the DL data is untouched (the panel is a view onto the DL, D102). This amendment RETIRES the v1_0-era principle that non-functional leaves stay visible in angle brackets - the reflow's rule is that built things earn panel space. Static check v0.4 expectations updated to match.

Rationale & optionsOptions considered
  • Keep DESIGN LANGUAGE as a slim reference section
  • Delete with Objects rescued into CREATE (chosen)
  • Per-change spec amendments instead of one batch (rejected by D107 protocol)

Rationale: Every item came from Miles working the panel live: Stage Size was buried and truncated; mutation had been unfindable; the Objects box was lock theatre; the DESIGN LANGUAGE section had emptied itself into a shell ('delete Design Languages from panel. We dont need this any more'). The panel now reads as one vertical working loop: language -> objects -> generate -> rules -> navigate -> records -> platform.

D110 newopenDesign Language02 Jul 2026

Evolve / Explore / Backtrack: the platform's mode grammar

Direction agreed, implementation deferred (Miles: open, no action today). The platform has three fundamental stances toward the design space, named by Miles: EVOLVE (selection breeds instantly - the world is hot; forward motion), EXPLORE (selection is safe - orbit, inspect, Navigator; standing still), BACKTRACK (step back through the lineage - F006 promoted from convenience utility to core verb). Forward, still, back: the complete verb set of genetic design. When implemented, the triad becomes the panel's organising principle - the mode you are in sits at the top and everything arranges beneath it. Naming candidates considered and rejected: Play/Pause (transport metaphor is right but 'Play' implies time passing without the user's click - GAAD never breeds on its own).

Rationale & optionsOptions considered
  • Play / Pause transport metaphor
  • Live / Safe
  • Evolve / Explore / Backtrack (agreed direction)

Rationale: Emerged from Miles's Rapid Evolution request (F022) and his usage narrative: click, click, click, click - pause - orbit, inspect - resume - click, click - Navigator - explore. The pause state and the Navigator visit are the same mental state ('I am looking, not breeding'), so the panel should organise around states, not tool categories. Also names something the 1994 thesis system never had: a stance toward the design space.

D109 newadoptedPanel02 Jul 2026

Panel v2_1 reflow: subtraction first

The panel is reflowed per mock-up v2_1 (tested hands-on by Miles before any addon change). REMOVED: DEVELOPMENT (-> Records Hub button, D108), SETTINGS (version strings duplicate the STATUS line; Last Full Release moves to the Hub page), TOOLS (was empty), and GAAD Studio (DEFERRED, not deleted - Miles is not developing Studio yet; it returns to the spec when its development resumes). RELOCATED: Reset GAAD Platform to the foot of GAAD Lab beside Integrity Check (platform-level actions together; keeps its confirm dialog). PROMOTED: Evolution Rules out of the Design Language dropdown into CREATE as a collapsible block directly under Next Generation - Miles could not find mutation, buried two levels deep behind a dropdown; the sliders are now always editable, since the generator re-reads them on every run (the old 'Locked - used for this run' state on rules was UI-imposed, not real). One home, not two: Evolution Rules no longer appears in the DL sub-tab list (D102 cover: the panel is a VIEW onto the DL; the DL still owns Evolution Rules as data). REDESIGNED: the Objects sub-tab becomes a CONTRACT VIEW - mid-run one read-only line showing the actual locked object set, toggles rendered only between runs when they work (Miles: 'object panel sucks' - the locked-but-clickable-looking mixed states were the worst of both). COLLAPSE: 'Collapse Sections' removed; 'Collapse All' is one two-way toggle whose label flips to 'Expand All' when everything is closed (Miles's mock-up feedback). The three tech-spec Section 3 drift points resolve toward the live addon (Navigator Report name kept; the DEVELOPMENT drift dissolves with the section). Implemented as addon v0_68 against mock-up v2_1; static check v0.3 expectations updated to match.

Rationale & optionsOptions considered
  • Patch individual complaints without a reflow
  • Full restructure including the Evolve/Explore/Backtrack triad now
  • Subtraction-first reflow now, triad reserved (chosen)

Rationale: Miles's hands-on feedback across the 0_107/0_108 test rounds: 'the panel is causing me problems and is not flowing well'. Subtraction first: four sections gone or replaced by single buttons removes most of the friction before any restructuring. Reference material becomes compact and read-only while working; controls appear where and when they act.

D108 newadoptedPanel02 Jul 2026

Records Hub replaces the nine DEVELOPMENT buttons

The DEVELOPMENT section's nine record buttons are replaced by ONE 'Records Hub' button (HOME icon) that opens Records/gaad_records.html - every record type, one searchable, fully offline page. Resolves the panel-wiring question parked since the Hub was built in 0_105 (replace vs sit alongside): REPLACE, per Miles's call ('development settings and tools need deleting, they serve no purpose, one new button to Hub (home) would be nice').

Rationale & optionsOptions considered
  • Hub alongside the nine buttons
  • Hub replaces the nine buttons (chosen)
  • No Hub wiring (status quo)

Rationale: The Hub aggregates all record entries with search; nine single-purpose buttons were panel bloat from the moment the Hub existed. 'Home' is the right mental model: the front door to the project's memory.

D107 newadoptedProcess02 Jul 2026

Panel spec unfrozen; ownership with Claude; sanction-then-batch protocol

The v1_0 panel spec freeze (D100) is lifted by Miles's explicit call: 'I am happy to unfreeze the panel spec so we can update as needed, you own it.' Panel spec ownership sits with Claude as Specification Owner: Miles sanctions direction; Claude owns coherence, consistency and structural detail, iterating on the mock-up chain and prompting Miles when a formal amendment to the spec document is warranted, batching several settled items into one amendment rather than churning the document per change. Miles approves each amendment before it lands in the records.

Rationale & optionsOptions considered
  • Keep the freeze and log feedback for a future revision
  • Unfreeze with per-change document updates
  • Unfreeze with sanction-then-batch amendments (chosen)

Rationale: Miles is the first person working the panel hard across generations, scene switches and resets, and reported it 'not flowing well' - drift between specced-well and works-well-in-the-hand is exactly the evidence the anti-churn discipline (D103) says should drive the next revision. The sanction-then-batch protocol keeps the spec document stable and authoritative while the working layer iterates.

D106 newadoptedArchitecture02 Jul 2026

Fast geometry: direct mesh construction, joined per variant

From generator v0_33, variant primitives are built as raw mesh data (pure-Python vertex/face construction, replicating the v0_32 primitive layouts exactly) and joined into ONE mesh object per stage, replacing one bpy.ops object per primitive. Each primitive keeps its own material as a slot on the joined mesh (faces assigned by material_index) and its full parameters plus a logical object_name in the replay JSON, which remains the record of every individual primitive. The joined object carries variant-level properties (gaad_variant_id, gaad_stage_number, gaad_object_count, gaad_shape_types, gaad_is_generated), so champion selection by clicking is unchanged. Stage furniture (surface, labels, title panel, camera, sun) is out of scope: fixed overhead, not the scaling problem. The 3D view, materials, rendering and solar behaviour are unchanged: same polygons, same materials, same placement. Incidental fix: the v0_32 wedge face list carried a duplicated slope face with mixed winding (invisible in the double-sided viewport); the wedge is now a clean 5-face closed solid with the same vertex positions.

Rationale & optionsOptions considered
  • Keep one bpy.ops object per primitive (status quo)
  • Direct mesh construction only, still one object per primitive
  • Linked mesh data (instancing) - shares mesh datablocks but object count unchanged
  • Direct mesh construction + join per variant (chosen)
  • Geometry nodes per stage (F015 - remains the candidate for future languages/city scale)
  • Lazy build - only construct stages in view, regenerate on demand (D030-adjacent, deferred)

Rationale: Blender's dependency graph degrades with OBJECT COUNT, not polygon count. A 5x5 world at typical object counts already places hundreds of primitive objects per generation; beyond 5x5 the viewport, selection and bulk deletion all suffer (T006 is a bulk-deletion symptom). Joining collapses object count from N_stages x object_count to N_stages, flat as worlds scale, and removing bpy.ops from the variant path removes a full scene-update per primitive plus a transform_apply per primitive. The scene becomes a render of the JSON record rather than the record itself, which strengthens the decisions-become-data principle (D008): the semantic identity of every primitive lives in the JSON. Miles confirmed the forward path before adoption: complex buildings and cities per stage remain possible (join granularity is a dial - per variant now, per building later; polygon count, which Blender handles well in a single mesh, replaces object count as the limit), and a future slow path can rebuild any variant from the JSON as separate editable objects for the chosen final design. Accepted tradeoffs: no per-element viewport selection or per-element modifiers on generated variants; per-primitive custom properties replaced by variant-level properties plus the JSON. Verified by out-of-Blender tests: vertex-layout parity with v0_32 per shape, closed-solid winding (signed-volume positive and translation-invariant), exact volumes for cube/pyramid/wedge and faceted-band volumes for cylinder/dome, placement and rotation parity, and an end-to-end joined-build test (material slots, material_index ranges, properties, JSON object_name writeback).

D105 newopenConvention02 Jul 2026

Orphaned reference documents in Records/ need indexing

Seven reference/analysis documents in Records/ (gaad_charter.md, gaad_brand.md, gaad_roadmap.md, gaad_episode_plan.md, gaad_id_mapping.md, gaad_project_background.json, gaad_1994_audit.md) sit outside the JSON -> MD -> HTML record pipeline and are not referenced by the technical specification, any generator, or any other record. They are functionally orphaned: present but undiscoverable except by browsing the folder directly. Logged as an open decision rather than fixed silently, since resolving it (index all seven from the tech spec, consolidate some, or retire stale ones such as gaad_1994_audit.md now that gaad_audit.html supersedes it) is a content call, not a mechanical fix. Marked as orphaned in the Section 4 folder tree (gaad_technical_spec.json) so the gap is visible rather than requiring inspection to notice. Follow-up action (not built yet): add an orphaned-file WARN check to gaad_static_check.py Layer 1 - a Records/ file that is neither a record's .json/.md/.html trio, nor a generate_*.py, nor referenced in any technical-spec 'see' array, flagged as a warning (not a fail, since orphaned is not the same as broken).

Rationale & optionsOptions considered
  • Leave as-is (status quo)
  • Index all seven from the tech spec with one-line descriptions
  • Review each file individually - index, consolidate, or retire
  • Fold them into the Records Hub as a tenth category

Rationale: Matches the pattern already surfaced in D031 and Section 9 (File Naming Conventions): drift and gaps should be tracked as decisions so they get resolved deliberately, not accidentally. The automated-check follow-up converts tonight's manual discovery into a permanent guard against the same class of drift recurring unnoticed.

D104 newadoptedProcess01 Jul 2026

DL v0.03 specification filed into the bundle under Claude's ownership

The GAAD Design Language Specification v0.03 (owner: Claude, Specification Owner per P045) is filed into the versioned bundle in Spec/, as both the authoritative .docx and a hyphen-clean .md reference extraction, alongside the frozen panel mock-up v1_0. This stops the frozen GRAL baseline (D103) from living only in chat history. The bundle carrying it is named GAAD Development 0_103 to avoid confusion with the separately-scoped 0_102 task list. Authoring the DL as gaad_design_language.json in the house record style (so it obeys JSON -> MD -> HTML like every other record) remains outstanding and is developed alongside GRAL v0.01, not in isolation.

Rationale & optionsOptions considered
  • Leave the DL spec in chat/workspace only
  • File the .docx into the bundle now; author the JSON later alongside GRAL
  • Author the JSON immediately before filing anything

Rationale: A frozen baseline that GRAL depends on should travel with the bundle. Filing the document now closes the immediate gap; authoring the JSON is deferred deliberately so the schema is proven against a real language (GRAL) rather than designed in isolation, per the spec's own development sequence.

P044
D103 newadoptedProcess01 Jul 2026

Freeze DL v0.03 for the duration of GRAL (anti-churn)

GAAD DL v0.03 is frozen as the baseline specification for the entire duration of GRAL v0.01. GRAL is implemented against v0.03 exactly as peer-reviewed and approved, with no specification changes mid-implementation. The five peer-review recommendations (required-but-empty human-centred sections; unknown-key validation as warning within a reserved namespace; a Terminology section referencing gaad_terminology.json; a shared GAAD Principles record; and an explicit idea-to-standard lifecycle) are logged and parked as the v0.04 agenda, to be applied after GRAL and informed by it. Anything GRAL surfaces that appears to need a spec change is added to the v0.04 backlog rather than reopening v0.03. The freeze may only be broken by a genuine blocker where GRAL cannot proceed, and only as a deliberate, logged exception.

Rationale & optionsOptions considered
  • Issue v0.04 now folding in all five recommendations before GRAL
  • Freeze v0.03 for GRAL's duration and park the recommendations for v0.04

Rationale: Applying the recommendations before GRAL risks architecture churn - stopping to redesign the architecture every time implementation reveals a detail, so the spec never stabilises and GRAL never ships. Freezing the approved baseline breaks that loop. Recommendations 1 and 3 in particular will be better shaped by what GRAL actually needs, so parking them is not just safer but produces better decisions.

P044
D102 newadoptedArchitecture01 Jul 2026

GAAD Design Language (DL) is the master architecture; panel is a view; JSON is source of truth

The GAAD Design Language becomes the authoritative architectural model from which all Design Languages (PAL, GRAL, MAL, HAL) inherit. The DL defines the data model, not the Blender interface. The Blender Panel is a presentation layer onto the DL and is not required to expose every DL field or share its structure. JSON remains the single source of truth; documentation, reports and interfaces are derived from it. The DL comprises eleven sections (Metadata/Identity, Philosophy, People, Place, Experience, Objects, Parameters, Relationships, Evolution Rules, Evaluation Criteria, Initial State), with human-centred sections optional so a thin language such as PAL validates without inventing content. The Project Design Record is a SEPARATE, linked record type (record_type 'design_record'), because the Language is stable while the Record grows. Two owner-level corrections were made to the coordinated response: (1) Seed is a run control belonging to the Design Record, not a DL section, so it maps to no DL section; (2) Getting Started is derived help generated from Metadata and Philosophy, not the storage location of Metadata. Issued as GAAD DL v0.03 for peer review; GRAL becomes the first reference implementation to validate the spec before v1.00.

Rationale & optionsOptions considered
  • Keep the panel and DL structurally identical (seven-part panel = DL)
  • Make the DL the master data model and treat the panel as a partial view onto it

Rationale: The panel and the DL were drifting into two competing structures. Declaring the DL the master and the panel a view resolves the collision cleanly and matches GAAD's existing JSON-source discipline. The two owner corrections keep the DL-to-panel mapping internally consistent in both directions.

P043P044
D101 newadoptedArchitecture30 Jun 2026

v0_101 panel refinements; Navigator rename; GAAD Studio added

Several refinements built on the v1_0 spec (bundle 0_101, addon v0_64). Objects and Evolution Rules stay visible after Initial Generation but are greyed out so the run's settings remain inspectable. The GAAD Studio panel is added at the same level as GAAD Lab (CREATE: Initial Generation + Next Generation; VIEW: 3D/Perspective/Plan/Stage; Reset GAAD Platform at the bottom). Collapse Panel is split into Collapse All and Collapse Sections. The tree scene is renamed from 'GAAD Design Evolution' to 'GAAD Navigator' across generator, tree and addon; the HUD titles change to 'Navigator' and 'Generator'; and the report becomes the 'Navigator Report' with GAAD-branded HTML.

Rationale & optionsOptions considered
  • Hide Objects/Evolution Rules after Gen 1 (previous behaviour)
  • Keep them visible but greyed so the run stays inspectable

Rationale: At this stage of development it is important to see what objects and rules drove a generation even after it has run; hiding them lost useful context. Renaming the tree scene, HUD and report to Navigator aligns the whole platform with the panel's Navigator terminology.

D100 newadoptedArchitecture30 Jun 2026

v1_0 panel spec adopted as locked blueprint; built into the real addon

The GAAD panel structure is frozen at v1_0 (GAAD panel mock-up v1_0) and adopted as the locked blueprint of record. The real addon (gaad_rebirth_addon_v0_63) is restructured to match it: STATUS, CREATE, DESIGN LANGUAGE with a Current Design Language selector and seven sub-sections (Getting Started, Knowledge, Objects, Parameters, Evolution Rules, Seed, Initial State), VIEW, DEVELOPMENT, SETTINGS, TOOLS, plus Integrity Check and Collapse Panel at the bottom of GAAD Lab. Where a leaf is not yet functional it is shown wrapped in angle brackets. OBJECT COLLECTION folds into Objects and MUTATION folds into Evolution Rules. A Technical Specification index (gaad_technical_spec) is added under DEVELOPMENT. This milestone bundle jumps to GAAD Development 0_100 to mark its significance. The frozen mock-up is kept as a separate Spec artifact and is never folded into the addon chain.

Rationale & optionsOptions considered
  • Keep iterating the mock-up without committing to a real build
  • Freeze the spec at v1_0 and build the real addon to match it

Rationale: The panel design had stabilised across many small iterations and a critical architectural review scored 9/10. Freezing it as a versioned blueprint and building the real addon against it locks in the agreed structure, while the angle-bracket convention keeps not-yet-built leaves honest and visible rather than hidden.

P042
D099 newadoptedArchitecture30 Jun 2026

DESIGN LANGUAGE panel section added; MUTATION gated by selection

New DESIGN LANGUAGE section added to the panel between CREATE and MUTATION, implementing D098. Mutually exclusive selector (single EnumProperty, gaad_design_language) offering Garden Room, Manhattan and Primitives; default Primitives. Garden Room and Manhattan are selectable now but show "Not yet built - no parameters available" since neither language has primitives or generation logic yet. MUTATION section is gated on the selection: shows the existing five sliders only when Primitives is active, otherwise shows "No parameters yet". CREATE buttons remain active regardless of language selected, so the user is never blocked, only informed.

Rationale & optionsOptions considered
  • Grey out Garden Room and Manhattan entirely until built
  • Auto-revert to Primitives if an unbuilt language is selected
  • Allow selection now, show an honest not-yet-built message, keep CREATE usable

Rationale: Selecting an unbuilt language should not feel broken or block the user from using GAAD as normal. An honest in-panel message keeps the mechanism visible and testable now, ahead of HAL/GRAL primitive work which depends on the outcome of D038.

D098 newadoptedArchitecture30 Jun 2026

GAAD as platform, AL languages as Object Collection modes

GAAD confirmed as the underlying platform: one breeding engine, one Records system, one panel, one HUD, shared across all Architectural Languages. Object Collection becomes a language selector (MAL, HAL, GRAL, and future languages) followed by primitives specific to that language. The existing Cube/Pyramid/Dome/Wedge/Cylinder set remains the generic GAAD default for now; formal reclassification as MAL primitives is deferred to a future decision.

Rationale & optionsOptions considered
  • GRG/HAL/MAL as separate standalone projects with duplicated engines
  • GRG/HAL/MAL as a feature bolted onto existing Object Collection without a language concept
  • GAAD as platform with Object Collection offering selectable Architectural Languages

Rationale: Garden rooms, houses and Manhattan-style towers are structurally different vocabularies of form but share the same genetic breeding need, Records system, panel and HUD. Treating them as languages within one platform avoids duplicating the engine while keeping each language's primitive set uncrowded and distinct.

P041
D097 newadoptedFeature30 Jun 2026

Layer 1 static test harness introduced

New script gaad_static_check.py added to Scripts/. Checks: blend file present, expected folders present, expected scripts present, expected records present, four-point addon version match, em dash scan, expected panel labels present, expected operators present, HTML records well-formed. Writes a branded gaad_test_report.html to Reports/ and opens it automatically. New operator gaad.run_test and "Test Script" button added to TOOLS.

Rationale & optionsOptions considered
  • No automated testing; continue manual checklist per release
  • Build a Layer 1 static check script run from the panel

Rationale: Manual checklists do not scale and are error-prone across many small panel changes per session. A one-click static check run from the panel catches regressions in seconds, before the bundle is used.

P039
D096 newadoptedArchitecture30 Jun 2026

Stage Size and Stage Gutter written to scene properties by generator

Generator writes gaad_stage_size_m and gaad_stage_gutter_m to the scene as custom properties immediately after building the world. Addon reads these properties for display rather than hardcoding the values.

Rationale & optionsOptions considered
  • Hardcode stage size/gutter values in the addon
  • Have the generator write them to scene properties for the addon to read

Rationale: Keeps the addon decoupled from generator internals; if stage geometry constants ever change, the addon automatically reflects the new values with no addon code change required.

D095 newadoptedFeature30 Jun 2026

Perspective View built (F012)

New operator gaad.perspective_view added: eye-level perspective view of the stage grid, 82 degree tilt, distance 250. Button "Perspective" sits below "3D" in the VIEW section.

Rationale & options

Rationale: Closes out F012 from the feature backlog, giving a human eye-level viewing angle distinct from the existing top-down-leaning 3D view.

D094 newadoptedArchitecture30 Jun 2026

EXPLORE renamed to VIEW with simplified button labels

EXPLORE section renamed to VIEW. Buttons simplified: "3D View" to "3D", "Plan View" to "Plan", "Stage Isolator" to "Stage". New "Perspective" button added below "3D" (see D095).

Rationale & optionsOptions considered
  • Keep EXPLORE name and verbose button labels
  • Rename to VIEW with terse labels

Rationale: VIEW more accurately describes camera/viewport controls now that Generator and Navigator moved to CREATE. Terse labels read faster in a narrow panel.

D093 newadoptedArchitecture30 Jun 2026

CREATE section restructured: Initial Generation, Next Generation, Generator, Navigator, Report

CREATE section rebuilt with five items in order: Initial Generation (renamed from Create First Generation; greyed out after Gen 1), Next Generation (renamed from Create Next Generation, then Start Generation), a separator, Generator (renamed from Design Generator, moved from EXPLORE), Navigator (renamed from Design Tree, moved from EXPLORE), a separator, and Report (renamed from Design Evolution Report, moved from KNOWLEDGE; now runs the report script and opens the HTML in one click).

Rationale & optionsOptions considered
  • Leave Design Generator and Design Tree under EXPLORE
  • Move them into CREATE alongside generation controls

Rationale: Generator and Navigator are core creation-flow destinations, not exploratory extras; grouping them with Initial/Next Generation and Report makes CREATE the single home for the full design workflow.

D092 newadoptedArchitecture30 Jun 2026

CONFIGURATION section renamed to SETTINGS

The CONFIGURATION panel section (script versions, last release) renamed to SETTINGS throughout the addon (draw, register, unregister).

Rationale & optionsOptions considered
  • Keep CONFIGURATION
  • Rename to SETTINGS

Rationale: SETTINGS is more familiar terminology to most software users than CONFIGURATION.

D091 newadoptedArchitecture30 Jun 2026

STATUS line redesigned to compact pipe-separated format

STATUS section changed from a multi-line label block to a single compact pipe-separated line: "Gen N | NxN | v_addon | v_generator | object_count". Dots shown for any segment not yet known (before Gen 1: "... | ... | v_addon | ..."). Always visible, not collapsible. Object count formatted with thousands separator.

Rationale & optionsOptions considered
  • Keep multi-line STATUS labels
  • Single compact pipe-separated line

Rationale: A single line reads faster at a glance and matches how a HUD or dashboard typically communicates live state, without consuming panel vertical space.

D090 newadoptedArchitecture29 Jun 2026

GAAD Lab panel restructure into collapsible sections

Rename the developer panel 'GAAD Rebirth' to 'GAAD Lab' and reorganise it into eight collapsible sections: OBJECT COLLECTION, CREATE, MUTATION, KNOWLEDGE, EXPLORE, DEVELOPMENT, CONFIGURATION, TOOLS. The GENERATE heading becomes CREATE; Reset GAAD Platform moves under TOOLS; Design Evolution Report sits under KNOWLEDGE; the record links sit under DEVELOPMENT; the version block becomes its own CONFIGURATION section; Object Collection is its own section above CREATE (still shown only before Gen 1). Mutation labels are Title-Cased and 'Min/Max objects' become 'Minimum/Maximum Objects'. Lab panel only, panel-only with no algorithm changes, nothing removed. Framework / AL / Brief / Knowledge Records are deliberately NOT added (Charter principle: the user sees only what exists). Implemented in addon v0_54 then v0_55 (em dashes scrubbed).

Rationale & optionsOptions considered
  • Keep the flat GENERATE/EXPLORE prototype layout
  • Restructure into named collapsible sections (GAAD Lab)

Rationale: The panel had grown bottom-up so everything carried equal weight. Grouping by intent with collapsible sections makes the architecture read like GAAD rather than a prototype, while staying low-risk (no algorithm change) so testing continues immediately. It sets a stable information architecture that pays dividends for every release that follows. Builds on F009.

P038
D089 newadoptedUI28 Jun 2026

Scene backgrounds set to pure black

Changed the viewport and world background colour from Deep Teal (#1A535C in the generator) and brand dark (#0D0E11 in the addon) to pure black (#000000) across both scripts. The generator's world node and solid-mode viewport are now black; the addon sets the viewport background to black on load and on Create First Generation.

Rationale & optionsOptions considered
  • Keep Deep Teal / brand dark (rejected: Miles preferred black for cleaner contrast)
  • Pure black #000000 (chosen — cleaner, lets the stages and forms stand out)

Rationale: Black provides the strongest contrast against the neutral stage surfaces and coloured primitives. The Deep Teal and brand dark were adopted at different points (D041, D087) but Miles preferred a simpler, cleaner black backdrop for the working environment.

D088 newadoptedRecords28 Jun 2026

Release Notes as styled HTML (same card feed as other records)

Generate gaad_releases.html from gaad_releases.json using the same modern card-feed template (gaad_html_modern.py) as all other record types. Added to generate_all_html.py pipeline. The addon's Release Notes button now opens the HTML (with release.txt fallback). Release Notes moved from the Reports section into Development Reports.

Rationale & optionsOptions considered
  • Keep release.txt only (rejected: inconsistent with HTML records)
  • Styled HTML from JSON like other records (chosen — consistent, modern, filterable)

Rationale: All other record types already have the JSON → MD → HTML pipeline. Release Notes was the odd one out with a plain text file. Bringing it into the HTML system gives it the same visual treatment — gold timeline, expandable cards, version chips — and makes it accessible from the Development Reports section alongside all other project records.

D087 newadoptedVisualisation28 Jun 2026

Viewport background set to GAAD brand dark (#0D0E11)

Set the Blender 3D viewport background colour to GAAD brand dark (#0D0E11 = Midnight) using shading.background_type='VIEWPORT' and a custom background_color. Applied on addon registration and on Create First Generation to catch viewports created after load.

Rationale & optionsOptions considered
  • Blender theme default (rejected: grey background doesn't match GAAD brand)
  • World shader background (rejected: only visible in rendered mode)
  • Viewport custom background colour (chosen — works in solid/material preview, self-contained)

Rationale: The GAAD brand uses a very dark (#0D0E11) background throughout its HTML records, HUD overlay, and visual identity. Setting the viewport to match creates a cohesive visual experience. The setting is per-viewport and does not modify the Blender theme globally.

D086 newadoptedBugfix28 Jun 2026

Reset fix — stray objects when resetting from Design Evolution scene

Replace the selection-based object deletion in the Reset operator (bpy.ops.object.delete()) with bpy.data.objects.remove(obj, do_unlink=True). The old method only worked for objects in the active scene — when Reset was triggered from the Design Evolution scene, Generator scene objects could not be selected and survived as strays. The new method is scene-independent and also scans ALL scenes for stray GAAD objects.

Rationale & optionsOptions considered
  • Switch to Generator scene before deleting (rejected: fragile, changes user context)
  • Use bpy.data.objects.remove() throughout (chosen — scene-independent, robust)

Rationale: bpy.data.objects.remove() is the correct low-level API for scene-independent object removal. Step 6 (Evolution scene cleanup) was already using it — applying the same approach to Steps 1-3 makes the entire Reset operator consistent and reliable regardless of which scene the user is in.

D085 rebirthadoptedGenome28 Jun 2026

5×5 grid added; grid labels tidied (2×2 Classic / 3×3 / 4×4 / 5×5)

Add a 5×5 grid option (25 stages) to the Stage Size selector. Drop the 'Default' and 'Testing' suffixes from the 3×3 and 4×4 labels — only 2×2 keeps its 'Classic' subtitle. The generator's build_stage_grid(n) already handles any N; changes are to the addon enum and the generator's _grid_size() validator.

Rationale & optionsOptions considered
  • Keep 3 options with descriptive labels (rejected: labels 'Default' and 'Testing' no longer accurate)
  • Add 5×5 and tidy labels (chosen)

Rationale: 25 stages gives the user a much larger population to select from, which is valuable for exploring design space. The dynamic grid already supports any N, so adding 5×5 is a trivial change. Tidying the labels makes the selector cleaner.

D084 rebirthadoptedUX28 Jun 2026

Allow Mutation toggle — checkbox instead of blue toggle button

Change the Allow Mutation to Other Types control from a full-width toggle button (toggle=True, which renders as a loud blue pill when on) to a standard checkbox. The checkbox is quieter and consistent with the Orthogonal Rotation Only checkbox above it. Slider colours are accepted as Blender standard (same territory as D082).

Rationale & optionsOptions considered
  • Full-width blue toggle button (rejected: too visually loud, dominates the Mutation section)
  • Standard checkbox (chosen — quiet, consistent with other boolean controls)
  • Custom colour toggle (rejected: same API limitation as D082)

Rationale: Miles flagged the blue toggle as visually loud in the Mutation section. A checkbox is the natural Blender widget for a boolean setting. The slider fill colours remain blue (Blender theme standard) — changing them would require slider=False which loses the drag gesture.

D083 rebirthadoptedUX28 Jun 2026

Panel redesign — Records becomes Development Reports; Reports section removed

Rename the panel's 'Records' collapsible section to 'Development Reports' for clearer language. The separate 'Reports' collapsible section is removed — Design Evolution Report moves above Reset GAAD Platform for quick access, and Release Notes moves into Development Reports. The scripts info box is renamed to 'Configuration' with a title and a 'Last Full Release' reference line.

Rationale & optionsOptions considered
  • Keep Records and Reports as separate sections (rejected: two collapsible sections for similar content)
  • Merge everything into one section (rejected: Design Evolution Report needs quick access, not buried)
  • Development Reports + Design Evolution Report above Reset (chosen — clean hierarchy)

Rationale: The panel had too many small collapsible sections. Design Evolution Report is a frequently-used action that should not be buried inside a collapsed group. 'Development Reports' better describes the collection of project records (decisions, features, release notes etc.) than the generic 'Records'. Adding 'Configuration' as a titled box and showing the last release version gives the panel a professional, complete feel.

D082 newadoptedUX28 Jun 2026

Primary-action button highlight — Blender alert red, not GAAD Gold (platform limitation)

Highlight the primary Generate button using Blender's built-in alert state (layout.alert = True): Create First Generation glows on a fresh/reset world when primitives are ticked; Create Next Generation glows when a stage object is selected. The alert colour is red in Blender's default theme. GAAD Gold (#D9A441) was preferred but Blender's Python API provides no mechanism to set an arbitrary button colour — alert is the only highlight available and it uses the theme's fixed alert colour. Accepted as a platform limitation; red is Blender's native language for 'this button is live' and users already understand it. Added in addon v0_51.

Rationale & optionsOptions considered
  • GAAD Gold button colour (preferred but not possible — Blender API limitation)
  • Change Blender theme alert colour to gold (rejected: affects all of Blender, not just GAAD)
  • Blender alert red as primary-action highlight (chosen — platform-native, understood by users)
  • No button highlight (rejected: primary action should be visually clear)

Rationale: The Generate buttons are the single most important action in the panel — highlighting them when they are ready to fire makes the workflow self-guiding. Blender's alert system is the correct, supported way to do this even though the colour is red rather than brand gold. Fighting the theme system for a custom colour would add fragility for a cosmetic gain.

D081 1994adoptedRecords28 Jun 2026

Generation Timer — record build_time_seconds in JSON and Design History Report

Add a high-resolution timer to the generator (v0_29) that records how long each generation takes to create, stored as build_time_seconds (2 decimal places) in the generation JSON. The Design History Report (v0_6) gains a BUILD TIME column showing the value for each generation. The 1994 GAAD had a timer where generations took approximately 5 minutes for a 2×2 grid; in Rebirth 2026 a 4×4 grid (16 stages) builds in roughly 6 seconds. Older generation JSON files without the field display a dash in the report. Uses time.perf_counter() for sub-millisecond accuracy.

Rationale & optionsOptions considered
  • No timer (status quo)
  • Timer in the generator only, not surfaced in reports
  • Timer in generator + BUILD TIME column in Design History Report (chosen)

Rationale: Build time is a core performance metric that echoes the 1994 thesis timer. Recording it in JSON makes it available for future analysis (performance trends across grid sizes, hardware comparisons). Surfacing it in the Design History Report gives the user immediate feedback on how long each generation took — a satisfying data point that also highlights the 200× speed improvement over 1994.

P036
D080 rebirthadoptedGenome28 Jun 2026

Stage Size — configurable NxN grid (2×2 / 3×3 / 4×4)

Add a Stage Size selector to the Object Collection panel (addon v0_49, generator v0_28). The user picks from three grid layouts before creating Generation 1: 2×2 Classic (4 stages), 3×3 Default (9 stages, the standard layout), or 4×4 Testing (16 stages). The hardcoded 3×3 stages list in the generator is replaced by a build_stage_grid(n) function that computes positions dynamically. Each stage keeps the same physical size; only the grid footprint changes. The grid size is stored in the scene property gaad_grid_size and recorded in the generation JSON (world.stage_grid, world.stage_count). The selector is hidden once Gen 1 exists (same visibility rule as the primitive toggles).

Rationale & optionsOptions considered
  • Hardcode three separate stage lists (rejected: duplication, hard to extend)
  • Dynamic grid builder with NxN parameter (chosen: clean, extensible)

Rationale: Testing different grid sizes is essential for evaluating population diversity and selection pressure. 2×2 is the minimal viable grid (small/quick); 3×3 is the established default from the 1994 thesis; 4×4 gives a larger population for richer testing. Using a function means future grid sizes (5×5, 6×6) are trivial to add.

D079 1994adoptedInteraction27 Jun 2026

Stage Isolator — toggle hide/show other stages (F004)

Add a Stage Isolator toggle to the EXPLORE panel (addon v0_48). When an object on a stage is selected, clicking 'Stage Isolator' hides all objects NOT belonging to that stage (matched by the G###_S### variant prefix), saves the current 3D view state (perspective, location, distance, rotation), and frames the viewport on the isolated stage. The button label changes to 'Show Stages'; clicking it unhides everything and restores the saved 3D view exactly. Resolves the 1994 thesis 'Isolator' feature (F004 in the audit).

Rationale & optionsOptions considered
  • A separate Blender scene for isolation (rejected: heavyweight, loses context)
  • Toggle hide_viewport on non-matching objects + save/restore view state (chosen)

Rationale: The 1994 GAAD had an Isolator to examine one macro phenotype in detail. Using hide_viewport is lightweight and reversible — no objects are moved or deleted, and saving the view state means the user returns exactly where they were. Matching by the G###_S### prefix is robust because every object and surface in the generator carries this naming convention.

P034
D078 1994adoptedInteraction27 Jun 2026

Plan View & 3D View buttons in the EXPLORE panel

Add two viewport-preset buttons to the EXPLORE section of the addon panel: '3D View' (perspective, 65° elevation, view_distance 430) and 'Plan View' (top-down orthographic, identity quaternion, view_distance 430). Both call view_all after setting the camera to frame the full stage grid. Plan View resolves the 1994 thesis '2D Development Zone' feature (a plan view of all progeny). 3D View provides a quick reset to a readable perspective angle. Added in addon v0_47; EXPLORE order is now Design Generator, Design Tree, 3D View, Plan View.

Rationale & optionsOptions considered
  • A single toggle (plan/perspective) — rejected: two named buttons are clearer
  • Two separate buttons with explicit labels (chosen)

Rationale: The 1994 GAAD had a dedicated 2D Development Zone (plan view of all progeny) as a core viewing feature. Adding a Plan View button restores this capability. A companion 3D View button gives the user a quick way to return to a useful perspective angle without manually orbiting. Both are lightweight viewport manipulations with no scene data changes.

P034
D077 rebirthadoptedGenome27 Jun 2026

Mutation tuning values — live sliders wired in v0_26

Revised per-generation mutation parameters: shape-switch chance 12% → 10%; height mutation ±50% → ±20%; rotation drift is now UNCAPPED (still ±5°/gen, but the previous ±30° ceiling is removed so rotation accumulates freely); position X/Y drift ±5 m → ±10 m; population max 20 → 30 objects and min 5 → 10 objects. Width/depth (±10%) and add/remove chances (22% / 18%) unchanged. Initial Gen-1 rotation still seeds within ±30° (widening that is a separate open question). UPDATE (Chat 6): generator v0_26 now reads these values from the addon's scene properties (gaad_mut_*) at call time, making the Mutation panel sliders LIVE. The module-level constants are kept as fallback defaults for standalone use. Each generation's JSON records the active mutation settings under generation.mutation_settings for full replay fidelity.

Rationale & optionsOptions considered
  • Keep v0_24 values
  • Adopt the v0_25 values above

Rationale: Larger position and looser rotation give bolder spatial variation per generation; the higher min/max object counts allow denser, more varied stages; the gentler height mutation keeps proportions more stable while shapes still explore.

D076 rebirthproposedTerminology27 Jun 2026

Reword 'Allow Mutation to Other Types' to remove clash with the Type layer

With 'Type' now denoting the collection (Primitives / Buildings / ...), the existing 'Allow Mutation to Other Types' toggle is ambiguous. Under single-Type selection (D075) it can only mean mutation among the objects WITHIN the selected Type (e.g. a Cube becoming a Pyramid). Proposed rename: 'Allow Mutation to Other Objects'. Final wording awaiting Miles's ruling.

Rationale & optionsOptions considered
  • Allow Mutation to Other Objects
  • Keep 'Allow Mutation to Other Types'
  • Other wording

Rationale: Removes the collision between 'Type' (collection) and 'Types' (object kinds) so the toggle's meaning is unambiguous.

D075 rebirthadoptedArchitecture27 Jun 2026

Object Collection gains a Type layer; selection is single-Type only

Object Collection becomes a hierarchy: Object Collection > Type > Objects. A run selects objects from exactly ONE Type — never a mix across Types. Today the only Type is Primitives (Cube, Pyramid, Dome, Wedge, Cylinder); future Types (Buildings, Rockets, Garden Rooms) slot into the same Type selector with no panel redesign. Per D072 the selector shows only built Types.

Rationale & optionsOptions considered
  • Flat primitive list (no Type layer)
  • Type layer with multi-Type selection
  • Type layer with single-Type selection

Rationale: A Type taxonomy future-proofs the panel for Buildings / Rockets / Garden Rooms. Constraining a run to a single Type keeps the genome coherent (no cross-Type breeding) and simplifies the generator. Dovetails with D071 (modular architecture).

D074 rebirthadoptedTerminology27 Jun 2026

Rename Design Evolution view to Design Tree; order Design Generator above it

In the EXPLORE group, the 'Design Evolution' view button is renamed to 'Design Tree', and 'Back to Design Generator' is renamed to 'Design Generator' and placed ABOVE Design Tree, giving a consistent two-view order (Generator, then Tree). Confirmed for the panel labels; the wider scope (Blender scene name 'GAAD Design Evolution', the 'Design Evolution Report' button, and the terminology record) is still to be ruled on. PHASING (agreed 27 Jun): Tier 1 (panel view-button label) and Tier 2 (HUD title line) are renamed to 'Design Tree' now, in addon v0_44. Tier 3 — the internal scene rename 'GAAD Design Evolution' → 'GAAD Design Tree' (~17 references across gaad_tree, gaad_rebirth_addon and gaad_generator) plus the 'Design Evolution Report' label — is DEFERRED to a later, careful pass.

Rationale & optionsOptions considered
  • Keep 'Design Evolution'
  • Rename to 'Design Tree'

Rationale: 'Design Tree' is more literal and concrete than 'Design Evolution' for the recorded lineage view. Dropping the 'Back to...' framing and fixing the order reads as two peer views rather than an action plus a return.

D073 rebirthadoptedUX26 Jun 2026

Hide Reset GAAD Platform button in Design Evolution scene

The Reset GAAD Platform button must not be shown when the user is in the GAAD Design Evolution scene. Resetting from that scene causes new stages to be generated there instead of in GAAD Generator. Fix: suppress the button entirely when scene.name == GAAD Design Evolution.

Rationale & options

Rationale: Reset has no valid purpose in the Design Evolution scene. Hiding it prevents the bug and removes the temptation to use it in the wrong context.

D072 rebirthadoptedUX26 Jun 2026

No coming soon labels in the UI

The GAAD panel must never show placeholder text such as "coming soon". If a feature is not yet built, it is simply absent from the panel. Unbuilt features belong in the records (as Feature Requests or Decisions), not in the live UI.

Rationale & options

Rationale: Coming soon labels create noise and imply a half-finished product. The panel should only show what works.

D071 newproposedArchitecture26 Jun 2026

Modular architecture plan — split generator into focused modules

As the codebase grows toward 10k lines, the monolithic generator script should be split into focused modules: gaad_shapes.py (shape creation), gaad_genome.py (mutation and scaling), gaad_data.py (JSON read/write), gaad_generator.py (thin orchestrator/main loop). A shared geometry/diff module should also be created to resolve D052 (metrics duplication between tree and report). The addon-generator coupling via scene properties should be reviewed for robustness.

Rationale & optionsOptions considered
  • Keep monolithic structure (rejected: will become unmanageable at 5k+ lines)
  • Split into focused modules with thin orchestrator (chosen — action when generator approaches 2000 lines or Buildings/Garden Rooms object types are added)

Rationale: The generator is already 1,226 lines and growing. Shape creation, mutation, genome scaling, JSON logging and scene setup all live together. Adding new object types (Buildings, Garden Rooms) will compound this. Modular architecture now, before the codebase is too large to refactor safely, will keep GAAD maintainable and testable long-term.

D066 newadoptedBugfix25 Jun 2026

Fix: double-draw HUD handler on addon reload

The _gaad_hud_add() function now always calls _gaad_hud_remove() before registering a new draw handler. Previously, the module-level _gaad_hud_handle variable would reset to None on addon reload while the old handler remained active, causing a second handler to be registered and the logo/text to draw twice. The fix ensures only one handler is ever active.

Rationale & optionsOptions considered
  • Guard with 'if handle is None' only (rejected: fails on module reload)
  • Always remove before adding (chosen)

Rationale: Module-level variables in Blender addons reset on reload without triggering unregister(), so the 'if None' guard is not sufficient. Always removing first is the correct defensive pattern.

P033
D065 newadoptedUX25 Jun 2026

Panel Scripts box shows all four scripts; scenes named GAAD Generator / GAAD Design Evolution

Two related naming/panel changes: (1) The Scripts box in the GAAD panel now shows all four script filenames — Generator, Tree, Report, and Add-on. Previously the add-on was omitted. (2) The two Blender scenes are given explicit names: the generator/breeding world is named 'GAAD Generator' (set on first build by the generator script); the lineage tree scene is named 'GAAD Design Evolution' (set by the tree script). These names drive the HUD is_tree detection and all scene-switching logic in the addon.

Rationale & optionsOptions considered
  • Leave scene names as Blender defaults ('Scene', 'GAAD Tree') (rejected: confusing in the outliner)
  • Named scenes + all four scripts in panel (chosen)

Rationale: Clear scene names in the outliner make it immediately obvious which scene is active. Showing the add-on filename in the panel completes the scripts inventory and makes version-checking straightforward.

D064 newadoptedVisualisation25 Jun 2026

HUD redesign — large headline text, split lines, date/time, non-GAAD guard

The on-screen HUD is redesigned for both views: (1) The view name ('Design Generator' / 'Design Evolution') displays at size 30 as a large headline. (2) In the Design Evolution view, the generation count moves to its own line below the headline. (3) A date/time line (e.g. '25 Jun 2026 09:03') is added to both views. (4) A guard is added so the HUD never draws in blank or non-GAAD Blender files — it exits immediately unless the scene is named 'GAAD Generator' or 'GAAD Design Evolution', or contains a GAAD collection.

Rationale & optionsOptions considered
  • Keep single-line HUD text at uniform size (rejected: headline lost in the small text)
  • Large headline + split lines + date/time + guard (chosen)

Rationale: The HUD is the primary identity element in both views. Making the view name large and prominent gives instant orientation. Splitting the generation count to its own line keeps it readable. Date/time adds useful session context. The non-GAAD guard prevents the HUD appearing on unrelated Blender files when the addon is installed.

P033
D062 newadoptedVisualisation24 Jun 2026

Remove the 3D title plaques from the Design Studio and Design History (HUD replaces them)

Remove the extruded 3D title plaques from both views now that the on-screen HUD (D060) carries the identity. The Design Studio (generator v0_22d) no longer builds 'GAAD - Design Studio' as floor geometry; the Design History (tree v0_5d) no longer builds the 'GAAD - Design History' foot panel. Both create_title_panel / create_tree_title_panel functions are retained in code but no longer called, so they can be restored if ever needed. Identity is now shown only as the modern HUD (logo + Design Studio/Design History + generation/stage info), which always faces the user and never tilts.

Rationale & optionsOptions considered
  • Keep both the plaque AND the HUD (rejected: redundant, and the plaque is the dated element)
  • Remove the plaques, keep only the HUD (chosen)

Rationale: Completes the '1994 plaque out, modern HUD in' swap. The plaque was the most dated element in the 3D views; with the HUD confirmed working (logo + brand text), the plaque is pure redundancy and visual clutter on the floor. Functions kept in code as a safety net.

P026
D061 evolvedadoptedTerminology24 Jun 2026

Rename the two core views to brand language: 'Design Studio' (world) and 'Design History' (tree)

Adopt brand-aligned names for GAAD's two views, echoing the logo strapline 'Design History - Design Memory - Design Intelligence'. The live Generation world becomes the 'Design Studio' (where you actively design - breed and choose). The Evolution / Forward Evolution Tree becomes 'Design History' (the recorded lineage of what came before - literally the design history). 'Next Generation' is KEPT as the breeding action (a generation is still each evolutionary step). Rippled through: HUD titles ('GAAD - Design Studio', 'Design History - N Generations'), the 3D title plaques, add-on buttons (Design History, Write/Open Design History Report, Back to Studio), the report H1 ('GAAD - Design History Report'), and tool banners. Reserves 'Design Intelligence' (the third strapline term) for the future scoring/learning capability. Tools bumped: generator v0_22c, tree v0_5c, report v0_5, add-on v0.12.

Rationale & optionsOptions considered
  • Keep 'Generation' / 'Evolution Tree' (rejected: off-brand, inconsistent - HUD said 'Generation Tree' while buttons said 'Evolution Tree')
  • World -> 'Design Generator' (rejected: clashes with the generator SCRIPT name; mechanical)
  • Tree -> 'Lineage' (good, but technical; 'Design History' is the brand word from the logo)
  • World -> 'Design Studio', Tree -> 'Design History' (chosen)

Rationale: The logo's strapline is the brand's spine; pulling 'Design' into the view names makes the whole tool feel of-a-piece and fixes a real inconsistency (the tree was called both 'Evolution Tree' and 'Generation Tree' across the UI). 'Design History' is literally what the lineage is, is meaningful to non-technical audiences, and sets up 'Design Intelligence' for the scoring future. 'Design Studio' frames the world as the human, active place of designing without colliding with the generator script name.

P032P026
D060 newadoptedVisualisation24 Jun 2026

On-screen HUD title overlay (Heads-Up Display) with GAAD logo, replacing the 3D title plaque

HUD = Heads-Up Display: flat 2D text/graphics drawn over the viewport (the same layer Blender uses for 'User Perspective' etc.), always facing the user and crisp at any zoom - the term comes from aviation/games for status info shown over the view. Add a 2D on-screen HUD overlay to the add-on (v0.10) that draws the GAAD identity as flat viewport text - 'GAAD - Generation', the current Generation number (read live from the scene), the saved .blend filename, and the selected variant (in gold) when one is picked. Drawn via a blf/SpaceView3D POST_PIXEL draw handler in the bottom-left, so it always faces the user, stays crisp at any zoom, and never tilts - unlike the extruded 3D title plaque (which reads as dated/'1994'). Bottom-left placement visually replaces the plaque. A 'Show on-screen title (HUD)' checkbox toggles it (default on). The HUD is suppressed in the GAAD Tree scene (the tree has its own title). Handler is registered/unregistered cleanly to avoid leaks. NEXT STEP (separate, after confirmation): remove the 3D title plaque from the generator (a later v0_22x), once the HUD is confirmed - kept in place for now so there is never 'no title'. [v0.11: the white+gold GAAD logo (gaad_logo_white.png) is drawn at the top of the HUD, replacing the 'GAAD' text (falls back to text if the image isn't found); the World HUD line now reads 'Generation N · A × B Stages'; and the Tree scene gets its own HUD: the logo + 'Generation Tree · N Generations'. Two logo assets were cropped from the brand artwork: gaad_logo_white.png (white+gold, for dark backgrounds/HUD) and gaad_logo.png (black+gold, for light backgrounds).]

Rationale & optionsOptions considered
  • Keep the extruded 3D title plaque (rejected: dated, tilts, foreshortens)
  • Blender annotations/text objects (still geometry; not as clean)
  • A blf/gpu HUD draw handler - flat 2D viewport text (chosen)

Rationale: The 3D plaque was the most '1994' element left in the World. A HUD overlay is the modern idiom (it's the same layer Blender uses for 'User Perspective' etc.) - always legible, screen-anchored, no geometry in the scene. Building the HUD first and removing the plaque later avoids ever leaving the World untitled.

P026P032
D059 newadoptedInteraction24 Jun 2026

'Back to Generation' button: return from the Tree to the World, centred and framed

Add a 'Back to Generation' button to the add-on (v0.9), the counterpart to 'Evolution Tree'. It switches from the GAAD Tree scene back to the generator World, then centres the 3D cursor + view pivot on the middle of the stage grid and frames the view (view_all). This fixes the issue where returning from the Tree left the World tiny and off-centre with the pivot stuck at the world origin. Deliberately scoped: re-centring happens ONLY on this explicit return, NOT on every Next Generation - so the user's chosen view is preserved during normal breeding, and only restored when coming back from the Tree.

Rationale & optionsOptions considered
  • Re-frame the World on every Next Generation (rejected: yanks the camera away from the user's chosen view)
  • Auto-detect the Tree->World switch (fiddly, surprising)
  • An explicit 'Back to Generation' button that switches + centres + frames (chosen)

Rationale: The orbit/centring fix the Tree received (D051/v0_5b) was also needed for the World, but only when returning from the Tree - during normal breeding the user wants their view kept. An explicit button matches GAAD's one-click idiom, keeps the user in control of when the snap happens, and pairs naturally with the Evolution Tree button.

P026
D058 newadoptedRecords24 Jun 2026

HTML record pages redesigned as a modern, mobile-first card feed on a timeline spine

Replace the table-based record pages with a modern app-like CARD FEED: each record is a card hung off a vertical gold timeline spine (newest first), with Fraunces (display) + Inter (body) type, brand colours (Midnight/Gold + timeline palette), category/status/priority/origin/source as coloured pills, and dense detail tucked into a tap-to-open 'details' expander. Mobile-first (cards from the smallest screen up - no tables to collapse), so it reads cleanly on a phone. Shared helper gaad_html_modern.py drives all five pages (decisions, PMs, tickets, quotes, terminology). Supersedes the earlier stacked-label responsive table format (D050/brand re-skin), which read as dated on mobile.

Rationale & optionsOptions considered
  • Keep the responsive table -> stacked-card format (rejected: looked dated on mobile)
  • Compact expandable list
  • App-like timeline card feed (chosen)

Rationale: The table-to-stacked-card mobile format was functional but felt utilitarian. A timeline card feed is both more modern and truer to GAAD as 'The Design Memory Platform' - the records literally read as a journey down a timeline. Mobile-first cards remove the awkward table collapse entirely. One shared helper keeps all five pages consistent.

P031P032
D057 newopenVisualisation24 Jun 2026

Brand proposes neutral 'Light Concrete' objects on Dark Slate stages (CONFLICTS with D041 - OPEN)

OPEN - needs an explicit ruling. The brand (D055) proposes stripping colour from variant objects: a single neutral Light Concrete #C7CED6 (architectural massing-model feel) on Dark Slate stages #1A2330 (border #2E3B4F, label #D7DEE7), so the eye reads form/scale/mass/proportion/evolution rather than decoration ('the object is not the hero, the decision is the hero'). This DIRECTLY CONFLICTS with this chat's adopted D041 'Rebirth Colours' (coloured shapes: aqua/coral/green/grey/purple). Renumbered from the original chat's D039 (this chat's D039 is the open title panel). Left OPEN rather than auto-superseding D041, because it is a genuine design fork the human should decide: brand-neutral objects vs Rebirth-Colours objects.

Rationale & optionsOptions considered
  • Adopt brand neutral objects - supersede D041 Rebirth Colours (brand wins)
  • Keep D041 Rebirth Colours - brand identity adopted but objects stay coloured
  • A hybrid (neutral by default, colour as an optional 'mode')

Rationale: Both positions are coherent: the brand argues colour competes with the design process; D041 argued colour aids shape legibility and gives GAAD a vivid identity. Because D041 is ADOPTED and in the shipping generator, the brand's neutral-object direction must not silently override it - it is logged OPEN for the human to rule on when the brand re-skin is built.

P032
D056 evolvedadoptedVisualisation24 Jun 2026

Selected/champion stage = GAAD Gold #D9A441 (brand alignment; already satisfied by D042)

Per the brand, the selected/champion stage is GAAD Gold - gold = human judgement, choice, Design Memory, the selected path. This ALIGNS with work already done in this chat: D042 already made the champion a whole GOLD stage (superseding the green frame D028). The only change is to standardise the exact hex to brand GAAD Gold #D9A441 (this chat used #F2B705). Renumbered from the original chat's D038 (this chat's D038 is the open scoring model).

Rationale & optionsOptions considered
  • Keep the green edge-frame (D028) - off-brand, already superseded
  • Gold champion stage (chosen; already built in D042) - align hex to brand #D9A441

Rationale: Confirms the independent convergence on gold and simply ties the hex to the canonical brand value. Low-risk: the gold champion already exists in the generator (v0_22a); this is a colour-value tweak when the brand re-skin is built.

P032
D055 newadoptedPhilosophy24 Jun 2026

Adopt the GAAD brand identity - 'The Design Memory Platform' (canonical)

Adopt the GAAD Brand Guidelines (gaad_brand.md) as canonical, folded in from the original chat (renumbered from its D037 to avoid an ID clash - this chat's D037 is the terminology file). Positioning: GAAD is 'The Design Memory Platform' - a system for recording, replaying, understanding and learning from the complete design journey; NOT a CAD/BIM/generative/AI tool. Tagline: 'Where design history becomes design intelligence.' Continuum: Design History -> Design Memory -> Design Intelligence. Logo: GAAD wordmark with both A's as gold delta peaks (no crossbar), gold underline + node, subtitle 'DESIGN MEMORY PLATFORM'. Core palette: Midnight Black #070B12, GAAD Gold #D9A441, Pure White #F5F7FA. Timeline palette (Idea->Exploration->Evolution->Decision->Outcome): Gold #D9A441, Cyan #23D5D5, Blue #66B8FF, Purple #A06CFF, Violet #C67DFF. Neutral/UI: panel #101722, border #263241, muted #8B98A8, light #D7DEE7, slate #1A2330. Supersedes the earlier GREEN identity entirely (logo/banner/portraits now stale). NOTE: the brand's object-colour direction (neutral objects) conflicts with this chat's adopted D041 'Rebirth Colours' and is logged separately as OPEN (D057) for an explicit ruling, not auto-applied.

Rationale & optionsOptions considered
  • Keep the green genetic-path identity (superseded by the brand)
  • Adopt the gold-delta 'Design Memory Platform' identity (chosen)

Rationale: A deliberate, complete brand system that states the thesis in one line and sidesteps CAD/BIM/generative/AI framing. Adopted from the original chat where it was canonical; renumbered to D055 to avoid colliding with this chat's existing D037-D039. Pleasing convergence: this chat independently moved the champion to GOLD (D042), so the brand and the build already agree on gold = selection. The conflict (brand wants neutral objects; this chat adopted coloured 'Rebirth Colours') is deliberately NOT resolved here - see open D057.

P032
D054 newadoptedRecords24 Jun 2026

Split bundle docs into readme.txt (setup) + release.txt (auto-generated notes & version history); add Release Notes button

Two text docs ship in the bundle root: README.txt (stable - how to install/run, folder map) and release.txt (what's new + version history). release.txt is AUTO-GENERATED from a new gaad_releases.json by generate_release_notes.py, rendered newest-first so the top is the current release and the entries below are the version history - one file serving both needs. The add-on (v0.8) gains a 'Release Notes' button that opens release.txt (one-click, like the Records buttons). gaad_releases.json becomes the single source for release info, ready to feed richer in-panel version history later (P031 render-ecosystem).

Rationale & optionsOptions considered
  • One combined README with a version block (previous approach)
  • Hand-written changelog (drifts out of sync)
  • readme.txt + auto-generated release.txt from a releases record (chosen)
  • In-panel version history: a simple Release Notes button now vs a full in-panel changelog browser (chose the button; richer browser deferred)

Rationale: readme.txt and release.txt answer different questions (how do I run it? vs what's new?) and change at different rates, so separating them is cleaner and matches real software. Generating release.txt from gaad_releases.json keeps one source of truth and lets the records write the notes. Newest-first rendering makes the same file double as the version history. The Release Notes button surfaces it inside GAADBlender with no new machinery - another renderer reading the records.

P031P024
D053 newadoptedConvention24 Jun 2026

Project folder structure + version convention: only the .blend in root, capitalised subfolders, bundle versioning

Standardise the project layout: ONLY the .blend (and VERSION.txt) live in the root; everything else sits in capitalised subfolders - Scripts/, Records/, Generations/, Reports/, Records_Tree/. Bundles are delivered as a zip whose name carries the version + short tag (e.g. 'GAAD Development 0_23.zip'), unzipping to a matching folder ready to copy into a new dev folder. Versioning: tool files keep INDEPENDENT versions (Option A) - generator v0_22a, tree v0_5a, report v0_4, add-on v0_7 - while the BUNDLE/folder carries the headline version (0_23) and a VERSION.txt declares the set. The standalone 'V' prefix is dropped (0_23, not V0_23); '0.' signals pre-1.0 development. Patch revisions (e.g. v0_22a) are dropped into the current bundle folder manually and do NOT trigger a new zip; zips are for minor versions. Tool versions will UNIFY at the 1.0 release. Capitalised folder names are kept for now (zero script changes, since the scripts already search Records/, Reports/, Generations/); a future 1.0 reset may switch all to lowercase. ENABLER: add-on v0.7 now auto-detects scripts in a Scripts/ subfolder (then the .blend root, back-compat), so 'only the .blend in root' works without configuring the Scripts-folder field.

Rationale & optionsOptions considered
  • Everything loose in root (status quo - cluttered)
  • Lowercase subfolders now (cleaner, but needs path changes in 4 scripts - deferred to 1.0)
  • Capitalised subfolders now, zero script changes (chosen)
  • Per-tool versions + bundle headline version (Option A, chosen) vs stamp every tool with the bundle version (Option B)
  • Keep 'V' prefix vs drop it (dropped)

Rationale: A single .blend in root with tidy capitalised subfolders is clean, professional and self-contained - copy one folder into a fresh dev folder and run. Independent tool versions stay honest (a file's number only moves when it changes) while the bundle version gives an at-a-glance release identity, with VERSION.txt bridging the two. Dropping 'V' and keeping '0.' follows common practice and signals pre-1.0 status truthfully. Capitalised-now avoids touching working path logic; lowercase waits for the 1.0 reset when everything is bumped anyway. The add-on Scripts/ auto-detect is the small enabler that makes the structure work with no manual configuration.

P024P031
D052 newopenVisualisation24 Jun 2026

Tree side-by-side copy carries a full per-stage metric change panel (deferred feature)

OPEN. The side-by-side stage copy in the Tree (D051) will carry a full 'what changed on stage' metric panel - floor area, volume, max height, shape-mix deltas and object intersections vs the previous generation - not just the concise line shipped in D051. Deferred because it should read the same diff maths the Evolution Summary Report uses; building it now would create a third copy of that logic. To be implemented once the shared geometry/diff module exists, so report and tree compute the diff from one place.

Rationale & optionsOptions considered
  • Duplicate the report's diff maths into the tree now (rejected - third copy to maintain)
  • Concise change line now, full metric panel after a shared diff module (chosen)

Rationale: Putting the real per-generation metrics beside each stage in the tree makes the lineage genuinely analytical, not just visual. But it depends on a shared diff module so the numbers are computed once and trusted everywhere - the recurring shared-module foundation. A deferred FEATURE, so it lives as an open Decision, not a ticket (tickets are for deferred bugs).

P028
D051 evolvedadoptedVisualisation24 Jun 2026

World + Tree title/label UX: 'GAAD - Generation' panels, unified grey text, side-by-side tree stages

A UX pass across the World and the Tree. WORLD title panel: title now reads 'GAAD - Generation'; the version line shows the FULL generating filename with extension (e.g. gaad_generator_v0_21.py) so a screenshot is fully traceable; the 'Generation NN' line is quietened; 3D title text sits ON the panel surface and extrudes UP only (no longer punching below); the green accent bar is removed; all panel/wordmark text is unified to Rebirth grey #8A9299. STAGES: the gold champion selection halo is widened to roughly twice its width. Variant ID labels (e.g. G023_S009) are made legible. TREE: each generation node shows the stage, a gutter, then a side-by-side copy of the same stage; tree labels are enlarged/bolded for visibility; a concise 'what changed on stage' line accompanies the side-by-side copy; and a title panel is added at the foot of the last stage in the tree, styled like the World panel, reading 'GAAD - Generation Tree'. [0.22a refinement: title 3D text properly seated on the panel (extrude up only) and its height halved; the panel filename line now shows the saved .BLEND file name (bpy.data.filepath), not the script; the gold champion EDGE RIM is removed - the gold stage FILL alone marks the champion (cleaner). In the Tree, the right-hand side-by-side stage COPY is replaced by a clean LOZENGE card carrying the variant id (bold) + the 'what changed' line - no duplicated geometry; the 'GAAD - Generation Tree' title panel is moved clear of the last stage.] [v0_5b backtrack: the side-by-side stage copy / lozenge card was tried and REMOVED - it added clutter and text-heavy info doesn't belong in 3D geometry beside a stage; per-stage change data belongs in the report or a future graph renderer (P031), not the tree. The tree returns to a clean stacked column of stages + variant-id labels, keeping the 'GAAD - Generation Tree' foot panel. Also fixed: the tree now sets the 3D cursor + view pivot to the centre of the lineage so it orbits from the middle, not Gen 1 (pair with Blender's 'Orbit Around Selection').]

Rationale & optionsOptions considered
  • Keep the green 'AutoCAD-retro' panel (rejected - see T002)
  • Short version stub 'v0_21' vs full filename gaad_generator_v0_21.py (chose full filename, traceable)
  • Per-element text colours vs one unified grey (chose unified grey #8A9299)
  • Concise change line now vs full metric diff panel (concise now; full metrics deferred to D052)

Rationale: The title panel read as a 1990s CAD label (T002) and several labels were invisible at working angles (T003); this pass gives the World and Tree a consistent, legible, modern identity. Unifying text to grey calms the panel so the coloured forms carry the colour. The full filename makes every render self-documenting. The side-by-side tree with its own signed 'GAAD - Generation Tree' title makes the lineage readable and gives the Tree its own identity alongside the World. Bugs fixed in passing (text extrude below surface, stray green accent bar, loud Generation text, invisible labels) are resolved this cycle and need no tickets; T002/T003 are closed.

P026
D050 newadoptedRecords23 Jun 2026

Record pages also output as styled HTML (origin/status colour-coded); add-on opens HTML

Every record type now generates a styled HTML page alongside its Markdown: gaad_<type>.html via a shared helper (gaad_html_style.py) matching the Evolution Summary Report look (dark, Deep-Teal accent, Rebirth Colours). Origin (1994 gold / evolved aqua / new purple), status (adopted green / open orange / closed grey) and ticket priority (high coral / med yellow / low grey) render as colour pills; decisions cross-link supersedes/superseded-by; a summary table links to per-record detail cards. Markdown is KEPT as the source for quick diffs and GitHub rendering; HTML is the readable/shareable page. A driver generate_all_html.py rebuilds all five. Add-on v0.6 points the Records buttons at the .html pages (opening in the browser like the report) instead of raw .md.

Rationale & optionsOptions considered
  • Keep raw Markdown only (renders as plain text in editors)
  • HTML instead of Markdown (lose easy diffs/GitHub)
  • HTML + keep Markdown, shared style helper, origin colour-coded (chosen)

Rationale: Raw .md opened as plain text in an editor, which read poorly. Styled HTML gives a proper page - scannable, colour-coded so the 1994-vs-new and open-vs-closed stories show at a glance - while keeping .md for diffs and GitHub. A shared helper means all five pages look identical and styling lives in one place (the recurring shared-module discipline).

P024P031
D049 1994adoptedTooling23 Jun 2026

Records-Tree: render the project's own records as a live evolutionary tree (Graphviz)

Adopt a Records-Tree generator (generate_records_tree.py) that reads the project's own records (gaad_decisions.json + gaad_pivotal_moments.json) and renders a branching evolutionary tree via Graphviz (dot) to SVG + PNG. Decisions form the vertical spine (the genetic path); nodes are coloured by ORIGIN (gold=1994 rebirth, aqua=evolved, purple=new); Pivotal Moments are coral blooms branching beside their anchor decision; supersedes links are gold fork-arcs with the superseded node faded/dashed (a pruned branch); open decisions are dashed-white (live growth points). Regenerated from the source of truth, so it is a true live infographic - never out of date. Uses a graph tool, not Blender (per P029): the architectural tree renders 3D form in Blender; the Records-Tree renders relationships in Graphviz - same data-agnostic engine idea, different renderer (P027).

Rationale & optionsOptions considered
  • Graphviz - script JSON->dot->auto-laid-out SVG/PNG (chosen: lowest effort, regenerates live)
  • Cytoscape.js / Dash Cytoscape (interactive, browser - deferred)
  • D3.js (bespoke, steep - deferred)
  • Render it in Blender (rejected: it is a node/text graph, not 3D form)

Rationale: Closes the loop the project has circled since P022/P027/P029: GAAD turned on itself. Every mark is true - gold clusters are the 1994 DNA, faded nodes are backtracked ideas, blooms are turning points. It is the thesis's own Genetic Array (Fig 3.29) pointed at the development of GAAD itself, and being generated from the records it is alive: log a decision, rerun one script, the tree grows. Origin colouring (D046) finally has a spatial job.

P029P030
D048 newadoptedRecords23 Jun 2026

Rename Issues to Tickets (T###); priority high/med/low; status open/in progress/closed

Rename the Issues record type to TICKETS (T###), reframing the log from a passive list of problems into an active backlog worked down through the development cycle as resources allow (solo developer). Fields: id, date, category (shared taxonomy), priority (high / medium / low), status (open / in progress / closed), title, description, resolution (filled on close), related. Migrated I001 -> T001 (closed). The old gaad_issues.json/.md are superseded by gaad_tickets.json/.md with its own generator, and have now been removed (archived to _archive/). Add-on v0.5 replaces the Issues button with Tickets and adds a Quotes button. Seeded two live tickets: T002 (title panel 'AutoCAD retro' rework) and T003 (variant ID labels not legible), both to be bundled into one text-legibility / title pass.

Rationale & optionsOptions considered
  • Keep 'Issues' with binary open/resolved
  • Severity vs priority (chose priority - answers 'what next?' for a solo dev)
  • Two-state vs three-state status (chose open/in progress/closed)
  • Rename to Tickets with priority + 3-state status (chosen)

Rationale: 'Issues' is passive; 'Tickets' is active - a unit of work that moves through a cycle and gets closed, which fits the solo-developer reality of triaging 'noticed it, will deal with it when I have resources (me)'. Priority (not severity) answers what to do next; a three-state status gives just enough granularity to see work in flight. Turns the log into a backlog.

P028
D047 newadoptedRecords23 Jun 2026

Add a Quotes (Q###) record type for marketing / posts

Introduce a new record type, Quotes (Q###), in gaad_quotes.json with its own generated gaad_quotes.md (newest-first). Fields: id, date, source (thesis_1994 / miles_2026 / ai_collaboration), theme (light tag e.g. philosophy, vision, origin-story, the-tree, decisions-as-data), quote, context, related (optional links to D/P records). No 'cleared for use' flag - the project is open source, so all quotes are cleared; source is always attributed and AI-assisted lines are explicitly marked. Seeded with 12: 5 from the 1994 thesis, 2 from Miles 2026, 5 AI-assisted. Curation bar kept deliberately high. To gain a Records button in the add-on later.

Rationale & optionsOptions considered
  • Fold memorable lines into PM records (rejected - quotes are about language, a different kind of record)
  • Capture quotes with a public/private flag (rejected - open-source project, all cleared)
  • Dedicated Q### record type with source attribution (chosen)

Rationale: Good phrasings are a distinct asset - reusable for posts, talks and marketing - and easy to lose in the flow of work. A curated, attributed quotes file captures them while keeping the attribution honesty Miles applies on LinkedIn (what is his to claim vs AI-assisted). Themes make it easy to pull the right line for the right post; an ai_collaboration source credits the collaboration openly.

P024
D046 newadoptedRecords23 Jun 2026

Add an 'origin' field to decisions: 1994 (rebirth) / evolved / new

Add an 'origin' field to every Decision record, with three values: '1994' (restored from the Digital Evolutions thesis), 'evolved' (a 1994 seed taken somewhere the thesis did not go), and 'new' (no 1994 precedent). Rendered as an Origin column in the decisions summary table and in each detail block. Applies to Decisions only; Pivotal Moments are excluded (they are largely realisations, often about the 1994<->now relationship itself). First-pass classification of all 45 decisions: 14 are '1994', 8 'evolved', 23 'new'.

Rationale & optionsOptions considered
  • No origin field (status quo - distinction lives only in prose)
  • Two values (rebirth / new)
  • Three values 1994 / evolved / new (chosen - captures the hybrid middle)

Rationale: Makes queryable the most important story in the project: how much of Rebirth is restoration of the 1994 thesis versus new invention. A pure binary forced too many hybrid decisions into the wrong bucket, so a three-value scheme was chosen. A nice side effect: the future Records-Tree can colour nodes by origin, showing the 1994 DNA threaded through the project with new growth branching off it.

P022P029
D045 1994openVision23 Jun 2026

Adopt backward / forward tracking (replay-based) - restore stored phenotypes from a pivot progeny

OPEN. Bring the thesis's second algorithm - Backward / Forward Tracking (Richard Coyne backward chaining) - into Rebirth. When forward search hits a DEAD END (a path that will not reach satisfactory quality), the designer BACKWARD-TRACKS up the recorded genetic path to an earlier ancestor (a PIVOT PROGENY) and then FORWARD-TRACKS, striking out in a new direction. Per the thesis (p.14), backward/forward tracking are REPLAY functions that RESTORE previously-created stored macro phenotypes - they do not re-mutate - so they depend on the genes for every visited node already being stored (D030 seed/quad-numbering). The Forward Evolution Tree must therefore grow from just the genetic PATH (today) into the full GENETIC ARRAY / tree (Fig 3.16 / 3.29) with dead-end stubs and multiple pivots. To be resolved: (a) exact UX for choosing a pivot and a new direction; (b) whether the tracking tree is shown in Blender or a dedicated 2D graph tool; (c) dependency/order vs D030 storage and D038 scoring; (d) warnings when no forward/backward generation exists (Fig 3.17).

Rationale & optionsOptions considered
  • Leave Rebirth as forward-search only (status quo)
  • Re-mutate when revisiting an ancestor (rejected - thesis specifies replay/restore, not re-mutation)
  • Replay-based backward/forward tracking restoring stored phenotypes from a pivot progeny (chosen direction, OPEN on detail)
  • Render the tracking tree in Blender vs a dedicated 2D graph tool (open)

Rationale: Forward search alone has the thesis's stated 'significant limitation' - the dead end - where hill-climbing gets stuck. Backward/forward tracking is the escape that turns GAAD from a hill-climber into a genuine exploration of the design space, and is one of the three algorithms that define GAAD (with Forward Search and Genetic Engineering). It is the concrete realisation of the rear-cover promise of 'exploration in the 4th dimension'. Left OPEN because it is a large capability that depends on seed-based storage (D030) being built first and interacts with scoring (D038); the build order is storage -> tracking. Logged now so the direction is captured while the thesis reading is fresh.

P029P026
D044 newadoptedTooling23 Jun 2026

Project records reachable from the GAAD add-on; 'Records/' folder convention

The GAAD Blender add-on (v0_4) gains a 'Records' panel section with four one-click buttons - Decisions, Pivotal Moments, Issues, Terminology - each opening its .md directly (wm.path_open). The record .md files live in a 'Records/' folder beside the .blend (matching the Generations/ and Reports/ convention of D031), with fallbacks to GAAD_Rebirth_data/ and the .blend root so existing layouts still work.

Rationale & optionsOptions considered
  • Keep records outside the tool (status quo)
  • One 'Open Records folder' button
  • A dropdown of records
  • Four named buttons opening each .md directly (chosen)
  • Loose beside the .blend vs a Records/ subfolder (chose subfolder)

Rationale: Makes GAAD self-documenting from inside the app: the decision history is one click away while working, reinforcing 'decisions become data'. Four named buttons match the one-click spirit of Open Report. A Records/ subfolder keeps the root tidy and consistent with D031; fallbacks avoid forcing a reorganisation.

P023P024
D043 1994adoptedRecords23 Jun 2026

Record same-stage 'object intersections' as neutral data (not 'clashes')

Give primitives relational awareness on their own stage by recording OBJECT INTERSECTIONS: pairs of objects on the same stage whose axis-aligned bounding boxes overlap. Recorded as a count of intersecting pairs plus the total overlap volume (m3), each with a per-generation delta, surfaced as columns in the Evolution Summary Report (report v0_4). Scope is strictly objects on the SAME stage. The term is 'object intersection', deliberately NOT 'clash': an intersection is neutral, measured data, not a fault - it may be intentional and a precursor to a future Boolean join (echoing the thesis 'penetration of one body with another'). Whether intersections ever penalise a score is a separate, later decision (D038). Bounding-box test; rotation ignored (approximation) for now. Adjacency-as-quality is parked: with no relationship rules defined it cannot be measured, though neighbour topology may be recorded later.

Rationale & optionsOptions considered
  • Call it 'clash' and treat as a fault to minimise
  • Bounding-box intersection vs true mesh intersection (chose bounding-box first)
  • Count only vs count + overlap volume (chose both, count headline)
  • 'Object intersection' as neutral recorded data, Boolean-join reserved (chosen)
  • Score intersections now vs record first, score later (chose record first)

Rationale: Primitives previously knew only their own shape; intersection gives them context. Naming it neutrally ('intersection', not 'clash') keeps it consistent with 'decisions become data' - measure the fact, don't bake in a verdict - and preserves the option that an overlap is a deliberate Boolean join. Bounding-box is cheap, deterministic (important for replay/seed storage) and good enough for a first signal. Recording before scoring avoids quietly turning GAAD back into a constraint-solver against the unrestricted-growth spirit of D015.

P028P021
D042 evolvedadoptedTooling23 Jun 2026

Champion = whole stage gold (supersedes the green edge-frame); add Grey, wedge becomes grey

Replace the champion's green square edge-frame (D028) with highlighting the ENTIRE champion stage surface in GOLD - fill #F2B705 with a brighter #FFD23F rim - echoing the gold parent stage of early GAAD versions, because the thin green frame did not read well in practice. Extends the Rebirth Colours palette (D041): add a neutral Grey #8A9299 (now 8 colours) and reassign the wedge from Bright Yellow to Grey, so yellow/gold is reserved as the champion signal and is unambiguous. With the champion no longer green, Green stays free as the dome's shape colour. Non-champion stages remain neutral light so the single gold stage stands out.

Rationale & optionsOptions considered
  • Keep the green square edge-frame (D028)
  • A gold/yellow edge-frame only
  • Highlight the whole stage gold (chosen, as in early GAAD)
  • Keep wedge yellow vs reassign wedge to grey (chose grey, to reserve yellow/gold for the champion)

Rationale: The green edge-frame was visually weak. A full gold stage fill is a strong pre-attentive 'this one is selected' cue (used in early versions) and far more legible than a thin frame. Freeing green from champion duty also removes the dome/champion green ambiguity flagged at D041. Grey adds a calm neutral shape option and lets yellow/gold mean only 'champion'.

P026
D041 evolvedadoptedTooling23 Jun 2026

Adopt the 'Rebirth Colours' palette; rename the 1994 palette 'Retro Bold'

Adopt a modern shape palette named 'Rebirth Colours' = the 'Vibrant Startup' web/UI palette (Coral Red #FF6B6B, Bright Yellow #FFE66D, Aqua Blue #4ECDC4, Deep Teal #1A535C, Sunset Orange #FF9F1C) plus an added Green #6BCB77 and Purple #9B5DE5. The original 1994 saturated-primary palette is retrospectively named 'Retro Bold' and kept as a selectable heritage look. Initial shape assignment: cube = Aqua Blue, pyramid = Coral Red, dome = Green, wedge = Bright Yellow, cylinder = Purple; Deep Teal reserved as the dark studio world tone and Sunset Orange as a secondary accent. The champion stays marked by the bright emissive green stage edge-frame (D028), which is distinct from the matte dome-green fill.

Rationale & optionsOptions considered
  • Keep the 1994 'Retro Bold' primaries
  • Desaturated tonal palette (earlier swatch)
  • 'Rebirth Colours' = Vibrant Startup + green + purple (chosen)

Rationale: The 1994 primaries read as dated (P026). A curated vibrant-but-modern web/UI palette gives GAAD a contemporary identity while staying colourful and legible. Naming the original 'Retro Bold' preserves it as a heritage option and frames the 1994->Rebirth shift. Adding green and purple keeps all five shapes clearly distinct and carries the brand green into the world. To be applied in the generator alongside the studio look (Eevee AO/soft shadow/bloom + grounding plinth).

P026
D040 newadoptedRecords23 Jun 2026

Adopt a development-issues log (I###)

Maintain a third record log - Development Issues (I###) - as JSON source of truth with generated Markdown, newest-first, in the same pattern as Decisions (D###) and Pivotal Moments (P###). Each issue records symptom, root cause, resolution, severity, status (open/resolved), the script version that introduced it (introduced_in) and the one that resolved it (resolved_in), and links to related decisions/PMs. Rendering is folded into generate_records_markdown.py so one command refreshes all views. All three record logs (Decisions, Pivotal Moments, Issues) also carry a Category field, drawn from one shared taxonomy - Philosophy, Platform, Terminology, Convention, Genome, Interaction, Records, Visualisation, Tooling, Scoring, Vision, Milestone - rendered as a Category column after Date so a large log stays navigable. A category means the same thing across all three logs.

Rationale & optionsOptions considered
  • Rely on the 'Changes in 0.x' script-header changelogs only
  • Track issues as Pivotal Moments
  • A dedicated structured Issues log (I###) with version traceability (chosen)

Rationale: Decisions and Pivotal Moments have no natural slot for 'this broke / why / how it was fixed', and the changelog prose is buried in script files and not queryable. A structured issues log captures the debugging journey as first-class data with version-level traceability (introduced_in -> resolved_in) that the changelogs cannot give, consistent with decisions-as-data (D020). Backfilled with I001, the v0.15 title-panel selection regression.

P024
D039 evolvedopenTooling23 Jun 2026

Ground-level title panel (GAAD + version + Generation number)

OPEN. Add a flat title plaque on the ground in FRONT of the 3x3 world, at stage level, in the empty foreground, showing the project name GAAD (brand green), the script version parsed from the filename (e.g. v0_18), and a clear 'Generation N' label - all as plan-readable surface text (D010), with a slim green brand accent bar. Implemented additively in v0.15 (no geometry/mutation/JSON change); the version auto-updates from the filename. Held OPEN pending UX tweaks (size, position, content and styling).

Rationale & optionsOptions considered
  • No title panel (status quo)
  • Flat ground plaque at stage level in the foreground (chosen)
  • Billboarded HUD panel hovering above the world
  • Content: GAAD wordmark + filename version + 'Generation N' label

Rationale: Gives the 3D view a clear, readable header identifying the tool, its version and the live generation - useful in screenshots, recordings and LinkedIn posts, and a step toward the thesis's 'comprehensive graphical user interface'. Placed flat at stage level so it reads as a title plaque consistent with surface labels (D010). Kept open because Miles has UX tweaks pending.

P023P024
D038 1994openScoring23 Jun 2026

Scoring model for variants/generations

OPEN. Adopt a measured 'fitness' score per variant/generation, derived from the data the report already computes (floor area, volume, shape mix, deltas), running ALONGSIDE human selection rather than replacing it. Held open pending Miles's UX feedback and resolution of the design forks below; the scoring rule encodes what 'good' means, so it is a real decision to be settled before code.

Rationale & optionsOptions considered
  • Objective (pure geometry: area, volume, compactness, variety) vs goal-directed (distance from a set target, e.g. tall-spiky / enveloping domes)
  • Absolute (variant in isolation) vs relative (improvement over its parent)
  • Told (Miles defines the rule) vs learned (GAAD infers taste from picks)
  • Single headline number vs a small vector breakdown (size / variety / goal-fit)
  • UX/surfacing: report column vs on-stage cue vs tree (pending Miles's UX feedback)

Rationale: The Evolution Summary already self-summarises the raw material, so the foundation exists (P021). This is the leap from recording the journey to evaluating it - the first foothold on the Design-Intelligence arc. Recorded as OPEN so the design conversation and UX feedback are captured before any scoring code is written.

P010P021P043P044
D037 newadoptedTerminology23 Jun 2026

Formalise the 1994 to Rebirth terminology as a source-of-truth record

Adopt a dedicated terminology record - gaad_terminology.json as the source of truth with a generated gaad_terminology.md view - mapping every GAAD term and concept from the 1994 thesis to its 2026 Rebirth equivalent, grouped into seven categories (identity & platform; genetic encoding & evolution mechanics; spatial structure & interface; selection & lineage; history, replay & storage; cells/shapes vocabulary; records, tooling & framing). Blank 1994 cells mark terms new in Rebirth; concepts that existed in 1994 but are not yet built are flagged. Each row cites its governing decision where one exists.

Rationale & optionsOptions considered
  • Leave terminology scattered across decisions and the handover doc
  • A single flat glossary table
  • Comprehensive categorised JSON source of truth with generated Markdown (chosen)

Rationale: Terminology was defined piecemeal across D003/D004/D005/D006/D007/D021/D022/D024 and the project background, and the handover repeatedly referenced a gaad_terminology.md that did not yet exist on disk. Making it a first-class record matches the decisions-as-data principle (D020), gives the vocabulary one canonical home, ties each Rebirth term back to its 1994 thesis root, and supplies clean reference material for posts, the thesis write-up and the future AI-learning chapter.

P019P022
D036 newadoptedVisualisation22 Jun 2026

Evolution Summary Report: add per-generation ISO date/time and rename title

Rename the report title to 'GAAD - Evolution Summary Report' and add a Date / Time column showing each generation's creation timestamp in ISO format (YYYY-MM-DD HH:MM:SS, to the second), so rows can be sorted chronologically. The timestamp is read from generation.created_at already stored in the JSON - no generator change needed (report v0_2).

Rationale & optionsOptions considered
  • No timestamps
  • Friendly date format
  • ISO format for sortability (chosen)

Rationale: The generation JSON already records created_at to the second; surfacing it gives the report a real chronology, and ISO format sorts correctly as plain text.

P010
D035 newadoptedTooling22 Jun 2026

Add-on UX: rename Evolution Tree, auto-write report with it, one-click Open Report

Refine the GAAD add-on panel: (1) rename 'Build Tree' to 'Evolution Tree' (names the thing, not the action; the build is quick); (2) running Evolution Tree also auto-writes the report, since both read the same Generations data and are usually wanted together - a standalone 'Write Report' button is kept for report-only runs; (3) 'Open Report Folder' becomes 'Open Report', opening the report HTML directly in the browser, with opening the folder as a fallback when the HTML is not yet present. Labels finalised: 'Evolution Tree', 'Write Evolution Tree Report', 'Open Evolution Tree Report'.

Rationale & optionsOptions considered
  • Keep current labels/behaviour
  • Rename only
  • Auto-report on tree run
  • Open HTML directly vs open folder

Rationale: Lowers friction: one click gives both the 3D lineage and the report, and the result opens straight in the browser. Keeping standalone Write Report preserves report-only runs. Pure workflow polish on the tool (P024).

P024
D034 newadoptedTooling22 Jun 2026

Scene hygiene: purge orphaned data, isolate the tree scene, and auto-frame the view each run

Adopt clean scene management across the GAAD scripts: (1) each run PURGES orphaned/accumulated data (stray cameras, lights, meshes, curves left from prior runs) so counts stay stable rather than climbing into the hundreds; (2) the Forward Evolution Tree builds in its own dedicated 'GAAD Tree' scene, fully isolated from the generator world; (3) after building, the script AUTO-FRAMES the viewport on the actual geometry and sets a generous clip distance, so the world/tree is always correctly sized and centred without manual Home / clip-end fiddling.

Rationale & optionsOptions considered
  • Leave manual (press Home, set clip end by hand each time) - current, error-prone
  • Auto-frame only
  • Purge only
  • Purge + tree isolation + auto-frame (chosen)

Rationale: After ~24 generations plus repeated tree builds, data accumulated (many cameras/lights/curves) and the leftover tree camera/view made the generator world appear tiny and clipped when switching scenes. The root cause is scene/data management, not the view; fixing it in the scripts removes a whole class of usability problems and keeps files lean - important as worlds scale (D007) and as seed-based storage (D030) arrives.

P023
D033 newadoptedTooling22 Jun 2026

GAAD Rebirth Blender add-on for one-click workflow

Provide a small installable Blender add-on (gaad_rebirth_addon.py) that adds a 'GAAD' sidebar tab with buttons - Next Generation, Build Tree, Write Report (plus Open Report Folder) - so the scripts no longer have to be loaded/pasted each session. The add-on auto-detects the newest versioned script (gaad_generator_v*.py etc.) in the .blend's folder, so future versions are picked up automatically. The standalone scripts remain the canonical artefacts; the add-on is a thin launcher that runs them.

Rationale & optionsOptions considered
  • Manual load/paste each run (current - slow)
  • Register + auto-run on file open
  • External editor workflow
  • Installable add-on with a GAAD panel and buttons (chosen)

Rationale: Removes the repetitive load-script step that was slowing every session, while keeping the versioned scripts as the source of truth (the add-on just launches the newest). Auto-detection avoids editing the add-on per version, fitting the D031 naming/folder convention.

D032 newadoptedTerminology22 Jun 2026

'GAAD' is always capitalised in prose, labels and output

Whenever GAAD appears as a word - in comments, strings, on-screen labels, reports, posts, graphics and documentation - it is written in full uppercase: GAAD. Exception: the lowercase 'gaad_' prefix in filenames and code identifiers (e.g. gaad_generator_v0_12.py, gaad_version) is retained, as lowercase is standard coding convention.

Rationale & optionsOptions considered
  • Always uppercase GAAD everywhere including filenames
  • Uppercase in prose/labels, keep lowercase gaad_ prefix in code/filenames (chosen)

Rationale: GAAD is an acronym (Genetic Aided Architectural Design) and reads correctly only in uppercase. Code identifiers and filenames keep the conventional lowercase prefix to avoid breakage and match normal practice.

D031 evolvedadoptedConvention22 Jun 2026

Filename and folder-structure convention

ADOPTED. Filenames follow gaad_[tool]_v[version].py (e.g. gaad_generator_v0_12.py, gaad_tree_v0_1.py, gaad_tree_report_v0_1.py). Local project layout: a per-version folder (e.g. 'GAAD Development 0_12') containing the .blend and the .py scripts side by side, plus two subfolders - 'Generations/' (the recorded per-generation JSON; was 'Replay') and 'Reports/' (HTML/PNG report output). Scripts resolve the data folder RELATIVE to the .blend (Blender //Generations) so paths never need hand-editing; the plain-Python report falls back to a Generations folder beside the script. An absolute path remains an optional override.

Rationale & optionsOptions considered
  • Per-project hand-edited absolute REPLAY_ROOT (current - error-prone, caused a path mismatch)
  • Fixed standard folder layout with relative //Replay resolution
  • Single config file/variable shared by all scripts
  • Versioned project folders (GAAD Development 0_11, 0_12 ...) vs one stable project folder
  • ADOPTED: default to //Replay relative to the .blend; absolute path optional override

Rationale: Folder/filename drift has already caused a real problem: the tree script's REPLAY_ROOT pointed at an old folder while the data lived in a newer one, so no geometry appeared. A convention removes that whole class of error and makes the project portable and self-consistent. Opened to decide deliberately rather than ad hoc. Resolved: scripts beside the .blend; data folder renamed 'Generations' (clearer than 'Replay'); reports in 'Reports/'. Relative resolution removes the path-mismatch class of error.

D030 1994adoptedRecords22 Jun 2026

Seed-based storage: keep the selected variant in full, store only seeds for unselected stages

Change replay JSON storage to 'store the recipe, not the cake'. Per generation, save the SELECTED variant's full design parameters, plus only the SEED (variant_seed) for each UNSELECTED stage. Any sibling can then be regenerated identically on demand from parent + seed, so full backtracking into non-selected stages is preserved at near-zero storage cost - scaling cleanly from 3x3 to nxn (e.g. 12x12). REQUIRES generation to be bit-for-bit deterministic from seed+parent, so a 'genome_version' is stamped into the JSON and reconstruction always uses the matching algorithm version.

Rationale & optionsOptions considered
  • Full population (current 0.11) - total backtrack, explodes at large n
  • Selected-only - lean, but unchosen siblings lost permanently
  • Seed + reconstruct - store recipe, regenerate siblings on demand (chosen)
  • Lazy snapshot - save siblings only if a backtrack actually happens

Rationale: Modern echo of the thesis's compact unique-numbering encoding (Figs 3.23/3.25): store the generative recipe rather than every output. Keeps full backtracking while files stay tiny at nxn. The generator already seeds each variant with random.Random(variant_seed), so the foundation exists. The catch - and the companion rule - is that generation becomes a contract: a genome_version must be recorded so old seeds reconstruct faithfully even as the genome evolves. Chosen by Miles.

P010P020
D029 newadoptedVisualisation21 Jun 2026

Tree captions: billboarded HUD pill, neutral accent, headline + metrics

Each Forward Evolution Tree stage gets a hovering HUD-style pill caption, billboarded to face the camera (aligning with the D020 green-ring language: lifted off the ground, readable from any orbit angle, modern). Content is a bold change HEADLINE (e.g. 'shed 1 form, more cubes') over a faint METRICS line (floor area m2 / volume m3). Captions use a NEUTRAL accent (cool white/grey); green is reserved only for the live champion marker so that signal stays rare and strong. The change/headline/metrics are derived from the same replay-diff logic as the Evolution Summary, so the tree and the report tell one story from one source. Blender = intuitive quick-read; Markdown/HTML = formal report.

Rationale & optionsOptions considered
  • Flat ground text (current)
  • Hovering billboarded HUD pill (chosen)
  • Glowing/emissive caption
  • Node label on genetic-path connector
  • Green-accent parent caption vs reserve green for champion only (chose reserve)
  • Headline only vs headline + metrics line (chose headline + metrics)

Rationale: HUD pill inherits D020's modern, hover-and-billboard language without the legibility risk of glowing text, and stays independent of the not-yet-built Tree 0.2 connector (which can tie in later). Reserving green for the live champion keeps the signal meaningful. Two-tier content (bold headline + faint metrics) is scannable in-scene while full detail stays in the report. Sharing the summary's diff logic keeps one source of truth. Claude decided at Miles's request.

P020P021
D028 newadoptedInteraction21 Jun 2026

Champion highlight: glowing green square frame around the stage edge

The champion (parent) stage is highlighted by a glowing GREEN SQUARE FRAME tracing the stage perimeter, sitting just above the surface, on a neutral stage. Revised from the original hovering ring (which clashed with tall objects on the stage): an edge frame stays clear of all geometry. Label stays the bare variant id; status shown visually.

Rationale & optionsOptions considered
  • Keep '(PARENT)' text suffix
  • Colour alone (gold)
  • Border/frame
  • Glowing orb marker
  • Hovering ring/halo marker (chosen)
  • Vertical beam/pin marker
  • Slight plinth
  • Neutral stage vs keep gold (chose neutral)
  • REVISED to square edge frame (ring clashed with tall objects)
  • Flat frame vs raised rim (chose just-above-surface frame)
  • Square frame vs circular (chose square to match stage)

Rationale: GUI principle: show state visually, not in words. A green ring reads pre-attentively as 'active/selected' from any orbit angle in 3D, feels modern/cutting-edge, and frames the stage rather than obscuring it. Neutral surface lets green be the single parent signal without a competing colour. Label stays bare id, honouring D016. Chosen by Miles. REVISED: the hovering centre ring intersected tall forms on the stage; a perimeter frame keeps the modern emissive 'active' cue while staying clear of the objects, and a square frame matches the square stage footprint ('this whole stage is selected').

P020
D027 newadoptedRecords21 Jun 2026

Adopt a development roadmap (near-term + beyond-1.0 vision)

Maintain a living roadmap (gaad_roadmap.md): next-days fixes (close D018 dome question, tree connector 0.2, summary PNG export), next-weeks first new capability (Scoring), then a beyond-1.0 vision carrying the research questions and the 'AI learns from design evolution' principle. Arc: Generate -> Select -> Record -> Replay -> Summarise -> Score -> Learn -> Design Intelligence.

Rationale & optionsOptions considered
  • No formal roadmap
  • Tight near-term only
  • Balanced near-term + vision
  • Vision-forward roadmap

Rationale: Today was complex and generative; a roadmap captures momentum without overcommitting. Weighted vision-forward because the session's real discovery (GAAD as recorded design lineage, beyond geometry) is the compass. Kept a living document, like the decision log.

P021P022
D026 newadoptedGenome21 Jun 2026

Dome geometry: circular hemisphere; area = pi r squared, volume = hemisphere

Domes are KEPT and trimmed to a true HEMISPHERE cap sitting flat on the stage (no buried lower half). Domes are locked CIRCULAR in plan: width = depth = diameter, so a dome is defined by a single size. Floor area = pi * r^2 (the circle on the stage). Volume = (2/3) * pi * r^3 (hemisphere). Domes are now INCLUDED in the evolution-summary sums (INCLUDE_DOMES_IN_SUMS = True). This also resolves the long-parked dome hemisphere-trim.

Rationale & optionsOptions considered
  • Geometry: full sphere (as currently rendered) vs hemisphere trim (true dome cap)
  • Volume if full sphere: (4/3)*pi*r^3 vs visible half (2/3)*pi*r^3
  • Volume if hemisphere: (2/3)*pi*r^3
  • Floor area: plan circle/ellipse pi*(w/2)*(d/2) (same either way)
  • Whether the hemisphere trim (long-parked) is done as part of this
  • Circular vs elliptical plan (chose circular)
  • Hemisphere volume (2/3 pi r^3) vs visible-half of full sphere

Rationale: Circular hemisphere is the honest, simplest reading: half a form sitting on the surface, footprint a true circle, volume the matching hemisphere. Locking circular reduces a dome to one parameter (diameter), tidies the genome, and makes area/volume unambiguous. Chosen by Miles.

P018
D025 newadoptedVisualisation21 Jun 2026

Evolution summary (readout C) with floor area and volume; domes excluded from sums

Build a standalone companion 2D readout (HTML/PNG) that reads the replay folder, walks the selected-parent lineage, and writes one row per generation: generation number, variant id, a plain-English 'what changed' headline, and a 'from the data' column showing shape-mix shift plus total floor area (m2) and total volume (m3). Floor area and volume are SUM OF PER-OBJECT footprints/volumes, shown as the absolute total with the change from the previous generation beside it. Per-shape maths: cube w*d and w*d*h; pyramid w*d and (w*d*h)/3; cylinder ellipse pi*(w/2)*(d/2) and *h; wedge (w*d) and (w*d*h)/2. DOMES ARE EXCLUDED from the area/volume sums for now (remarked out in code, flagged in the readout), pending D018. Domes still generate and render normally.

Rationale & optionsOptions considered
  • Display placement: on-stage caption (A) vs side billboard (B) vs companion 2D readout (C)
  • Floor area as sum of per-object footprints vs combined union coverage
  • Totals shown as absolute vs delta vs both
  • Include domes in sums now vs exclude until their geometry is settled

Rationale: Readout C is fully legible, shareable (LinkedIn/thesis), and avoids 3D-text problems; it pairs with the bare variant-id labels already on the Blender stages (D016). Sum-of-footprints is simple and transparent (noted as a gross sum). Floor area and volume reconnect the abstract evolution to architectural terms. Domes are excluded for now because their geometry is unresolved (full sphere vs hemisphere), which would distort the sums; tracked as the open decision D018.

P020P010
D024 newadoptedConvention21 Jun 2026

All labels use the JSON variant id (G001_S006 format)

Every on-screen label - stage labels in the main generator and row labels in the Forward Evolution Tree - shows the bare variant id in 'G001_S006' format, identical to the variant_id stored in the JSON. No friendly 'Gen N / Stage S' text and no A/B/C stage letters.

Rationale & optionsOptions considered
  • Letter stage names A,B,C... to avoid verbal confusion with generations (rejected earlier)
  • Friendly 'Gen N - Stage S' labels
  • Bare JSON variant id 'G001_S006' for all labels

Rationale: Keeps it simple and faithful: the label IS the data. What you see in the scene matches the JSON and the replay filenames exactly, with no translation layer to maintain or get out of sync - consistent with the decisions-as-data philosophy. The id already encodes the stage (S006), so nothing is lost.

P010P020
D023 1994adoptedVisualisation21 Jun 2026

Forward Evolution Tree - selected-parent lineage from replay JSON

Build a standalone script (run in a fresh Blender file) that reconstructs the selected-parent lineage (the 'genetic path' of the thesis) by reading the Replay/G001... JSON files. It rebuilds each generation's chosen parent as full 3D geometry, one stage per generation, stacked in a single vertical column with Gen 1 at the top descending downward and vertical gutters between rows.

Rationale & optionsOptions considered
  • Rebuild full 3D parents (option a) vs flat plan/thumbnail strip (option b)
  • Read from replay JSON vs from the live scene
  • Run in a new Blender file vs build into the current scene
  • Stop at last recorded selection vs append the current unselected generation
  • Read all generations vs a start/end range
  • Stacked stages only vs an explicit genetic-path connector line between parents

Rationale: Faithful to the thesis 'genetic array' (Fig 3.29) and genetic path (Fig 3.25). Reading the replay folder keeps it consistent with the replay philosophy and decouples it from the live generator. Agreed scope: option a (full 3D), reads JSON, new Blender file, stop at last recorded selection, all generations (no range), labels show generation and chosen stage (as in the thesis), stacked stages only for now (connector line deferred).

P010
D022 evolvedadoptedTerminology21 Jun 2026

GAAD expands to 'Genetic Aided Architectural Design'

The canonical expansion of GAAD is 'Genetic Aided Architectural Design', applying to both the 1994 thesis and GAAD Rebirth.

Rationale & optionsOptions considered
  • Genetic Aided Architectural Design (as the thesis pages read)
  • Generic Aided Architectural Design (as some Rebirth summaries read)
  • A deliberate meaning shift between 1994 and Rebirth

Rationale: The 1994 thesis (Fig 3.3 heading and back-cover abstract) reads 'Genetic'. The 'Generic' wording in later Rebirth summary documents was a transcription slip rather than an intentional change. Settling on 'Genetic' keeps 1994 and Rebirth consistent.

P019
D021 1994adoptedGenome21 Jun 2026

Per-cell scaling rules for the typed genome

Keep the five current cell names (cube, pyramid, dome, wedge, cylinder) and apply per-type scaling rules during mutation: dome mutates with uniform XYZ (all axes locked together); cylinder keeps X and Y equal with Z free (a true round column); cube, pyramid and wedge mutate freely per axis.

Rationale & optionsOptions considered
  • Restore the original six historical cells (slab, dome, box, pyramid, wedge, column) with their Fig 3.27 rules
  • Keep the five current names and apply per-type scaling rules to them
  • Cylinder free to squash vs cylinder locked XY-equal

Rationale: Keeps GAAD simple and avoids renaming churn (no going backwards on naming, consistent with existing JSON and scenes). Locking dome to uniform XYZ fixes the spindle artefact; locking cylinder XY-equal keeps it a proper circular column. Cube, pyramid and wedge stay free so the tall-spike (3.6A) and long/wide-wedge (3.6B) experiment behaviours remain reachable.

P018
D020 evolvedadoptedRecords21 Jun 2026

Decisions and Pivotal Moments recorded as JSON with generated Markdown

Maintain two linked logs (Decisions D###, Pivotal Moments P###) with JSON as the source of truth and Markdown views generated from it.

Rationale & optionsOptions considered
  • Markdown only
  • JSON only
  • JSON source of truth with generated Markdown

Rationale: Mirrors how GAAD already treats design history (structured data first, human view second) and makes the decision log itself replayable and parseable for the future AI chapter.

P002
D019 newadoptedConvention21 Jun 2026

Filenames carry a descriptive update tag

Each script version's filename and header self-document the change (e.g. a few words describing the update), so the first few lines explain what changed.

Rationale & optionsOptions considered
  • Version number only
  • Version number plus descriptive tag

Rationale: Makes each artefact self-documenting and easier to track across the development history.

D018 newadoptedGenome21 Jun 2026

Adopt the 8-gene typed genome (option a)

Rebuild the mutation engine around the original 8-parameter typed genome: cell type, XY movement, XYZ scale factors, and rotation, with type-specific growth constraints (e.g. columns grow in Z only, domes uniform XYZ, slabs in XY).

Rationale & optionsOptions considered
  • (a) Faithfully reproduce the original typed genome with per-type scaling rules
  • (b) Keep a looser abstract sandbox with a simple anti-spindle cap

Rationale: Makes Rebirth a genuine re-implementation of the thesis rather than a lookalike, and fixes the spindle while preserving enveloping domes. Chosen by Miles.

P018
D017 1994adoptedGenome21 Jun 2026

Dome geometry faithful to the original genome

Cells mutate under the original per-type scaling rules from the 1994 genome (Fig 3.27) rather than free per-axis mutation. In particular, domes mutate with uniform XYZ scaling so they stay spherical-proportioned at any size.

Rationale & optionsOptions considered
  • Cap dome height relative to footprint (simple sandbox fix)
  • Restore the original per-type scaling rules so dome XYZ stays uniform

Rationale: The spindle artefact was a port error: the Blender port let height mutate independently of width/depth, which the original genome's 'domes keep equal XYZ scales' rule prevented. The height-cap would also have broken Experiment 3.6A, which intentionally evolves large enveloping domes.

P018
D016 newadoptedPhilosophy2026-06-week1

Decisions become first-class project data

GAAD records design, development, terminology and selection decisions as data - underpinning the future Design Memory / AI-learning direction.

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D015 1994adoptedGenome2026-06-week1

Unrestricted growth after Generation 1

Designs are not constrained after Generation 1 - shifting from architectural modelling toward abstract evolutionary exploration (prototype 0.6d).

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D014 newadoptedGenome2026-06-week1

Multiple objects per Stage

Each Stage/variant may contain multiple objects, enriching the selection space (prototype 0.4).

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D013 newadoptedRecords2026-06-week1

Dedicated data folders

Store outputs in a dedicated data folder beside the project (Project.blend + Project_data/) for replay and scalability.

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D012 newadoptedRecords2026-06-week1

JSON recording

Record project state to JSON - the foundation of replay.

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D011 newadoptedInteraction2026-06-week1

Click selection

The user selects by clicking Stages/objects directly - visual and intuitive, closer to the original thesis workflow.

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D010 newadoptedInteraction2026-06-week1

Surface labels

Stages labelled on the surface (plan-readable), rather than via menus or side panels.

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D009 evolvedadoptedGenome2026-06-week1

Zero-gap Stage layout

Week 1 layout: Stages placed edge-to-edge with no gap. (Note: superseded in Week 2 by gutters/footprint constraints - see D023's lineage.)

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D008 1994adoptedConvention2026-06-week1

Generation numbering begins at 1

Generations numbered from 1, not 0, to align with human understanding.

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D007 1994adoptedTerminology2026-06-week1

GAAD Expanded defined

Allow NxN Worlds (3x3, 4x4, 12x12, larger). Same philosophy at greater scale.

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D006 evolvedadoptedTerminology2026-06-week1

GAAD Classic defined

Preserve the original MSc architecture as GAAD Classic: a 2x2 World, four Stages, a selected parent generating children.

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D005 1994adoptedTerminology2026-06-week1

'Design Parameters' replaces 'Genome'

Terminology: Design Parameters (and Design Parameter) replace Genome/Gene, to be understandable to designers and unambiguous for future AI.

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D004 1994adoptedTerminology2026-06-week1

'Stage' adopted as the evaluation area

Terminology: Stage becomes the individual design presentation / evaluation area within a World.

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D003 1994adoptedTerminology2026-06-week1

'World' adopted as the top-level environment

Terminology: World becomes the top-level design environment containing Stages.

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D002 newadoptedPlatform2026-06-week1

Blender selected as platform

Use Blender (over Revit, Grasshopper, Unity). Open source, Python scripting, full geometric control, rapid prototyping, AI-integration potential.

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).

D001 1994adoptedPhilosophy2026-06-week1

Record design journeys

Adopt the founding principle: GAAD records the design journey - decisions, alternatives, selections and branching histories - as first-class data, not just final outcomes.

Rationale & options

Rationale: Recorded in Week 1 (GAAD Rebirth Master Context Archive v2.0).