Today the bot gives two of the pre-check's four answers on the pull request: what changed in the model's
structure, and what it needs. Every pull request that touches a model gets its peak memory at your batch, the smallest card it fits and what one
run costs, before the job takes a reservation. A change that will not fit your card, or will not run at all, turns
the check red. The memory number is fitted on 178 measured runs (held out, median error 7%; 14% on 25 runs measured after the fit). And the bot keeps
the row, so the next plan can say what this structure did last time:
history Last time this structure trained here: valAcc 0.9865, 3 epochs, <$0.01, 34s, 2026-09-04
That one is real, from
model-ci-example#2,
out of a ledger that holds your organisation's runs and nobody else's.
It is event-driven (pull requests, comments, a weekly clock), it uses tools
(the tracer, the verifier, the plan, git, the training runner), it acts on its own (opens fix pull requests, submits
jobs when asked), it verifies its own work with a deterministic gate before pushing anything, and it remembers
outcomes in a ledger the next change is checked against. Dependabot did this for dependencies.
Plan and block are shipped. Fix pull requests and /neurarch train are in progress. Neither artifact below is a mock. Both are copied from a real run and link to it.
$ neurarch-trace torchvision.models:resnet18 --input 1,3,224,224 --plan --share Plan: resnet18 68 layers · 11.7M params · fingerprint 9ea7d4ae shape [3,224,224] -> [1000] will run yes (0 blockers, 0 warnings) fits T4 16GB yes · A100 40GB yes · H100 80GB yes train ~$0.11 / 6m on A10G (24GB) (10 epochs, batch 32, 50k samples assumed) Share: https://www.neurarch.com/p/r7rq5c4jt2
models/small_cnn.py:SmallCNN will run
SmallCNN: 21 layers, 1.1M params, will run, fits a T4, about $0.05 to train, vs SmallCNN: params +978.9K
| Layers / params | 21 / 1.1M (+978.9K, +693%) |
| Shape | [3,32,32] -> [10] |
| Will it run | yes, 0 warnings |
| GPU fit | T4 yes · A100 40GB yes · H100 80GB yes (memory +0.02 GB) |
| Est. training | ~$0.05 / 3m on A10G (24GB) (+<$0.01) |
| Blast radius | 7 downstream layers from 8 touched |
The GitHub App reads the model files a pull request changes and posts the same plan card, with no file to commit and no account to create.
Add the Neurarch App to a repository
It asks for three permissions: read your repository contents, read pull requests, write issue comments. Nothing else. It never pushes, never opens a pull request, and never runs your code.
The hosted App reads your source statically, and that is weaker. A serverless function has no torch, so it cannot trace a forward pass: it recognises the layers assigned in __init__ and nothing built at runtime. Every comment it posts says so and lists the layers it could not read. For the real graph, the two-file Action below installs torch and traces it, and it is the way to get a traced plan and (later) training from a comment.
One workflow, one config that names the models and their input shapes. The bot traces a forward pass in CI, so it works on models built at runtime: from_pretrained, timm factories, architectures across a dozen files.
name: neurarch-bot
on: [pull_request]
permissions:
contents: read
pull-requests: write
jobs:
plan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: neurarch-ai/neurarch-bot@v0
models:
- path: models/gpt.py:GPT
input: 1,128:long
- path: models/resnet.py:ResNet18
input: 1,3,224,224
policy: # optional, coming with phase 3
max_params: 200M
must_fit: A100-40GB
forbid_types: [softmax]
No account needed. An API key (Settings → Developer API) lifts the anonymous rate limit and, later, turns on the ledger. Try the same plan locally first: pip install neurarch-trace.
Traces base and head, posts one comment: layers, params and the delta, GPU fit, estimated cost and the delta, blast radius, the exact lines that changed structurally. Updated in place on every push, never duplicated.
A graph that will not forward-pass turns the check red. Deterministic: the same graph gets the same answer every run, which is what a gate in front of a GPU queue needs.
On a blocker the bot opens a branch with the patch, re-traces, re-plans, and pushes only if the new plan is legal. Exact fixes need no model call; proposed fixes are verified in your CI before anything is pushed.
Comment on the PR and the bot submits the job, watches it, posts the curve and the metrics, and writes the outcome to your ledger so the next change is checked against what actually happened.
--share or set share: true. Shared plans are stored at an unguessable URL and say so on the page.The full contract is in docs/DATA_POLICY.md; the site privacy page is here.