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
52 changes: 40 additions & 12 deletions .github/workflows/organism_board.yml
Original file line number Diff line number Diff line change
@@ -1,19 +1,12 @@
name: Dashboard

# 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
# scientist:begin/end markers. Nothing is recomputed here — each organ's
# board stays the authority; this page only routes.
#
# Six-hourly: the organ boards refresh on their own daily/push cadences, so
# the router follows within hours. board_tests.yml checks fixture renders on PRs;
# this workflow builds and publishes the live page.
# Scientist owns a bounded public development activity index. Owner repositories
# remain authoritative. Five-minute scheduling is best effort; the page exposes
# source coverage and event/collection times separately.

on:
schedule:
- cron: "17 */6 * * *"
- cron: "*/5 * * * *"
workflow_dispatch:

permissions:
Expand All @@ -29,6 +22,7 @@ jobs:
board:
name: Render + publish the dashboard
runs-on: ubuntu-latest
timeout-minutes: 4
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
Expand All @@ -54,10 +48,44 @@ jobs:

- run: python -m pip install pyyaml

- name: Restore bounded activity index
run: |
mkdir -p _activity _site
if git ls-remote --exit-code --heads origin refs/heads/scientist-activity-cache > /dev/null; then
git fetch --depth 1 origin refs/heads/scientist-activity-cache
git show FETCH_HEAD:cache.json > _activity/cache.json
git rev-parse FETCH_HEAD > _activity/parent
else
status=$?
if [ "$status" -ne 2 ]; then exit "$status"; fi
fi

- name: Collect public development activity
env:
GH_TOKEN: ${{ secrets.PAT_PYAUTOLABS || github.token }}
ACTIVITY_BUDGET: ${{ secrets.PAT_PYAUTOLABS && '180' || '60' }}
run: |
python scripts/activity_feed.py --repos PyAutoMind/repos.yaml --cache _activity/cache.json --output _site/activity.json --budget "$ACTIVITY_BUDGET"

- name: Preserve bounded derived index
if: github.ref == 'refs/heads/main'
run: |
git config user.name 'github-actions[bot]'
git config user.email '41898282+github-actions[bot]@users.noreply.github.com'
activity_blob=$(git hash-object -w _activity/cache.json)
activity_tree=$(printf '100644 blob %s\tcache.json\n' "$activity_blob" | git mktree)
if [ -f _activity/parent ]; then
activity_parent=$(cat _activity/parent)
activity_commit=$(git commit-tree "$activity_tree" -p "$activity_parent" -m 'Refresh derived public activity index')
else
activity_commit=$(git commit-tree "$activity_tree" -m 'Begin derived public activity index')
fi
git push origin "$activity_commit:refs/heads/scientist-activity-cache"

- name: Render every surface (public HTTPS only)
run: |
mkdir -p _site
python scripts/organism_board.py --repos PyAutoMind/repos.yaml --html > _site/index.html
python scripts/organism_board.py --repos PyAutoMind/repos.yaml --activity _site/activity.json --html > _site/index.html
python scripts/organism_board.py --repos PyAutoMind/repos.yaml --badge > _site/badge.json
python scripts/organism_board.py --repos PyAutoMind/repos.yaml --md > board.md
cp board.md _site/dashboard.md
Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,7 @@ work and authoritative records remain with each organ.
## Connected projects

The dashboard includes expandable project cards linking software, shared dependencies, documentation, tutorials, workspaces, assistants and owner records. See [the project configuration contract](PROJECTS.md) to connect resources; an assistant is optional and source records remain with their owners.

The Scientist **Live Feed** groups recorded public development activity by task,
with five compact rows and expandable history. Its coverage, refresh behaviour
and limits are documented in [REPORTING.md](REPORTING.md#live-feed-recorded-development-activity).
51 changes: 51 additions & 0 deletions REPORTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,3 +84,54 @@ A requested summary is read-only. Follow-up work uses the owning workflow and
existing approval rules; the request does not authorize compute, replies,
merges or releases. Do not add recurring collection, a second task registry or
persistent monitoring to produce a one-off report.

## Live Feed: recorded development activity

The canonical Scientist dashboard has a grouped Live Feed between Projects and
Dashboards. It covers public development issues, issue/PR discussion updates,
explicit progress reports, closed tasks and merged PRs in Mind's registered
repositories. Library/workspace tasks route to Mind; organ development routes
to that organ. Scientific run progress, private work, local edits and chat-only
work are outside this first version. Independent instance previews do not yet
include the feed.

One task occupies one row. A PR is grouped with an issue only when its body has
one unambiguous standalone `Closes #N`, `Fixes #N` or `Resolves #N` directive for
that same repository and the target issue is in the collected evidence. Other
PRs remain separate. An issue being opened is not evidence of work starting;
a closed PR is not a merge, and a merge is not publication or science acceptance.

Comment bodies are never exported. Recognized headings (`Progress`, `Progress
update`, `In progress`, `Blocked`, `Shipped`, `Workspace PR Created`, `Library PR
Created`) produce short factual stage labels and source links. Other human
comments appear as “Discussion update recorded”; bot comments are excluded.
Editing a comment replaces that event without giving it a new posted time.
The source link is the place to read detail, not an automatic transcript mirror.

Collection runs in the existing Scientist Pages workflow approximately every
five minutes; scheduling and upstream visibility can delay it. The browser
checks the published same-origin `activity.json` every minute while visible.
There is no GitHub credential or per-visitor GitHub request in the page. A new
snapshot is buffered while a reader has expanded details, focused a control,
scrolled into the feed, or loaded older rows. “Show updates” applies it explicitly.

The `scientist-activity-cache` branch holds a derived, normalized cache and
per-repository cursors. It is not a task registry and contains no API response
bodies, prompts, tokens or raw comments. Only public repositories independently
verified in the current owner catalog are exported. Failed/inaccessible catalogs
suppress their cached rows. Other source failures retain last-known evidence,
mark it stale and leave the cursor unchanged. Losing the cache starts a disclosed
seven-day backfill; successful collection retains up to 30 days, 1500 events per
repository, 200 published task rows and 20 displayed events per task.

The collector uses `PAT_PYAUTOLABS` when available (180 requests per cycle), or
the workflow token (60). It rotates repositories when the request budget is
exhausted; a busy source or pagination cap is reported in coverage rather than
claimed complete. The issue and comment endpoints paginate up to three pages
of 100 each. Partial batches retain verified events and reuse already normalized PR
revisions on the next attempt. A source cursor advances only after both
endpoints and the needed PR details have succeeded. Each cycle also has a
two-minute collection time budget. Therefore “every five minutes” is the collection
attempt interval, not a guarantee that every repository is current. Event time,
source check time and page check time remain distinct. Routine feed rebuilds
never create activity events.
Loading
Loading