aboutsummaryrefslogtreecommitdiff
path: root/docs/notes.org
blob: 7ce95104dd0cd068356e7838185f3e2e300e39cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
#+TITLE: Claude Code Notes - archangel
#+AUTHOR: Craig Jennings & Claude
#+DATE: 2026-01-17

* About This File

This file contains project-specific information for this project.

**When to read this:**
- At the start of EVERY session (after reading protocols.org)
- When needing project context or history
- When checking reminders or pending decisions

**What's in this file:**
- Project-specific context and goals
- Available workflows for this project
- Active reminders
- Pending decisions
- Session history

**For protocols and conventions, see:** [[file:protocols.org][protocols.org]]

* Project-Specific Context

** Overview

Build system for creating a custom Arch Linux installation ISO with ZFS support. The goal is to have a bootable ISO that can install Arch Linux on ZFS root without needing to manually compile ZFS or deal with kernel version mismatches.

** Repository

- Remote: =cjennings@cjennings.net:git/archangel.git=
- Branch: =main=
- docs/ is committed (not private)

** Key Components

- =build.sh= - Main build script (runs as root)
  - Downloads ZFS packages from archzfs.com repository
  - Creates custom archiso profile based on releng
  - Adds custom packages (nodejs, npm, jq, zsh, htop, ripgrep, etc.)
  - Copies custom installer scripts into ISO
  - Builds ISO with mkarchiso

- =custom/= - Custom scripts included in ISO
  - =archangel= - Main installer script
  - =install-claude= - Claude Code installer
  - =archsetup-zfs= - ZFS-specific Arch setup
  - =zfs-setup= - Installs ZFS packages and loads module (generated by build.sh)

- =scripts/test-vm.sh= - QEMU VM for testing the ISO

** Current State

TESTING: archangel installer supports both ZFS and Btrfs.

- ISO builds successfully with linux-lts + zfs-dkms
- ZFS installations use ZFSBootMenu
- Btrfs installations use GRUB + grub-btrfs for snapshot boot
- Both filesystems support multi-disk RAID configurations

** Goals

Create a bootable Arch Linux installation ISO that:
1. Installs Arch on ZFS root with native encryption
2. Uses sane defaults for dataset layout
3. Configures automatic snapshots (sanoid)
4. Sets up replication to TrueNAS for backups
5. Includes Claude Code on live ISO for emergency troubleshooting

** Design Decisions

*** Kernel Strategy
- Use =linux-lts= + =zfs-dkms= from archzfs.com repo
- DKMS builds ZFS from source, guaranteeing kernel compatibility
- Slower build time but eliminates version mismatch issues entirely
- LTS kernel provides stability, DKMS provides flexibility

*** ZFS Pool Configuration
| Setting | Value | Rationale |
|---------+-------+-----------|
| Pool name | =zroot= | Standard convention |
| Encryption | AES-256-GCM, passphrase | Required at every boot |
| Compression | =zstd= (default) | Good balance of speed/ratio |
| Ashift | 12 (4K sectors) | Modern drives |
| Root reservation | 50GB | Prevents pool from filling |

*** Dataset Layout
| Dataset | Mountpoint | Special Settings | Purpose |
|---------+------------+------------------+---------|
| zroot/ROOT/default | / | reservation=50G | Root filesystem |
| zroot/home | /home | | Home directories (archsetup creates user subdataset) |
| zroot/media | /media | compression=off | Pre-compressed media files |
| zroot/vms | /vms | recordsize=64K | VM disk images (qemu/libvirt + virtualbox) |
| zroot/var/log | /var/log | | System logs |
| zroot/var/cache | /var/cache | | Package cache |
| zroot/var/lib/pacman | /var/lib/pacman | | Package database |
| zroot/var/lib/docker | /var/lib/docker | | Docker storage |
| zroot/tmp | /tmp | auto-snapshot=false | Temp files |
| zroot/var/tmp | /var/tmp | auto-snapshot=false | Temp files |

*** Snapshot Policy (Sanoid)
Less aggressive since TrueNAS handles long-term backups:

| Template | Hourly | Daily | Weekly | Monthly | Used For |
|----------+--------+-------+--------+---------+----------|
| production | 6 | 7 | 2 | 1 | root, home, var/log, pacman |
| backup | 0 | 3 | 2 | 1 | media, vms |
| none | 0 | 0 | 0 | 0 | tmp, cache |

Plus: Pacman hook creates snapshot before every transaction.

*** TrueNAS Replication
- Primary: =truenas.local= (local network)
- Fallback: =truenas= (tailscale)
- Destination pool: =vault/[TBD]=
- Schedule: Nightly at 2:00 AM
- Datasets: ROOT/default, home, media, vms

*** Included Packages
- Base system + development tools
- =nodejs=, =npm=, =jq= (for Claude Code)
- =zsh=, =htop=, =ripgrep=, =eza=, =fd=, =fzf=
- =sanoid= (snapshot management)
- =dialog= (installer UI)

*** Installation UX
- All questions asked upfront, then unattended installation
- WiFi tested before installation begins (if provided)
- User can walk away during install and come back
- Summary + final confirmation before starting

*** User Account Strategy
- install-archzfs creates root account only (asks for root password)
- No user account created during install
- Just create =zroot/home= dataset (no user-specific subdataset)
- archsetup creates user account + home dataset post-reboot

*** GRUB HiDPI Support
- Generate 32px DejaVuSansMono font during install
- Set =GRUB_FONT= to use custom font
- Works well on HiDPI and regular displays

*** WiFi Configuration
- Ask for SSID + password during install (optional)
- Test connection before installation starts
- Copy connection profile to installed system
- Auto-connects after reboot

*** Post-Install Workflow
1. install-archzfs: Minimal ZFS system + root account
2. Reboot, login as root
3. Run archsetup manually for full workstation setup

*** Testing/Debugging (VM)
- SSH access on live ISO: sshd enabled, known root password
- Serial console: =-serial mon:stdio= in QEMU for terminal copy/paste
- Port forwarding: 2222→22 (already configured)
- Allows easy copy/paste of error messages during testing

** Open Questions

- [ ] TrueNAS destination dataset path (vault/???)

* AVAILABLE WORKFLOWS

This section lists all documented workflows for this project. Update this section whenever a new workflow is created.

** create-workflow
File: [[file:workflows/create-workflow.org][docs/workflows/create-workflow.org]]

Meta-workflow for creating new workflows. Use this when identifying repetitive workflows that would benefit from documentation.

Workflow:
1. Q&A discovery (4 core questions)
2. Assess completeness
3. Name the workflow
4. Document it
5. Update notes.org
6. Validate by execution

Created: [Date when workflow was created]

** create-v2mom
File: [[file:workflows/create-v2mom.org][docs/workflows/create-v2mom.org]]

Workflow for creating a V2MOM (Vision, Values, Methods, Obstacles, Metrics) strategic framework for any project or goal.

Workflow:
1. Understand V2MOM framework
2. Create document structure
3. Define Vision (aspirational picture of success)
4. Define Values (2-4 principles with concrete definitions)
5. Define Methods (4-7 approaches ordered by priority)
6. Identify Obstacles (honest personal/technical challenges)
7. Define Metrics (measurable outcomes)
8. Review and refine
9. Commit and use immediately

Time: ~2-3 hours total
Applicable to: Any project (health, finance, software, personal infrastructure, etc.)

Created: 2025-11-05

** startup
File: [[file:workflows/startup.org][docs/workflows/startup.org]]

Workflow for beginning a Claude Code session with proper context and priorities.

Triggered by: **Automatically at the start of EVERY session**

Workflow:
1. Add session start timestamp (check for interrupted sessions)
2. Sync with templates (exclude notes.org and previous-session-history.org)
3. Scan workflows directory for available workflows
4. Read key notes.org sections (NOT entire file)
5. Process inbox (mandatory)
6. Ask about priorities (urgent work vs what's-next workflow)

Ensures: Full context, current templates, processed inbox, clear session direction

Created: 2025-11-14

** wrap-it-up
File: [[file:workflows/wrap-it-up.org][docs/workflows/wrap-it-up.org]]

Workflow for ending a Claude Code session cleanly with proper documentation and version control.

Triggered by: "wrap it up," "that's a wrap," "let's call it a wrap," or similar phrases

Workflow:
1. Write session notes to notes.org Session History section
2. Archive sessions older than 5 sessions to previous-session-history.org
3. Git commit and push all changes (NO Claude attribution)
4. Provide brief valediction with accomplishments and next steps

Ensures: Clean handoff between sessions, nothing lost, clear git history, proper documentation

Created: 2025-11-14

** [Add more workflows as they are created]

Format for new entries:
#+begin_example
** workflow-name
File: [[file:workflows/workflow-name.org][docs/workflows/workflow-name.org]]

Brief description of what this workflow does.

Workflow:
1. Step 1
2. Step 2
3. Step 3

Created: YYYY-MM-DD
#+end_example

* PENDING DECISIONS

This section tracks decisions that need Craig's input before work can proceed.

**Instructions:**
- Add pending decisions as they arise during sessions
- Format: =** [Topic/Feature Name]=
- Include: What needs to be decided, options available, why it matters
- Remove decisions once resolved (document resolution in Session History)

**Example format:**
#+begin_example
** Feature Name or Topic

Craig needs to decide on [specific question].

Options:
1. Option A - [brief description, pros/cons]
2. Option B - [brief description, pros/cons]

Why this matters: [impact on project]

Implementation is ready - just need Craig's preference.
#+end_example

** Current Pending Decisions

(None currently - will be added as they arise)

* Technical Debt Backlog

Catalogued 2026-04-12 after =lib/zfs.sh= removal. Ordered by impact × ease
(ripe fruit first). File:line references were accurate at catalog time —
re-verify before acting.

** Ripe Fruit (minutes–hour each)

*** [#A] Duplicate =mount_efi()= — 15 min
- =installer/archangel=:916 defines a ZFS-specific no-arg version
- =installer/lib/disk.sh=:126 defines a general (partition, mountpoint) version that's never called
- Fix: remove from monolith, call library version with =EFI_PARTS[0]=

*** [#A] =get_zfs_passphrase()= vs =get_luks_passphrase()= — 20 min
- =installer/archangel=:639 and :583, 90% identical prompt+confirm+min-length logic
- Fix: unify into =get_encryption_passphrase(var_name, description)=

*** [#A] =install_base()= vs =install_base_btrfs()= — 45 min
- =installer/archangel=:925 vs :975, 95% copy-paste, differ only in package list
- Fix: single =install_base()= with =FILESYSTEM=-conditional package array

*** [#B] Fragile grep-head chains — 20 min
- =installer/archangel=:1269, :1170 use =... | head -1 | grep -oP ...= without null guards
- Silent failure → empty variable → cryptic failure downstream
- Fix: =x=$(...) || error "..."= pattern

*** [#B] Redundant =sed= calls on sshd_config — 25 min
- =installer/archangel=:1099-1100 runs sed twice without =-e= combining
- Both fail silently if config has unexpected format; SSH config never logged
- Fix: single sed with =-e -e=, explicit error check

** Medium Lifts (half-day each)

*** [#B] =partition_disks()= is ZFS-only — 45 min
- =installer/archangel=:756 hardcodes =EFI_PARTS= + =ZFS_PARTS=, called only from =install_zfs()=
- Btrfs path uses =partition_disk()= (singular) — parallel partitioning logic
- Fix: merge into =disk.sh=, dispatch on =FILESYSTEM=

*** [#B] FILESYSTEM validation scattered — 30 min
- =config.sh=:113+ validates, then =archangel=:135-137 re-validates, then :115 sets defaults
- Unclear which wins; easy to drift
- Fix: single source of truth in =config.sh=, monolith trusts it

*** [#C] Hardcoded =/mnt/efi= paths — 30 min
- =btrfs.sh=:731-739 and =archangel=:920
- Fix: export =MNTPOINT=/mnt= and =EFI_DIR=/mnt/efi= at startup

** Scale Smells (full day+)

*** [#B] =get_raid_level()= is 146 lines — 2 hr
- =installer/archangel=:350-496, 3-level nested if/elif on RAID_LEVEL × disk count × encryption
- Hard to unit-test, hard to spot uncovered branches
- Fix: extract raid mode dispatch; use =case= instead of if chains

*** [#C] ZFS vs Btrfs install paths diverge — 1.5 hr
- =install_zfs()= (:1590) sequential calls, no mid-step recovery
- =install_btrfs()= (:1614) captures partition arrays but doesn't validate population
- Two eras of code; LUKS-open failure mid-btrfs install goes unnoticed
- Fix: return checks after partition ops, shared error hooks

** Review Cadence

Revisit this section at the start of any session that touches the
installer. Completed items move to Session History with a commit ref.
Add new items as they're discovered (format: priority, title, time
estimate, locations, fix direction).

* Active Reminders

** Current Reminders

- =[2026-04-13]= **Investigate =zfs-mirror-encrypt= rollback soft-failure.**
  In tonight's full VM integration run (=test-logs/full-run-05-53.log=,
  05:53-08:10 EDT), the test framework marked =zfs-mirror-encrypt= PASSED
  but logged =ERROR: Rollback failed - test file not restored= →
  =WARN: Rollback verification had issues=. ZFS rollback completed but
  the filesystem state wasn't what =verify_rollback= expected. Not a
  regression from tonight's refactors (rollback code wasn't touched).
  Worth a look — possibly drift in =verify_rollback= vs. the ZFS
  rollback semantics on a mirrored pool.

** Instructions for This Section

When Craig says "remind me" about something:
1. Add it here with timestamp and description
2. If it's a TODO, also add to =/home/cjennings/sync/org/roam/inbox.org= scheduled for today
3. Check this section at start of every session
4. Remove reminders once addressed

Format:
- =[YYYY-MM-DD]= Description of what to remind Craig about

* Session History

This section contains notes from each session with Craig. Sessions are logged in reverse chronological order (most recent first).

**Note:** Sessions older than 5 sessions are archived in [[file:previous-session-history.org][Previous Session History]]

** Format for Session History Entries

Each entry should use this format:

- **Timestamp:** =*** YYYY-MM-DD Day @ HH:MM TZ= (get TZ with =date +%z=)
- **Time estimate:** How long the session took
- **Status:** COMPLETE / IN PROGRESS / PAUSED
- **What We Completed:** Bulleted list of accomplishments
- **Key Decisions:** Any important decisions made
- **Files Modified:** Links to changed files (use relative paths)
- **Next Steps:** What to do next session (if applicable)

**Best practices:**
- Keep entries concise but informative
- Include enough context to resume work later
- Document important technical insights
- Note any new patterns or preferences discovered
- Link to files using org-mode =file:= links

** Session Entries

*** 2026-04-12 Sun → 2026-04-13 Mon @ 23:12-08:10 EDT

*Status:* COMPLETE

*What We Completed:*

**1. Security scrub** — =cmjdase1n= (velox LUKS/ZFS passphrase + root
password) was leaked into git history in the velox-{zfs,btrfs}.conf
files and in prior session-context notes. Used =git filter-branch
--tree-filter= to rewrite 182 commits, replacing the literal with
=welcome=; cleaned refs/original + gc =--prune=now=; force-pushed
main (8e47d45 → d59fe14) and tag v0.8 (8444325 → 05f5c36). Templated
=velox-{zfs,btrfs}.conf= as =.example= files, real files added to
=.gitignore=. Craig declined to rotate the leaked passphrase or
contact GitHub Support to purge cached commit views.

**2. Testing infrastructure** — shellcheck was already wired; added
bats-core (v1.13 via pacman). Created =tests/unit/test_common.bats=,
=test_config.bats=, =test_raid.bats=. =make bats= + =make test= targets
(lint + bats). 65 bats tests total; shellcheck clean.

**3. Refactor scan** (=/refactor full=) — 13 findings. Applied all 5
critical+high in sequence, each behavior-preserving, lint+bats clean,
individual commit:
- =ce4f716= drop dead =mount_efi= + =select_raid_level= in =lib/disk.sh=
- =81b169f= unify =get_{luks,zfs}_passphrase= + =get_root_password= →
  =prompt_password(varname, label, min_len)= via nameref
- =32422a8= merge =install_base= + =install_base_btrfs= → extract
  =pacstrap_packages(filesystem)= pure helper
- =53df8d4= dedupe =findmnt= invocation in =build.sh:safe_cleanup_work_dir=
- =ea6f252= decompose =install_btrfs()= into five named orchestration
  stages in =lib/btrfs.sh= (=btrfs_open_encryption=,
  =btrfs_make_filesystem=, =btrfs_configure_luks_target=,
  =btrfs_install_grub=, =btrfs_close_encryption=). Dropped from ~99
  lines of nested conditionals to a ~45-line flat sequence.

**4. Earlier in session** — =610d6be= extracted pure RAID logic into
=lib/raid.sh= (=raid_valid_levels_for_count=, =raid_is_valid=,
=raid_usable_bytes=, =raid_fault_tolerance=) with 30 bats tests.

**5. Docs** — =402bbd8= testing-strategy.org got a proper "Unit Tests
(bats)" section; README.org testing section renamed + two-layer
framed, project structure tree synced (dropped zfs.sh, added raid.sh
+ tests/unit/), archzfs link updated to GitHub Releases.

**6. todo.org** — created at project root (gitignored) with the 8
remaining refactor items tagged =:refactor:= (#4–#13 from the scan,
all medium or low). Includes =[[file:../todo.org][Archangel Open Work]]= open-list +
Archangel Resolved ledger.

**7. Full VM test run** — =make test-install=. First pass failed 6/12
(all ZFS configs) due to DKMS compile timeout on kernel 6.18.22. Root
cause: =INSTALL_TIMEOUT=600= in =scripts/test-install.sh= — your
2026-02-12 session notes mentioned bumping to 1800 but the change
never made it into git. =d42fa81= bumped to 1800. Second pass (direct
=./scripts/test-install.sh=, skipping rebuild): **12/12 PASSED** in
~2h 17m.

*Key Decisions:*
- bats-core installed system-wide via pacman rather than vendored as
  a submodule — follows the pattern already used for shellcheck.
- Namerefs (=local -n=) added two new =.shellcheckrc= disables
  (SC2178, SC2153) as recurring false positives.
- For the #5 =install_btrfs= decomposition: no new bats tests added,
  because every new helper shells out to real LUKS/mkfs.btrfs
  operations. VM integration tests remain the behavior validator;
  the VM run confirmed no regression.
- Tech-debt backlog that had been sitting uncommitted in =docs/notes.org=
  since the prior (velox) session wrap-up got rolled into this
  wrap-up commit.

*Files Modified (session):*
- [[file:../installer/archangel][installer/archangel]] — lib/raid.sh source, prompt_password,
  install_base merge, install_btrfs decompose
- [[file:../installer/lib/common.sh][installer/lib/common.sh]] — prompt_password, pacstrap_packages
- [[file:../installer/lib/disk.sh][installer/lib/disk.sh]] — dropped dead =mount_efi=, =select_raid_level=
- [[file:../installer/lib/btrfs.sh][installer/lib/btrfs.sh]] — 5 new =btrfs_*= orchestration helpers
- [[file:../installer/lib/raid.sh][installer/lib/raid.sh]] — NEW, pure RAID logic
- [[file:../build.sh][build.sh]] — dedupe findmnt in =safe_cleanup_work_dir=
- [[file:../scripts/test-install.sh][scripts/test-install.sh]] — =INSTALL_TIMEOUT=1800=
- [[file:../.shellcheckrc][.shellcheckrc]] — disable SC2178, SC2153
- [[file:../.gitignore][.gitignore]] — add =installer/velox-*.conf=
- [[file:../Makefile][Makefile]] — add =bats= target, =test=lint+bats=
- [[file:../README.org][README.org]] — testing section update
- [[file:../testing-strategy.org][testing-strategy.org]] — new "Unit Tests (bats)" section

*Files Created:*
- [[file:../installer/lib/raid.sh][installer/lib/raid.sh]] (70 lines)
- [[file:../tests/unit/test_common.bats][tests/unit/test_common.bats]] (23 tests)
- [[file:../tests/unit/test_config.bats][tests/unit/test_config.bats]] (12 tests)
- [[file:../tests/unit/test_raid.bats][tests/unit/test_raid.bats]] (30 tests)
- [[file:../installer/velox-btrfs.conf.example][installer/velox-btrfs.conf.example]] (template)
- [[file:../installer/velox-zfs.conf.example][installer/velox-zfs.conf.example]] (template)
- [[file:../todo.org][todo.org]] (gitignored, tracks remaining refactors)

*Commits (main branch, chronological):*
1. =d59fe14= security: gitignore host configs, add .example templates (post-scrub)
2. =626428e= test: add bats unit tests for common.sh and config.sh
3. =610d6be= refactor: extract pure RAID logic to lib/raid.sh with bats coverage
4. =ce4f716= refactor: drop dead mount_efi and select_raid_level from lib/disk.sh
5. =81b169f= refactor: unify get_{luks,zfs}_passphrase and get_root_password
6. =32422a8= refactor: merge install_base and install_base_btrfs
7. =53df8d4= refactor: dedupe findmnt invocation in safe_cleanup_work_dir
8. =ea6f252= refactor: decompose install_btrfs into named orchestration stages
9. =402bbd8= docs: document bats unit tests + sync stale README bits
10. =d42fa81= fix: bump INSTALL_TIMEOUT from 600 to 1800 for kernel 6.18+ DKMS builds

(Plus the filter-branch rewrite of all prior commits and v0.8 tag
earlier in session — all pre-scrub SHAs are now invalidated.)

*Next Session Pickup:*
- **[Reminder] Investigate =zfs-mirror-encrypt= rollback soft-failure**
  logged in =test-logs/full-run-05-53.log= — see Active Reminders section.
- 8 remaining =:refactor:= items in =todo.org= (6 medium-priority quick
  wins + 1 medium multi-hour #8 partition_disks consolidation + 1 low
  #13 build.sh shadow-file fallback).

*** 2026-04-09 Thu @ 21:30-22:31 -0500

*Status:* COMPLETE

*What We Completed:*
- Attempted ZFS install on bare metal machine "velox" (7.3T NVMe) — failed due to archzfs.com repo being stale (ZFS 2.3.3, max kernel 6.15)
- Fell back to Btrfs/LUKS install — completed but GRUB rejected the correct LUKS passphrase at boot
  - Root cause: LUKS2 created with argon2id PBKDF, GRUB only supports pbkdf2
  - Fixed in installer/lib/btrfs.sh (both single-disk and multi-disk paths)
- Processed inbox: archzfs repo migration notice
  - archzfs.com abandoned mid-2025, project moved to GitHub Releases
  - Updated build.sh and installer/archangel to use new URL: github.com/archzfs/archzfs/releases/download/experimental
  - ZFS 2.4.1 now available for kernel 6.18.21
- Rebuilt ISO with all fixes (archzfs URL, LUKS pbkdf2, no-color default)
- Successfully installed velox with ZFS encrypted root — boots and unlocks via ZFSBootMenu
- Added --color flag to archangel (default: no color, opt-in with flag)
- Added inetutils to installed system packages (hostname was missing)
- Tagged v0.8 and created GitHub release
- Distributed ISO to Ventoy USB and truenas.local:/mnt/vault/isos/ (cleaned up old ISOs)
- Created archsetup ZFS snapshot on velox
- Created velox-zfs.conf and velox-btrfs.conf config files for unattended installs

*Key Decisions:*
- archzfs repo migrated to GitHub Releases permanently
- LUKS2 containers now use pbkdf2 instead of argon2id for GRUB compatibility
- Installer output is colorless by default; --color flag enables it

*Bugs Found and Fixed:*
- GRUB LUKS2 argon2id incompatibility (installer/lib/btrfs.sh)
- archzfs.com stale repo causing ZFS/kernel mismatch (build.sh, installer/archangel)
- inetutils missing from target system packages (installer/archangel)

*Files Modified:*
- [[file:../build.sh][build.sh]] — archzfs URL, comment update
- [[file:../installer/archangel][installer/archangel]] — archzfs URL (2 places), added inetutils to both pacstrap lists
- [[file:../installer/lib/btrfs.sh][installer/lib/btrfs.sh]] — argon2id → pbkdf2
- [[file:../installer/lib/common.sh][installer/lib/common.sh]] — no-color default + enable_color()
- [[file:../installer/lib/config.sh][installer/lib/config.sh]] — --color flag parsing

*Files Created:*
- [[file:../installer/velox-zfs.conf][installer/velox-zfs.conf]] — ZFS unattended config for velox
- [[file:../installer/velox-btrfs.conf][installer/velox-btrfs.conf]] — Btrfs unattended config for velox

*Next Steps:*
- Add build-time check to prevent ZFS/kernel incompatibility in build.sh
- Continue open-sourcing prep

*** 2026-03-28 Sat @ 13:24-13:42 -0500

*Status:* COMPLETE

*What We Completed:*
- Synced templates from claude-templates (protocols, workflows, scripts, announcements)
- Moved 3 logo images from inbox/ to new assets/ directory (renamed space-in-filename)
- Added TODO [#C] task to todo.org: choose a project logo
- Built new archangel ISO for linux-lts 6.18.20 kernel
  - ISO: archangel-2026-03-28-vmlinuz-6.18.20-lts-x86_64.iso (2.0G)
  - First build failed (mkarchiso /proc cleanup race condition), retry succeeded
- Mounted Ventoy USB, copied ISO to /mnt/ventoy/
- Copied ISO to truenas.local:/mnt/vault/isos/ via rsync
- Unmounted Ventoy USB

*Files Modified:*
- [[file:../todo.org][todo.org]] — added logo selection task

*Files Added:*
- [[file:../assets/archangel-logo.png][assets/archangel-logo.png]]
- [[file:../assets/archangel-logo2.png][assets/archangel-logo2.png]]
- [[file:../assets/archangel-logo-samples.png][assets/archangel-logo-samples.png]]

*Next Steps:*
- Choose a project logo from candidates in assets/
- Build AUR packages as local repo for ISO (todo.org [#A] task)
- Continue open-sourcing prep

*** 2026-02-24 Tue @ 08:51-09:12 -0600

*Status:* COMPLETE

*What We Completed:*
- Built new archangel ISO for linux-lts 6.12.74-1 kernel
- ISO: archangel-2026-02-24-vmlinuz-6.12.74-lts-x86_64.iso (1.8G)
- ZFS DKMS 2.3.3 compiled successfully against new kernel
- Sanity test passed: 26/26 checks (ZFS, Btrfs, networking, scripts)
- Distributed locally to ~/archangel-isos/
- Pushed ISO to truenas.local:/mnt/vault/isos/ (TrueNAS now reachable)
- Cleared TrueNAS ISO hash reminder from 2026-02-12 (connectivity restored, ISO pushed)

*Files Modified:*
- None (build artifacts only, no source changes)

*Next Steps:*
- Continue with open-sourcing prep or other todo.org items
- Manual LUKS reboot verification when hardware available

*** 2026-02-24 Tue @ 08:42 -0600

*Status:* COMPLETE

*What We Completed:*
- Reorganized README.org sections to follow logical user journey (build → boot → install → post-reboot)
- Eliminated "Bare Metal Installation" section, redistributing content:
  - =dd= command → Building the ISO > Writing to USB
  - Secure Boot/boot steps → new "Booting the ISO" section
  - SSH/Avahi content → "SSH Access" subsection under Booting the ISO
  - =archangel= invocation + minimal install note → "Installation" intro
  - ZFS/Btrfs first-boot steps → new "Post-Reboot" section
- Renamed sections: "Connecting via SSH Server" → "Booting the ISO", "Arch Linux Install Walkthrough" → "Installation"
- Updated internal org links (#ssh-server → #ssh-access)

*Files Modified:*
- [[file:../README.org][README.org]] — section reorganization, no content lost

*Next Steps:*
- Continue with open-sourcing prep or other todo.org items
- Verify TrueNAS ISO hash (still pending from 2026-02-12)

*** 2026-02-19 Thu @ 16:11-16:14 -0600

*Status:* COMPLETE

*What We Completed:*
- Template sync from claude-templates (protocols, workflows, scripts, announcements)
- Processed 4 announcements:
  1. Calendar workflows updated with cross-calendar visibility
  2. gcalcli now available for Google Calendar CLI access
  3. New open-tasks workflow — updated todo.org headers to project-named convention (Archangel Open Work / Archangel Resolved)
  4. New summarize-emails workflow added
- New workflows synced: add-calendar-event, delete-calendar-event, edit-calendar-event, read-calendar-events, open-tasks, summarize-emails
- New script synced: maildir-flag-manager.py

*Files Modified:*
- [[file:../todo.org][todo.org]] — renamed headers to project-named convention

*Files Added (from template):*
- docs/workflows/{add,delete,edit,read}-calendar-event.org
- docs/workflows/open-tasks.org, summarize-emails.org
- docs/scripts/maildir-flag-manager.py
- docs/announcements/inbox-gitkeep.txt

*Outstanding Reminder:*
- [2026-02-12] Verify TrueNAS ISO hash — still pending

*** 2026-02-12 Thu @ 08:23-16:08 -0600

*Status:* COMPLETE

*What We Completed:*
- Rebuilt archangel ISO for linux-lts 6.12.70-1 kernel
- ISO: archangel-vmlinuz-6.12.70-lts-2026-02-12-x86_64.iso (2.3G)
- All tests passed: sanity (26/26), single-disk, mirror, raidz1
- Fixed archzfs GPG key prompt hanging unattended installs (SigLevel → Never)
- Fixed pgrep false positive in full-test.sh (avahi matched hostname pattern)
- Bumped INSTALL_TIMEOUT from 900s to 1800s for DKMS builds
- Added local distribution to build-release (~/downloads/isos + archsetup inbox notification)
- Distributed ISO to ~/downloads/isos and truenas.local:/mnt/vault/isos
- Audited codebase for open-source readiness, added todo.org task with full checklist
- Dropped SSH access info and test VM rebuild notice in archsetup inbox

*Key Decisions:*
- archzfs SigLevel changed to Never (HTTPS provides transport security; GPG key management kept breaking unattended installs)
- USB drives removed as distribution target
- build-release now handles ~/downloads/isos and archsetup inbox automatically

*Bugs Found and Fixed:*
1. archzfs GPG key prompt: pacstrap -K creates empty keyring, pacman-key -r silently fails, pacman prompts interactively → changed SigLevel to Never in custom/archangel (2 locations)
2. Test pgrep false positive: pgrep -f 'archangel' matched avahi-daemon's "running [archangel.local]" → changed to pgrep -f '/usr/local/bin/archangel'
3. Install timeout: 15 min too short for DKMS compile in VM → bumped to 30 min

*Files Modified:*
- [[file:../custom/archangel][custom/archangel]] — SigLevel fix (install_base + configure_system)
- [[file:../scripts/full-test.sh][scripts/full-test.sh]] — pgrep fix, timeout bump
- [[file:../scripts/build-release][scripts/build-release]] — local distribution + archsetup inbox
- [[file:../todo.org][todo.org]] — open-sourcing prep task

*Next Steps:*
- Verify TrueNAS ISO hash (was unreachable at session end)
- Fix TrueNAS connectivity issues
- Continue with open-sourcing prep or other todo.org items