Commit Graph

6 Commits

Author SHA1 Message Date
vasilito c2f5bb09fc feat: build-system hardening (validate gate, cache safeguards, status sync)
Phase 1 remediation of the build-system assessment:

- Makefile: wire 'validate' target into build/live/reimage flows; surface
  lint-config and init-service validators as a first-class gate.
- mk/disk.mk: add 'validate' target running lint-config, init-service
  validator, and file-ownership validator; suppress noisy unmount warnings
  that masked real failures.
- mk/redbear.mk: add source-fingerprint tracking so integrate-redbear.sh
  re-runs when local/recipes, local/Assets, or local/firmware change.
- src/cook/cook_build.rs: atomic dep_hashes.toml write (tmp + rename) to
  prevent torn-write cache corruption; binary-store restore now checks
  dep_hashes before silent restore; fix production bug in
  collect_files_recursive that silently dropped subdirectories whose
  name matched an exclude pattern.
- src/cook/fetch.rs, src/cook/fetch_repo.rs: harden atomic patch
  application and protected-recipe gating.
- AGENTS.md, local/AGENTS.md, local/docs/COLLISION-DETECTION-STATUS.md:
  sync collision-detection status to 'implemented (Phase 15.0)' now that
  CollisionTracker is wired across all four installer layers
  (installer submodule pointer tracked separately in 13cc6fb0c3).

Verified: cargo check (0 errors), cargo test --lib (35/35 passed),
cargo clippy (0 new warnings vs baseline), make -n validate, make -n live.
2026-07-18 16:30:23 +09:00
vasilito a4adf22d29 phase 15.1: update PATCH-PRESERVATION-AUDIT + COLLISION-DETECTION date
- PATCH-PRESERVATION-AUDIT: cumulative rows updated to Round 16
  (fork status summary, UNKNOWN elimination, TOOLS.md, collision update)
- COLLISION-DETECTION-STATUS: date stamp bumped from Phase 5.5
  to Phase 14.1 / Round 15 to reflect the Phase 11.3 and 14.1 updates

Round 16 (Phase 15.x):
  - Phase 15.0: Baseline audit — 0 orphans, 0 collisions
  - Phase 15.1: Cumulative doc update
2026-07-12 13:58:16 +03:00
vasilito a529160c14 phase 11.3: update COLLISION-DETECTION-STATUS for Phase 5.1+8.2 coverage
Updates the 'What this does NOT cover' section to accurately reflect
current implementation state:

  - Item 1: [[package]].files now COVERED (Phase 5.1, 39 recipes)
  - Item 3: base dynamic paths now PARTIALLY COVERED (Phase 8.2,
    18 hardcoded paths from base's Makefile)
  - 162 total paths surveyed across installs + files + dynamic

Round 12 (Phase 11.x) work:
  - Phase 11.0: Baseline audit — 0 orphans, 0 collisions, all forks pass
  - Phase 11.1: Syscall fork investigation — 448 ahead / 3 behind;
    merge conflicts prevent force-push; intentional divergence
    documented (similar to kernel/bootloader/installer)
2026-07-12 12:44:39 +03:00
vasilito 23b7722ab6 phase 5.5: polish COLLISION-DETECTION-STATUS for Phases 5.1+5.4
Updates the doc to reflect the 2 follow-on improvements to
collision detection:

- Phase 5.1 added 'recipe files' source (handles the 39 recipes
  with [[package]].files dict). Out-of-scope #1 in this doc
  marked as DONE.

- Phase 5.4 added --selftest mode with 8 regression cases wired
  into the pre-push hook. Future-work item #4 added for property-
  based fuzzing (e.g. hypothesis).
2026-07-12 10:19:49 +03:00
vasilito dbcff12184 phase 4.2: implement general package-vs-config collision detection
Per AGENTS.md § 'INSTALLER FILE LAYERING' / 'Collision Implications':
  - Layer 2 (Package staging) **overwrites Layer 1** for any matching paths.
  - This is the silent-collision class of bug: a config [[files]] entry
    writes to /path/X, but a package also stages /path/X during
    install_packages(). Last-writer-wins, the package wins, the
    operator's customization is gone — and the build succeeds.

Phase 0 audit confirmed that AGENTS.md's promise of a CollisionTracker
in src/cook/collision.rs was false (the file doesn't exist). Phase 4.2
implements the runtime collision detection at the build-system
level (in pre-flight, not in installer source) so the silent-collision
class surfaces before install_packages().

New file: local/scripts/verify-collision-detection.py
- Parses every recipes/<cat>/<pkg>/recipe.toml's [[package]].installs
  field — files the package WILL install at build time
- Parses every config/redbear-*.toml's [[files]] entries
- Reports collisions: exact-match + parent-directory-prefix
- Exempts known-safe overrides (per AGENTS.md 'Init Service File
  Ownership'): /etc/init.d/*, /etc/environment.d/*

Initial result (2026-07-12):
  - 68 recipe installs surveyed
  - 165 config [[files]] entries surveyed
  - 0 collisions

Wired into local/scripts/build-preflight.sh via:
  - Default: report-only
  - --strict: exit 1 on collision (for CI)
  - REDBEAR_SKIP_COLLISION_CHECK=1: bypass entirely

Updated local/docs/COLLISION-DETECTION-STATUS.md with:
- Phase 4.2 implementation summary
- How the algorithm works
- What it does NOT cover (runtime conflicts, patch-induced, dynamic
  generation)
- Recovery options
2026-07-12 09:36:54 +03:00
vasilito 1deaf0b240 phase 0: add COLLISION-DETECTION-STATUS.md audit
Honest documentation of the actual state of collision detection:
- Init-service path collisions: WORKING via lint-config
- Package-vs-config runtime collision detection: NOT implemented
  (no code anywhere emits the [COLLISION-ERROR] markers
   that validate-collision-log.sh looks for)
- Recipe installs manifest: limited utility because no recipe
  currently declares installs

Phase 1 follow-up: implement runtime collision detection in
local/sources/installer/src/ to match the broken AGENTS.md
promise (already updated in the prior commit).
2026-07-12 01:21:06 +03:00