From b83a616fc3c9bf09a000d3bf6cce85d095b69836 Mon Sep 17 00:00:00 2001 From: Jammy2211 Date: Thu, 8 Oct 2026 13:39:50 +0100 Subject: [PATCH] Integrate DNA with shared dashboard standards --- AGENTS.md | 1 + ORGANISM.md | 20 ++++++++++++++++++++ board/_theme.py | 12 ++++++++++++ config/policy.yaml | 2 ++ docs/board-navigation.md | 1 + docs/board-orchestration.md | 2 ++ docs/board-sizing.md | 1 + tests/test_board_theme.py | 4 ++-- 8 files changed, 41 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index d7f3eb7..da39a25 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,6 +26,7 @@ Canonical boundaries live in `PyAutoBrain/ORGANISM.md`; the full body map | **Hands** | PyAutoHands | Packaging, tagging, notebook generation, PyPI release execution. | | **Pulse** | PyAutoPulse | The Pulse — cross-project profiling dashboard over the `_profiling` repos: campaign intent, instance registry, the versioned `profiling-summary` read contract, ingest receipts and the Pages board. Validates the contract only; never judges, scores or issues verdicts (the Brain's profiling conductor judges). | | **Insight** | PyAutoInsight | Inference campaign intent, the cross-project inference instance registry, the versioned `inference-summary` read contract, ingest receipts and the evidence dashboard. Projects execute, Cortex records the science, Mind owns task state; never infers scientific acceptance or submits compute. | +| **DNA** | PyAutoDNA | Software-stack specifications, environment inventory receipts, support rationale, upgrade campaigns and adoption history. Brain coordinates, Heart validates readiness, Hands releases, Nerves enforces runtime compatibility; collection never upgrades environments. | | **Nerves** | PyAutoNerves | The Nerves — the configuration/serialization layer connecting workspace conventions to libraries (layered config, version handshake, test_mode), delivered as the `autonerves` package. | | **Gut** | PyAutoGut | Lifecycle of condemned self-material (stale branches, stashes, dead code/tests): held as recoverable git refs through a transit window, voided on a sweep. The storage mirror of Memory. | diff --git a/ORGANISM.md b/ORGANISM.md index 73ae0d3..f2d1c35 100644 --- a/ORGANISM.md +++ b/ORGANISM.md @@ -22,6 +22,7 @@ organs plan, build, test and release it, and you make every judgment call. | **Hands** | PyAutoHands | Builds and releases — packaging, tagging, notebook generation, PyPI via `release.yml`. A pure executor: runs no readiness checks and never re-derives a gate decision. | | **Pulse** | PyAutoPulse | Feels *how fast the organism runs* across the `_profiling` project repos. Owns profiling campaign intent and pending domain tasks, the profiling instance registry, the versioned `profiling-summary` read contract, the ingest receipts (resolved commit per project per render) and the cross-project board. Validates the exchange contract only; project repos own producers, results, pins, drift policy and their own Pages page. Never moves pins, combines unmatched timings, applies the compile threshold to runtime, computes an ecosystem-wide speed score or issues a readiness verdict; the Brain's profiling conductor (`triage`) is the only judge. | | **Insight** | PyAutoInsight | Owns inference campaign intent and pending domain tasks, the cross-project inference instance registry, versioned `inference-summary` read contract, ingest receipts and evidence dashboard. Projects own execution, producers and raw samples; Cortex owns scientific run records, observations and human conclusions; Mind owns bounded implementation lifecycle and repository claims. Never infers scientific acceptance from execution, ranks incompatible runs or submits compute on refresh. | +| **DNA** | PyAutoDNA | Owns software-stack specifications, environment inventory receipts, compatibility decisions, upgrade campaigns and adoption history across local, RAL and CI. Brain coordinates updates; Heart owns validation/readiness; Hands owns release execution/provenance; Nerves owns runtime compatibility. Package repositories remain authoritative for requirements. Collection never upgrades an environment or treats missing observations as passing evidence. | | **Nerves** | PyAutoNerves | The configuration/serialization layer (`autonerves`) — layered config with overrides, the workspace↔library version handshake, `test_mode`, FITS/JSON I/O. Connects the organism's conventions to every library; the base layer the scientific libraries all import. | | **Gut** | PyAutoGut | Owns the lifecycle of *condemned self-material* — stale branches, stashes, dead code/tests. Holds each as a durable, recoverable git ref through a transit window and **voids** it on a sweep. The storage mirror of Memory (retention ↔ release); the hygiene conductor drives it, as vitals reads Heart. | @@ -129,3 +130,22 @@ conclusions; Mind retains implementation lifecycle and claims. A dashboard alone waive the state-or-effects requirement for a new organ. The human interaction layer is the command surface (`/route` + the verb commands), which is part of Brain. + +## Software-stack identity and adoption + +DNA owns the persistent environment registry and immutable stack specifications, +plus support rationale, inventory receipts and upgrade/adoption history. This is +state distinct from runtime configuration in Nerves and readiness in Heart. +Source checkouts are identified by commit and dirty state; published wheels by +version and source provenance; workspace declarations are compatibility floors. +Frozen source version stamps are not compared to wheel versions as an equality +check. Upstream availability, declared compatibility, tested combinations, +recommended stacks and observed installations remain separate facts. + +Brain coordinates proposals using DNA records and existing development/release +workflows. Heart retains the authoritative validation and readiness verdict; +DNA links evidence without re-deriving it. Hands retains release execution and +provenance. Mind tracks implementation tasks. Project campaigns retain their +original stack identity; adoption changes the default for new work only through +an explicit operation. Dashboard refreshes collect and render, never install, +submit compute or mutate live environments. diff --git a/board/_theme.py b/board/_theme.py index 0df4912..9daeebb 100644 --- a/board/_theme.py +++ b/board/_theme.py @@ -145,6 +145,12 @@ "ink_light": "#995500", "ink_dark": "#ffc163", "glow": "#ffb347", "hero": ("#392600", "#000000"), }, + "dna": { + "organ": "DNA", + "tagline": "Specify. Compare. Evolve.", + "ink_light": "#087b88", "ink_dark": "#67e8f9", "glow": "#22d3ee", + "hero": ("#08343c", "#00060a"), + }, "nerves": { "organ": "Nerves", "tagline": "Signal. Connect. Understand.", @@ -376,6 +382,11 @@ '' '' ), + "dna": ( + '' + '' + ), "nerves": ( '' '' @@ -833,6 +844,7 @@ def navigation_cards(items, label="Board sections", *, columns=None): "memory": ("Build your ", "Memory", ""), "pulse": ("Check your ", "Pulse", ""), "insight": ("Find your next ", "Insight", ""), + "dna": ("Check your ", "DNA", " for stack drift"), "nerves": ("Check your ", "Nerves", " for config drift"), "gut": ("Clear out your ", "Gut", ""), "eyes": ("Review figures with your ", "Eyes", ""), diff --git a/config/policy.yaml b/config/policy.yaml index 00b25e8..b6328c6 100644 --- a/config/policy.yaml +++ b/config/policy.yaml @@ -129,6 +129,7 @@ test_witness: pyautoears: PyAutoEars/tests pyautopulse: PyAutoPulse/tests pyautoinsight: PyAutoInsight/tests + pyautodna: PyAutoDNA/tests # PyAutoGut has no test suite — deliberately absent, so the conductor's # "strengthen tests first" advice is correct there rather than noise. @@ -170,6 +171,7 @@ board: hands: PyAutoHands pulse: PyAutoPulse insight: PyAutoInsight + dna: PyAutoDNA nerves: PyAutoNerves gut: PyAutoGut organism: PyAutoScientist diff --git a/docs/board-navigation.md b/docs/board-navigation.md index b872ef9..cd55837 100644 --- a/docs/board-navigation.md +++ b/docs/board-navigation.md @@ -73,6 +73,7 @@ The authoritative membership is `config/policy.yaml` → `board.boards`. | Heart | Heart `heart/dashboard.py` | Downstream shared-theme consumer; retain readiness semantics | | Hands | Hands `autohands/board.py` | Downstream shared-theme consumer | | Pulse | Pulse `pulse/board.py` | Downstream shared-theme consumer | +| DNA | DNA `dna/board.py` | Shared components; environment, compatibility, decision and campaign sections | | Nerves | Nerves `scripts/board.py` | Downstream shared-theme consumer | | Gut | Gut `scripts/board.py` | Downstream shared-theme consumer | | Scientist | Scientist `scripts/organism_board.py` | Downstream shared-theme consumer | diff --git a/docs/board-orchestration.md b/docs/board-orchestration.md index 1b369dd..8059cbe 100644 --- a/docs/board-orchestration.md +++ b/docs/board-orchestration.md @@ -118,6 +118,7 @@ destinations, prompts and other presentation must still be detected. | Memory | snapshot `generated` | `knowledge_board.yml` | | Pulse | oldest successful ingest refresh receipt, preserved offline | `dashboard_refresh.yml` | | Insight | oldest successful ingest refresh receipt, preserved offline | `dashboard_refresh.yml` | +| DNA | DNA inventory collection receipts; unknown while any required environment is unobserved | `pages.yml` | | Nerves | snapshot `generated`, unknown on collection errors | `nerves_board.yml` | | Gut | snapshot `generated`, unknown on collection errors/missing ref listing | `gut_board.yml` | | Eyes | oldest successful manifest collection `captured_at`, not figure age | `dashboard_refresh.yml` | @@ -140,6 +141,7 @@ The shared component must land before consumers of its new keyword arguments. | Memory | Memory `scripts/board.py` | Knowledge and reading queue review; resolved Memory remote; paper actions retained | | Pulse | Pulse `pulse/campaigns.py` and `pulse/board.py` | Existing profiling check-in; Pulse ledger and every registered project repository; separate systematic-fix action retained | | Insight | Insight `insight/campaigns.py` and `insight/board.py` | Existing inference check-in; Insight ledger and registered inference project repositories | +| DNA | DNA `dna/board.py` | Stack inventory, compatibility and upgrade check-in; DNA work repository; refresh never installs packages or promotes a stack | | Nerves | Nerves `scripts/board.py` index | Configuration review; Nerves and named source repositories from the collected body-map identities; source detail pages retain their specific controls | | Gut | Gut `scripts/board.py` | Retention/recovery review; Gut and the associated Mind retention ledger; permanent void still requires explicit human authorization | | Eyes | Eyes `eyes/board.py` | Figure review; Eyes plus every registered visualization project repository; per-figure copy/critique actions retained | diff --git a/docs/board-sizing.md b/docs/board-sizing.md index 660fcec..a80dba5 100644 --- a/docs/board-sizing.md +++ b/docs/board-sizing.md @@ -61,6 +61,7 @@ adoption. This task edits Brain only; other repository entries are audit results | Hands | `PyAutoHands/autohands/board.py` → shared theme | Automatic; no outer override found | `release_board.yml` renders with Brain checkout | | Pulse | `PyAutoPulse/pulse/board.py` → `pulse/setup_browser.py::theme()` | Automatic: current main already imports Brain; intake's independent-width assessment is obsolete | Refresh regenerates HTML using Brain, then Pages copies it | | Insight | `PyAutoInsight/insight/board.py` → `insight/theme.py` | Independent 1200px main container and 16px gutters; explicit adoption and overflow repair follow-up | Refresh generates output; Pages copies it and validates feed with Brain | +| DNA | `PyAutoDNA/dna/board.py` → shared theme | New consumer; requires matching Brain registration and DNA merge, then publication verification | `pages.yml` renders and publishes | | Nerves | `PyAutoNerves/scripts/board.py` → shared theme | Automatic; no outer override found | `nerves_board.yml` renders with Brain checkout | | Gut | `PyAutoGut/scripts/board.py` → shared theme | Automatic; no outer override found | `gut_board.yml` renders with Brain checkout | | Scientist | `PyAutoScientist/scripts/organism_board.py` → shared theme | Automatic for the organ board; embedded/cockpit presentation needs its own later verification | `organism_board.yml` renders with Brain checkout | diff --git a/tests/test_board_theme.py b/tests/test_board_theme.py index 3f660a8..0dd1505 100644 --- a/tests/test_board_theme.py +++ b/tests/test_board_theme.py @@ -279,7 +279,7 @@ def test_board_links_reads_the_declared_family_in_file_order(): # the order `config/policy.yaml` declares — the ruled organ order. links = _theme.board_links("https://example.invalid") assert list(links) == ["brain", "mind", "cortex", "memory", "eyes", "ears", - "heart", "hands", "pulse", "insight", "nerves", "gut", "organism"] + "heart", "hands", "pulse", "insight", "dna", "nerves", "gut", "organism"] assert list(links) == POLICY_BOARDS assert links["cortex"] == "https://example.invalid/PyAutoCortex/" @@ -302,7 +302,7 @@ def test_board_links_renders_the_family_footer_end_to_end(): _theme.board_links("https://example.invalid", "heart"), "heart") order = re.findall(r'data-organ="(\w+)"', footer) assert order == ["brain", "mind", "cortex", "memory", "eyes", "ears", "hands", - "pulse", "insight", "nerves", "gut", "organism"] + "pulse", "insight", "dna", "nerves", "gut", "organism"] def test_board_links_returns_nothing_when_the_config_is_unreadable():