GAAD Diary · Design Memory Platform

GAAD Technical Diary - 2026-07-14 (second session)

Technical diary · generated from gaad_diary_technical_20260714_b.md by Scripts/gaad_diary_html.py · never hand-edited

Session opened from bundle 0_134 (four-zip set), immediately after the 0_134 cut. UK clock from Miles: 14:53 first mark, 23:19 last mark; bundle 0_135 cut the following morning (15 Jul, 07:03 mark). Arrival gate green on open: manifest CHECK PASS 178 files, validate RESULT PASS.

D166 tooling - separation RESOLVED, the rest still open

1. Claude Code v2.1.209 installed on Miles's machine. Native Windows installer (irm https://claude.ai/install.ps1 | iex), no Node.js needed, lands at C:\Users\miles\.local\bin\claude.exe. PATH not picked up by the installer's own report; launched by full path for the session. Requires a paid plan - Miles is on Max, confirmed Pro is his floor and still covers it.
2. CLAUDE.md written into 2_Working/Code - the working-area twin of SKILL.md. Carries the wall rule, the standing rules, D149 filenaming, the version-check procedure, and the retire-to-Superseded rule.
3. PROVEN live: Claude Code read CLAUDE.md unprompted and reported back the D166 wall rule verbatim. The write/download/drop loop is genuinely dead when the tool is used.
4. REJECTED for now: Miles judged the terminal loop too slow for his way of working and reverted to the chat loop the same session. Claude Code is installed and available, not adopted. Honest read: it trades download friction for prompt-typing friction.
5. NEW HARD FINDING: the whole GAAD estate lives under OneDrive (C:\Users\miles\OneDrive\Documents\GAAD). Git and OneDrive fight over the .git folder and can corrupt the repo. Git is installed, deliberately NOT initialised. Any repo must live OUTSIDE OneDrive - that location is the next D166 sub-decision.
6. Claude Desktop Code tab + Git PARKED by Miles.
7. The blocking sub-question in D166 (does the .blend load scripts by relative path?) fell away: ARAL runs as a script from the Text Editor, so the move needed no re-linking.

2_Working restructure (D168) - the wall built by construction

1. Before: one folder per language workset (aral_development / mhal_development / twal_development), scripts inside, and .blend files saved next to the .py.
2. Options put to Miles: A flat Code/ with all scripts; B Code/ with per-language subfolders; C split inside each workset. Miles chose A after testing it against his own one-version-per-chain habit.
3. After: 2_Working/Code (all current text, 8 files) + 2_Working/Code/Superseded (8 retired aral .py) + 2_Working/Blender (.blend only).
4. Flattening collision found and fixed by renaming, not re-nesting: two generic read_me.txt became mhal_read_me.txt and twal_read_me.txt.
5. A stray aral_prototype_v1_006.blend was found already sitting in aral_development/Superseded and moved to Blender/. The mixing had begun before the wall existed.
6. First restructure pass landed three files wrong (blend left in Superseded, a current twal file archived, a duplicate twal_development nested inside Superseded); caught by diffing the snapshot against the target and fixed in one pass.

ARAL prototype chain v1_017 -> v1_020

1. v1_018 PYRAMID activated. Discovery: the pyramid was ALREADY BUILT - mesh in _mesh_for (square base + apex, five faces, the canonical PRAL geometry), colour in FALLBACK_COLOURS - but held out of SHAPES as a dormant PRAL-era form. The whole change was one word: SHAPES = ("cube", "pyramid", "sphere"). Panel button row, mutation pool, conformance counts and gene encoding all drive off SHAPES, so no new wiring. Orientation-free like every ARAL form; default toggle OFF (opt-in, like cube), so a fresh start stays sphere-only.
2. v1_019 TAPE TRANSPORT. The history model rebuilt. BEFORE: _hist_rewind popped generations off the list, so rewinding DESTROYED the future and Play could only ever breed fresh. AFTER: a separate playhead index (aral_head) moves over aral_history without destroying it. Rewind steps back one and replays intact. Play advances at the speed slider; _hist_forward replays a recorded generation if one exists ahead and returns False at the live edge so the caller breeds a new child. _hist_push truncates above the head before appending, so mutating from a rewound point rewrites the future. Generation counter in the transport row. Play Speed slider (FloatProperty 0.01-1.0s, default 0.2) drives both Play and Mutate xN, replacing the fixed 0.1s tick. Generation scrubber (IntProperty with update callback + re-entrant lock) jumps the head and replays; never generates.
3. v1_020 REFINEMENTS. Mutate xN now RESETS the tape - the current plan becomes gen 0 and the run records 1..N, discarding prior tape (Miles's call). Scrubber renamed "Mutation Scrub" (Miles's name). Scrubber soft range refitted to the recorded tape whenever length changes (_fit_scrub_range, guarded by a length-change check), so the handle spans only generations that exist.
4. The design rule that unlocked it was Miles's, not the AI's. Offered a binary (fixed recording vs branching regenerate) he rejected both and supplied: a generation can only be shown if it has been generated. Play replays where tape exists and records where it does not. Banked as P062/Q039; matures F036.

Verification

1. Syntax check on every version before hand-off (py_compile).
2. Headless proofs run on v1_018, v1_019, v1_020: ALL PASS each time (the file's own __main__ block).
3. Tape logic proven separately: a pure-python simulation of _hist_head/push/rewind/scrub/forward run against all rules - fresh tape on Generate, non-destructive rewind, play replay-then-record, branch truncation, scrub clamp, Clear. 8/8 PASS, then 4/4 PASS again for the v1_020 additions. Logic proven headlessly; UI wiring confirmed by Miles in the viewport.
4. Miles confirmed all three live in Blender: pyramid row Cube/Pyramid/Sphere with amber pyramids on stage; counter at 109 with scrub tracking; Mutation Scrub at 14 with speed 0.19.

T027 - the version collision (open, ships unresolved)

Two different aral_prototype_v1_018.py exist. The real one (honest placed/skipped readout) was cut into 0_134 but never saved back to Working; Miles's working copy was still v1_017. The mismatch WAS flagged at arrival that morning and not chased before building, so the pyramid/tape/scrub chain was built on v1_017. Consequences: the number v1_018 is ambiguous, and the live chain lacks the placed/skipped readout. Nothing is lost - both chains compute rolled/skipped; only the readout and the numbering diverge. Renumber options (single merge vs full rebase to v1_019/020/021) were put to Miles; he chose neither for this bundle. v1_020 ships as-is; the readout is captured as D169 for his action; the real v1_018 is KEPT in Prototype/ as the source for that fix.

D169 - the placed/skipped readout (open, Miles's action)

The readout reports requested/placed/skipped in the always-open STATUS box: "16 of 64 placed, 48 skipped (no room), conformance PASS", appearing only when objects were dropped. Its absence has a sting: the same session, Miles watched Harmony refuse to place objects with no room and reached that conclusion by eye - a behaviour the panel had already been built to explain. Open part is the WORDING: Miles also asked for the STATUS text to be SHORTENED (it truncates in a narrow panel) and this readout makes the line longer in exactly the case that matters. His call before the code lands.

Records banked

D166 updated (separation resolved, Claude Code + OneDrive/Git findings, still open on arrival automation and Git location). D168 NEW (2_Working Code/Blender wall). D169 NEW (readout, open). F036 revised (transport matured from scaffolding to a true tape). P062 NEW (the scrub). Q039 NEW (Miles on the scrub). Terminology section 6: five tape rows added (Tape, Playhead, Live edge, Mutation Scrub, Branch). T027 NEW (version collision, open). Release 0_135 written.

Stale entries retired from CURRENT_ACTIONS

EP4 "due 13 Jul, NOT built, raise first" - EP4 is built and live on the site and LinkedIn (confirmed by Miles). "cut_bundle.py one-command bundler still to be built" - it exists and cut this bundle. New carried item: the four-zip set was formalised 14 Jul but is not yet written into SKILL.md.

Today's Claude Task Tree

14 JUL 2026 (second session) - bundle 0_134 -> 0_135
│
├── ARRIVAL
│   ├── four zips extracted; manifest CHECK PASS (178 files)
│   ├── gaad_validate RESULT PASS
│   └── EP4 confirmed live (stale CURRENT_ACTIONS line retired)
│
├── D166 TOOLING (separation half RESOLVED -> D168)
│   ├── Claude Code v2.1.209 installed (native Windows, Max)
│   ├── CLAUDE.md house rules into 2_Working/Code
│   ├── proven: read the file, honoured the wall rule
│   ├── REJECTED for now - terminal loop too slow, chat loop resumed
│   ├── Git installed, NOT initialised (OneDrive corruption hazard)
│   └── Desktop Code tab + Git PARKED
│
├── 2_WORKING RESTRUCTURE (D168, done on disk)
│   ├── option A chosen: flat Code/ + shared Code/Superseded/
│   ├── Blender/ = .blend only (the wall)
│   ├── read_me collision fixed by renaming
│   └── stray .blend found in Superseded, moved to Blender/
│
├── ARAL PROTOTYPE v1_017 -> v1_020
│   ├── v1_018 pyramid activated (was built + dormant; one word)
│   ├── v1_019 tape transport (playhead, counter, speed, scrub)
│   ├── v1_020 xN resets tape; Mutation Scrub; range fits tape
│   ├── Miles's rule: shown only if generated (replay vs record)
│   └── all three confirmed live in Blender
│
├── RECORDS
│   ├── D166 updated; D168, D169 new
│   ├── F036 revised (tape matured); T027 new
│   ├── P062 (the scrub), Q039 (Miles on the scrub)
│   └── terminology s6 (tape terms)
│
└── BUNDLE 0_135 (four zips)
    ├── live 0_135 (build PASS, validate PASS)
    ├── website 1_015 (records refreshed)
    ├── diaries (14 Jul second pair, _b)
    └── working (Code/Blender structure)