Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions .github/workflows/organism_board.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: Organism Board
name: Dashboard

# Publishes the organism board — the umbrella ROUTER over the four organ
# Publishes the PyAutoScientist Dashboard — the umbrella ROUTER over the four organ
# dashboards (scripts/organism_board.py): one row per board with its own live
# headline, a "where to work next" banner keyed off the Heart's verdict,
# published to GitHub Pages + badge.json + the README strip between the
Expand Down Expand Up @@ -28,7 +28,7 @@ concurrency:

jobs:
board:
name: Render + publish the organism board
name: Render + publish the dashboard
runs-on: ubuntu-latest
environment:
name: github-pages
Expand All @@ -46,6 +46,7 @@ jobs:
python scripts/organism_board.py --html > _site/index.html
python scripts/organism_board.py --badge > _site/badge.json
python scripts/organism_board.py --md > board.md
cp board.md _site/dashboard.md
python scripts/organism_board.py --md-brief > readme_strip.md

- name: Write the board to the job step summary
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ Natural language is therefore the primary development interface; agentic AI prov
📖 **Docs:** https://pyautoscientist.readthedocs.io
🍴 **Adoption guide:** https://pyautoscientist.readthedocs.io/en/latest/adoption/guide.html

See the **[PyAutoScientist Organism Board](https://pyautolabs.github.io/PyAutoScientist/)**
(mobile phone dashboard) to watch the organism live and know where to work: it shows each
See the **[PyAutoScientist Dashboard](https://pyautolabs.github.io/PyAutoScientist/)**
to watch the organism live and know where to work: it shows each
organ's own dashboard headline — the [Mind's tasks](https://pyautolabs.github.io/PyAutoMind/),
the [Heart's health verdict](https://pyautolabs.github.io/PyAutoHeart/), the
[Hands' releases](https://pyautolabs.github.io/PyAutoHands/) and the
Expand Down
21 changes: 11 additions & 10 deletions scripts/organism_board.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""scripts/organism_board.py — the PyAutoScientist organism board.
"""scripts/organism_board.py — the PyAutoScientist Dashboard.

The umbrella ROUTER over the organism's live dashboards: one row per organ
board — Mind (tasks), Heart (health), Hands (releases), Memory (knowledge) —
Expand Down Expand Up @@ -112,19 +112,19 @@ def route_hint(snapshot: dict) -> str:
word = heart_word(snapshot)
if word in ("RED", "YELLOW"):
return ("The Heart is " + word +
" — start at the health board and fix what's blocking.")
" — start at the PyAutoHeart Dashboard and fix what's blocking.")
if word == "STALE":
return ("Evidence gaps, nothing known-bad — re-run checks via /health, "
"then pick a task on the Mind board.")
"then pick a task on the PyAutoMind Dashboard.")
if word == "GREEN":
return "All clear — pick a task on the Mind board."
return "Heart verdict unavailable — check the health board first."
return "All clear — pick a task on the PyAutoMind Dashboard."
return "Heart verdict unavailable — check the PyAutoHeart Dashboard first."


def _render_md(snapshot: dict) -> str:
lines = ["# PyAutoScientist organism board", "",
lines = ["# PyAutoScientist Dashboard", "",
f"_{route_hint(snapshot)}_", "",
"| Board | Says | |", "|---|---|---|"]
"| Dashboard | Says | |", "|---|---|---|"]
for b in snapshot.get("boards") or []:
head = b.get("headline") or "unavailable"
link = f"[{b['name']}]({b['url']})" if b.get("url") else b["name"]
Expand Down Expand Up @@ -206,11 +206,12 @@ def _render_html(snapshot: dict) -> str:
function fb(t){{window.prompt('Copy this:',t)}}
</script></head>
<body><div class="wrap">
<h1>PyAutoScientist organism board</h1>
<h1>PyAutoScientist Dashboard</h1>
<p class="banner {cls}">{_html.escape(route_hint(snapshot))}</p>
<p class="meta"><a href="dashboard.md">markdown version</a></p>
<table>{''.join(rows)}</table>
<p class="meta">Each row is that organ's own board speaking in its own
words — open it to work there. 📋 copies the board's door command for a
<p class="meta">Each row is that organ's own dashboard speaking in its own
words — open it to work there. 📋 copies the dashboard's door command for a
Claude Code chat.</p>
<footer>Rendered by <code>scripts/organism_board.py</code> from the boards'
own published headlines · generated {_html.escape(str(snapshot.get('generated') or '?'))}.</footer>
Expand Down
6 changes: 3 additions & 3 deletions tests/test_organism_board.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,9 @@ def _snap(heart="GREEN · 100", color="brightgreen"):


def test_routing_follows_the_heart():
assert "pick a task on the Mind board" in ob.route_hint(_snap("GREEN · 100"))
assert "start at the health board" in ob.route_hint(_snap("RED · 40"))
assert "start at the health board" in ob.route_hint(_snap("YELLOW · 70"))
assert "pick a task on the PyAutoMind Dashboard" in ob.route_hint(_snap("GREEN · 100"))
assert "start at the PyAutoHeart Dashboard" in ob.route_hint(_snap("RED · 40"))
assert "start at the PyAutoHeart Dashboard" in ob.route_hint(_snap("YELLOW · 70"))
assert "re-run checks" in ob.route_hint(_snap("STALE · 65"))
assert "unavailable" in ob.route_hint(
{"boards": [{"name": "Heart", "headline": None}]})
Expand Down