diff --git a/.tangled/workflows/corpus.yml b/.tangled/workflows/corpus.yml index 49f2e44..83cd05f 100644 --- a/.tangled/workflows/corpus.yml +++ b/.tangled/workflows/corpus.yml @@ -20,6 +20,8 @@ dependencies: - bash - coreutils - gnugrep + # Project-operations fixtures execute tools/heartbeat.sh, which uses sed. + - gnused - python3 steps: diff --git a/wiki/log/2026-07-11-corpus-sed-dependency.md b/wiki/log/2026-07-11-corpus-sed-dependency.md new file mode 100644 index 0000000..167aacf --- /dev/null +++ b/wiki/log/2026-07-11-corpus-sed-dependency.md @@ -0,0 +1,33 @@ +# Corpus CI carries the heartbeat shell dependencies + +``` +Type: log +Date: 2026-07-11 +``` + +## Finding + +Tangled's fast `corpus.yml` image installed Bash, coreutils, GNU grep, and +Python, then ran the project-operations fixture suite. That suite exercises +`tools/heartbeat.sh`, whose phase and end paths use `sed` to preserve fields +from the current run record. Nixery images contain only declared packages, so +the fixture failed with `sed: command not found` even though every corpus and +classifier assertion passed. + +## Repair + +- Add lowercase Nixery package `gnused` to the corpus workflow, matching the + established package already used by `site.yml`. +- State in the process corpus that project-operations fixture dependencies are + part of the minimal fast-CI image rather than accidental host tools. + +## Checks + +`bash -n tools/heartbeat.sh`, `python3 tools/test_project_ops.py`, +`bash tools/test_corpus_engine.sh`, `bash tools/test_ci_rust_changed.sh`, and +`./tools/check.sh --docs`. + +Defense: [agent-scale.md](../process/agent-scale.md) requires the always-on +corpus workflow to run project-operations fixtures. Supplying the shell tool +that the exercised heartbeat helper actually invokes keeps that contract true +inside Nixery's intentionally minimal environment. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index bad379d..e38a964 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -236,6 +236,11 @@ add or amend a session log, then re-run the generator. - Intent: Implement only [views.md](../interface/views.md) acceptance criterion 1: make DIGITAL the fresh-frontend home in Bevy and terminal, expose one labeled frontend-only flip to REAL and back, and prove that flipping does not touch the simulation, cursor, or selection. - Log: [wiki/log/2026-07-11-digital-home-view-flip.md](2026-07-11-digital-home-view-flip.md) +## 2026-07-11 - Corpus CI carries the heartbeat shell dependencies + +- Intent: (see session log) +- Log: [wiki/log/2026-07-11-corpus-sed-dependency.md](2026-07-11-corpus-sed-dependency.md) + ## 2026-07-11 - Recording-review hotkeys: r sweeps, Shift-R toggles auto-review - Intent: Implement the captured recording-review hotkey addendum (interface/context-menu.md criteria R1-R4, work order `context-menu-review-keys`): reviewing the buffer is the highest-frequency verb in a surveillance build, and the menu path priced every press at three interactions. Ti... diff --git a/wiki/process/agent-scale.md b/wiki/process/agent-scale.md index 759bfec..8566f0b 100644 --- a/wiki/process/agent-scale.md +++ b/wiki/process/agent-scale.md @@ -152,11 +152,12 @@ collapsed agent smoke. Package-aware classification waits on [crate-workspace.md](../engineering/crate-workspace.md). Tangled runs two contracts. `.tangled/workflows/corpus.yml` is the fast -always-on corpus job and explicitly installs `python3`; it runs classifier and -corpus fixtures before the real corpus/wiki/index checks. `check.yml` uses a -two-commit clone and `tools/ci-rust-changed.sh` to stop after classification -when a push cannot affect Rust. Pull-request and manual triggers deliberately -run the complete Rust/Bevy safety gate. Tangled has no scheduled workflow +always-on corpus job and explicitly installs its fixture dependencies, +including `python3`, GNU grep, and GNU sed; it runs classifier, corpus, and +project-operations fixtures before the real corpus/wiki/index checks. +`check.yml` uses a two-commit clone and `tools/ci-rust-changed.sh` to stop +after classification when a push cannot affect Rust. Pull-request and manual +triggers deliberately run the complete Rust/Bevy safety gate. Tangled has no scheduled workflow trigger or native path filter, so the manual trigger is the supported full safety run instead of pretending a scheduler exists. The classifier fixture suite pins every case's pipeline kind, so its local wiki-only assertion stays diff --git a/wiki/process/workflows.md b/wiki/process/workflows.md index 07762f5..e0a7045 100644 --- a/wiki/process/workflows.md +++ b/wiki/process/workflows.md @@ -192,8 +192,10 @@ resolves every structured Design/dependency target and heading, and verifies every declared generated-page owner. Local checks and the fast Tangled corpus workflow call this same script so implementations cannot drift. Both corpus scripts preflight `python3`; the corpus workflow explicitly supplies Python, -Bash, coreutils, and grep. A missing audit dependency must make CI red, never -turn an empty scan into a green result. +Bash, coreutils, grep, and sed. The project-operations fixtures exercise the +heartbeat helper in that same minimal image, so its shell dependencies belong +to the workflow contract too. A missing audit dependency must make CI red, +never turn an empty scan into a green result. Tangled CI is split by cost. `.tangled/workflows/corpus.yml` runs classifier fixtures, corpus fixtures, the corpus/wiki gates, and generated-index