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
23 changes: 18 additions & 5 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# lint.yml — PR / push-to-main gate.
#
# Cheap, fast, CPU-only. Runs on every PR and on push to main. It lints only what exists
# in the skeleton: ruff (check + format) and a lychee link check over README.md and
# AGENTS.md. No PyAuto library is installed and no script runs; the pytest and smoke legs
# arrive with the harness in a later phase of the search-extensibility epic.
# Cheap, fast, CPU-only. Runs on every PR and on push to main: ruff (check + format), the
# stdlib-only tests under scripts/misc/test, the "committed catalogue is current and
# validates with the PyAutoPulse reader" check, and a lychee link check over README.md and
# AGENTS.md. No PyAuto library is installed and no measurement cell runs.

name: lint

Expand All @@ -30,7 +30,7 @@ jobs:

- name: Install lint tools
run: |
pip install ruff
pip install ruff pytest pyyaml
# lychee is a Rust binary; fetch the prebuilt release. The tarball
# nests everything under lychee-x86_64-unknown-linux-gnu/, so strip
# that leading directory and extract just the binary.
Expand All @@ -43,6 +43,19 @@ jobs:
- name: ruff format --check
run: ruff format --check .

# Checked out after ruff so the Pulse tree is never linted as this repo's code.
- name: Checkout PyAutoPulse (the profiling-summary@2 reader)
uses: actions/checkout@v4
with:
repository: PyAutoLabs/PyAutoPulse
path: _pulse

- name: pytest (stdlib-only tooling tests)
run: python -m pytest -q scripts/misc/test

- name: catalogue up to date and valid profiling-summary@2
run: python scripts/misc/tooling/build_catalogue.py --check --validate-with _pulse

- name: lychee — markdown link-rot
run: |
# Exclude GitHub UI links that lychee tends to false-positive on, and the
Expand Down
79 changes: 79 additions & 0 deletions .github/workflows/pages_dashboard.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
name: Pages Dashboard

# Publishes the producer page (`dashboard/index.html`), the PyAutoPulse read contract
# (`dashboard/catalogue.json`, profiling-summary@2) and the project badge feed
# (`dashboard/state.json`) at https://pyautolabs.github.io/autofit_profiling/. The files
# are rendered and committed by `scripts/misc/tooling/build_catalogue.py`; this workflow
# only validates and publishes them, then tells PyAutoPulse to re-read the summary.
# Mirrors autolens_profiling's pages_dashboard.yml (project-feed identity:
# PyAutoMind complete/2026/10/pulse-refresh-project-identity.md).

on:
push:
branches: [main]
paths:
- "dashboard/**"
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: pages
cancel-in-progress: true

jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4
with:
repository: PyAutoLabs/PyAutoBrain
path: _brain
- uses: actions/checkout@v4
with:
repository: PyAutoLabs/PyAutoPulse
path: _pulse
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Validate the catalogue with the Pulse reader and check it is current
run: |
pip install pyyaml
python scripts/misc/tooling/build_catalogue.py --check --validate-with _pulse
# enablement: true creates the Pages site on first run.
- uses: actions/configure-pages@v5
with:
enablement: true
- name: Stage the dashboard as the site
run: |
mkdir -p _site
cp dashboard/index.html dashboard/catalogue.json dashboard/state.json _site/
- name: Validate the project badge feed against the Brain contract
run: python3 _brain/board/_state.py _site/state.json
- uses: actions/upload-pages-artifact@v3
with:
path: _site
- id: deployment
uses: actions/deploy-pages@v4
- name: Tell the PyAutoPulse dashboard to refresh (repository_dispatch pulse-refresh)
env:
GH_TOKEN: ${{ secrets.PAT_PYAUTOLABS }}
run: |
if [ -z "$GH_TOKEN" ]; then
echo "::warning::PAT_PYAUTOLABS is not available to this repo — skipping the pulse-refresh dispatch to PyAutoLabs/PyAutoPulse."
exit 0
fi
sha=$(git rev-parse HEAD)
gh api repos/PyAutoLabs/PyAutoPulse/dispatches \
-f event_type=pulse-refresh \
-f "client_payload[repo]=${{ github.repository }}" \
-f "client_payload[sha]=${sha}" \
-f "client_payload[summary]=dashboard/catalogue.json"
echo "Dispatched pulse-refresh to PyAutoLabs/PyAutoPulse (${{ github.repository }}@${sha})."
38 changes: 32 additions & 6 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@ It is a collection of standalone scripts, **not** an installable package — the
`pyproject.toml`. These are the canonical, agent-agnostic instructions; `README.md` is the
human-facing overview.

**Status:** skeleton born 2026-10-07 (PyAutoMind#492), phase B1 of the
`search-extensibility` epic. There is no harness, no exporter and no result yet.
**Status:** born 2026-10-07 (PyAutoMind#492, phase B1 of the `search-extensibility`
epic). B4a (2026-10-14) added the first cell — the Nautilus `search.fit` breakdown on
gaussian_x1 — the `profiling-summary@2` exporter and the Pages board; the repo reports to
PyAutoPulse as instance `fit`. The EP / graphical baseline port is B4b.

## Where this repo is going

Expand All @@ -26,7 +28,7 @@ The work arrives in later phases of the `search-extensibility` epic, whose ledge
`fit` (`profiling-summary@2`). This adopts Pulse's task `autofit_profiling_bootstrap`.
- **B4b** — the EP / graphical-model baseline port.

Until then, do not add scripts, results or exporters outside the phase that owns them.
Do not add scripts, results or exporters outside the phase that owns them.
PyAutoPulse validates the published summary contract; the Brain's profiling conductor
judges it. Nothing here issues a verdict.

Expand All @@ -35,10 +37,33 @@ judges it. Nothing here issues a verdict.
```
ruff.toml lint config AND the root sentinel (leaf scripts walk up to it)
activate.sh RAL shared venv + PYTHONPATH (PyAutoNerves, PyAutoFit only)
config/ PyAutoConf overrides (library output defaults kept on purpose)
scripts/<dataset>/<search>/<cell>.py measurement cells, e.g. gaussian_x1/nautilus/search_fit_breakdown.py
scripts/misc/profiling/ stdlib helpers shared by cells (exclusive component timer)
scripts/misc/tooling/build_catalogue.py results/ -> dashboard/{catalogue.json,index.html,state.json}
scripts/misc/test/ stdlib-only tests (no PyAuto install)
results/ committed result rows (schema autofit-profiling-breakdown), one file per cell variant
dashboard/ generated: catalogue.json (profiling-summary@2), index.html, state.json
wiki/campaigns/ findings pages; search_fit_bottlenecks.md is epic 1's ranked table
hpc/ hpc/sync (laptop-side RAL driver) + the batch_cpu submit template
```

`scripts/`, `results/` and the summary exporter arrive in B4a.
## Producing a result and publishing it

1. `source activate.sh`, run a cell (e.g. `python scripts/gaussian_x1/nautilus/search_fit_breakdown.py`);
it writes its row under `results/`. Laptop CPU cells need no RAL.
2. `python scripts/misc/tooling/build_catalogue.py --validate-with ../PyAutoPulse` renders
`dashboard/` and validates the catalogue with the Pulse reader; commit rows and
`dashboard/` together. The renderer is deterministic (its stamp is the newest
evidence time), so `--check` is the lint gate.
3. On merge, `.github/workflows/pages_dashboard.yml` publishes `dashboard/` to Pages
(`https://pyautolabs.github.io/autofit_profiling/`) and dispatches `pulse-refresh` to
PyAutoPulse (payload repo / sha / `dashboard/catalogue.json`; needs the org secret
`PAT_PYAUTOLABS`, warns and skips without it). `dashboard/state.json` is this
project's own badge feed; the Brain cockpit reads the PyAutoPulse organ feed.

Every catalogue record is declared `unreviewed`: the producer measures, the Brain's
profiling conductor judges.

## RAL

Expand All @@ -53,8 +78,9 @@ detail in [`hpc/README.md`](hpc/README.md).
## Testing

The PR gate is `.github/workflows/lint.yml` on Python 3.12: `ruff check .`,
`ruff format --check .` and a `lychee` link check over `README.md` and `AGENTS.md`. It
installs no PyAuto library and runs no script.
`ruff format --check .`, `pytest -q scripts/misc/test`, `build_catalogue.py --check
--validate-with _pulse` (PyAutoPulse checked out beside) and a `lychee` link check over
`README.md` and `AGENTS.md`. It installs no PyAuto library and runs no measurement cell.

## Related Repos

Expand Down
12 changes: 7 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@ It is the sibling of [autofit_inference](https://github.com/PyAutoLabs/autofit_i
(PyAutoFit search benchmarking) and the PyAutoFit counterpart of
[autolens_profiling](https://github.com/PyAutoLabs/autolens_profiling).

**Status: skeleton — no results yet.** The repo was born 2026-10-07 as phase B1 of the
[search-extensibility epic](https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/research/autofit/search_extensibility_epic.md). The breakdown exporter and first results arrive in
B4a, when the repo starts reporting to
[PyAutoPulse](https://github.com/PyAutoLabs/PyAutoPulse); the EP baseline port follows in
B4b.
**Status:** the first cell — where the time in one Nautilus `search.fit` goes on a fast
1-D Gaussian likelihood — landed in B4a of the
[search-extensibility epic](https://github.com/PyAutoLabs/PyAutoMind/blob/main/draft/research/autofit/search_extensibility_epic.md),
with its ranked table in [`wiki/campaigns/search_fit_bottlenecks.md`](wiki/campaigns/search_fit_bottlenecks.md).
The repo reports to [PyAutoPulse](https://github.com/PyAutoLabs/PyAutoPulse) as instance
`fit` (`dashboard/catalogue.json`, `profiling-summary@2`); its own board is published to
GitHub Pages from `dashboard/`. The EP baseline port follows in B4b.

Agents and contributors: start with [`AGENTS.md`](AGENTS.md).
4 changes: 4 additions & 0 deletions config/general.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# PyAutoConf overrides for runs launched from this repo. Output keeps the library
# defaults on purpose: a breakdown cell measures what a user's search.fit pays.
version:
workspace_version_check: false # this repo tracks PyAutoFit main, not a release tag; the mismatch warning is expected noise.
Loading
Loading