diff --git a/AGENTS.md b/AGENTS.md index f8033bc..b10cd85 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -139,6 +139,7 @@ The only bytes it writes of its own are the two generated pages and | `pull [--project KEY] [--dry-run]` | **the laptop leg** — pull every active project through its own `sync_cli`, then run its `jobs` verb where it has one and show the output verbatim. It writes nothing. It runs on the laptop only: a project's `local_path` exists on one machine, so where none is present it exits **2**, names each missing root and says "this is not the laptop — run `checkin` here and `pull` on the laptop"; where some are present it pulls those and lists the rest as skipped. `--dry-run` reaches nothing | | `checkin [--dry-run \| --apply] [--push \| --no-push] [--project KEY]` | **the check-in** — the one door, on any surface: stamp `checkin.yaml`, re-render the board, push the ledger where the rule allows, and summarise **by project** (Now, the runs as the ledger holds them, the last five entries, the commands you are likely to type next). It shells out to no sync CLI. `--dry-run` is the default and writes nothing; `--skip-pull` is accepted and ignored with a notice | | `census [--json]` | what the Cortex is holding, by project — the one-screen answer | +| `drift [--science-root PATH] [--json]` | **the laptop leg** — where `projects.yaml` and the Science tree disagree: unregistered project folders, rows whose folder is gone, category vs status, `ral_root` category. Reads, never writes; exit **1** on an error-severity finding; a one-line skip off the laptop. `census` and `checkin` print its summary line | | `dashboard --check` \| `--apply` | render `dashboard.md` + `dashboard.html`; `--check` exits **1 on drift**, **2 on bad args**, anything else = the renderer could not run | | `issue [--project KEY] [--apply]` | the concise ledger block for each project's GitHub issue; `--apply` writes it into the issue body between the markers (needs `gh`) | diff --git a/REFERENCE.md b/REFERENCE.md index 517aa7d..dad0813 100644 --- a/REFERENCE.md +++ b/REFERENCE.md @@ -189,6 +189,22 @@ five entries, and the `cortex.py` lines the human is likely to type next. It flips no state and writes no entry of its own — the jobs output is read by the human or the agent in the session and recorded with `running` / `done`. +### Drift + +`pyauto-brain cortex drift` checks the body map against the laptop Science +tree, `//` with categories `active`, `development`, +`complete`, `archive` (the root is derived from the rows' `local_path`s; +`--science-root` overrides). Errors: a folder in `active/` or `development/` +with no row; a non-retired row whose `local_path` is gone; a folder whose +category disagrees with its status (`active`/`development` hold +`active|dormant|planned`, `complete`/`archive` hold `retired|dormant`); a +derived root that does not exist while other rows' folders do. Warnings: an +unregistered folder in `complete/` or `archive/` (storage), a non-retired +row whose `ral_root` category differs from its `local_path` category. Rows +outside the Science tree (repo-backed roots under the workspace) are exempt +from the category rules. It writes nothing; `census` and `checkin` print one +summary line, off the laptop a skip. + ### `checkin.yaml` ```yaml diff --git a/docs/schema_decisions.md b/docs/schema_decisions.md index ff7e008..286efa0 100644 --- a/docs/schema_decisions.md +++ b/docs/schema_decisions.md @@ -475,3 +475,18 @@ Choices made in phase 2 — the conductor, the board and the workflows is registered `active` by human decision, the one exception to 52(a): an active project needs a ledger, and git is not what makes it science. Why: one layout on both machines means a path is derived, never looked up. + +62. **`development/` is a Science category, and drift is checked, not + hoped for** (2026-10-29, PyAutoBrain#543). The laptop Science tree gained + `development/` beside `active/` for projects that develop or validate the + software (`analytic_gaussian`, `ep_toy_gaussian`, `ic50_workspace`, + `slope_hierarchy_scale`); like `active/` it holds `active`, `dormant` or + `planned` rows. The conductor's `drift` verb compares `projects.yaml` + with the tree — unregistered folders, vanished `local_path`s, category + against status, `ral_root` category — and `census`/`checkin` print its + summary line on the laptop. It writes nothing and stays out of + `census()`, so the board rendered in CI does not depend on the machine. + Why: when Science moved from `C:\Users\Jammy\Science` to + `Workspace\Science`, every `local_path` went stale and `pull` quietly + reached 3 of 12 active projects for weeks; nothing in the organism + compared the map with the territory.