Repository navigation
Conversation
ASCS-eV/PufferDrive is consumed as a git submodule internally while feeding
features back to Emerge-Lab/PufferDrive. This commit carries everything that
exists only in the fork, and is the single place fork-only content lives.
Branch model:
3.0 verbatim, fast-forward-only mirror of upstream/3.0
integration/3.0 default branch; this commit plus a linear stack of
single-commit features; what internal consumers pin
feature/<slug> one feature, exactly one commit
mirror/<slug> cherry-picked onto pure upstream/3.0 for upstream PRs
integration/3.0 is the default branch because GitHub reads the PR template,
the contributing guidelines, the agent instructions and scheduled workflows
only from the default branch, and none of those files may exist on 3.0
without destroying the mirror. A clone checks out the default branch, so the
copy of the instructions here is the process as far as every agent and every
submodule consumer is concerned; a rule that lives only in an open PR has no
effect.
Nothing reaches integration/3.0 until three gates pass:
1. CI green on the final commit.
2. Adversarial review by someone other than the author, with the findings
written down -- including the probes that found nothing.
3. Upstream-readiness proven rather than asserted: the commit cherry-picks
onto a branch cut from pure upstream/3.0 and produces an upstream-clean
diff. We stack only commits we could contribute today.
chore(fork): commits are exempt from gate 3, since fork-only infrastructure
can never be upstream-ready. They carry two orthogonal markers: do-not-mirror
(must never reach upstream) and do-not-merge (the merge button is never
pressed -- merging would create a second chore(fork): commit and break the
single-commit invariant that every sync asserts). Such a PR is folded into
this commit by fixup and closed unmerged.
Contents:
- .github/copilot-instructions.md: normative process for coding agents
- CONTRIBUTING.md: human orientation, same rules
- .github/pull_request_template.md: testing and stack-hygiene gates
- .github/workflows/sync-mirror.yml: fast-forward-only mirror sync that
refuses any non-fast-forward instead of rewriting the upstream base
- AGENTS.md / CLAUDE.md: fenced pointer so agents find the fork process
without colliding with upstream-owned content
- ci.yml / install.yml: run CI for PRs targeting integration/3.0, which
upstream's branch filters would otherwise skip
A standing draft PR from integration/3.0 into 3.0 gives a continuous CI
verdict on the combined stack; it must never be merged.
Everything here is fork-only and must never be cherry-picked upstream.
The Linux CI jobs fail while installing the package:
[Errno 122] Disk quota exceeded
Errno 122 is EDQUOT, hit while unpacking the CUDA torch stack that
`pip install -e .` resolves by default. torch alone is 554.6 MB and the
accompanying nvidia-* wheels add another ~2.4 GB, which no longer fits
the runner's quota. The failure occurs during "Installing build
dependencies", i.e. the isolated PEP 517 build environment is already
enough to exceed it on its own.
The trigger is a runner image change, not a code change:
* upstream 11_bernhard_dev, 2026-10-20, Image: ubuntu-24.04 -> success
* same workflows, 2026-10-23, Image: ubuntu-26.04 -> failure
Both resolve an identical wheel set (torch 2.14.1, 554.6 MB). The
`ubuntu-latest` label began migrating to Ubuntu 26 on 2026-10-19
(actions/runner-images#14748), between those two runs. Both workflows
already carry "Free up disk space" steps, so these jobs were running
close to the limit before the migration.
Fix: install CPU-only torch from download.pytorch.org, then build with
--no-build-isolation so the build reuses it instead of resolving torch
a second time. --no-build-isolation needs the build dependencies present
up front, hence the explicit setuptools/wheel/numpy install; the
`setuptools<81` bound matches the pin already in install_requires.
This loses no coverage: BUILD_CUDA_EXT keys off CUDA_HOME/ROCM_HOME,
which is unset on these runners, so the CUDA sources were never compiled
here. tests/smoke_tests/Dockerfile already installs torch this way.
macOS keeps the plain `pip install -e .` unchanged: its PyPI wheels are
already CPU-only, and leaving it alone keeps the default PEP 517
build-isolation path under test somewhere in the matrix.
f6f4fca to
625313e
Compare
Gate 2 — adversarial review recordReviewed with fresh context, no authoring state. Verdict: FAIL on first pass — 3 blockers, 3 BlockersB1 — two pushes, one invariant. The fold published B2 — the guard that fails open. B3 — still no execution path. The rewritten workflow was, once again, about to be folded on the Should-fix
Execution evidence — all five states, dispatched on this branch
State 4 is also the first execution of the The standing view PR is now open as #7 — draft, base Probes that found nothing
Accepted, not fixed
|
The first real run of fork-only-view.yml proved the publishing design cannot work: GitHub blocks GITHUB_TOKEN from pushing any commit that creates or updates a file under .github/workflows/, and the fork base commit is made almost entirely of such files. No permissions: block lifts that restriction. Automating it anyway would mean storing a PAT or GitHub App token with workflows write in a public repository. Instead the branch is published by hand as the last step of the two procedures that already force-push with human credentials, and the workflow becomes a detector that fails loudly when the view is missing or stale, printing the exact command to fix it. It now needs no write access at all.
625313e to
670efb8
Compare
Follow-up finding, caught by executing the procedure rather than reading itWhile running the section 3.3 fold for this very PR, the fold aborted on a mismatch: section 3.3's Fixed in This is the second time in this PR that the difference between stating a procedure and running Gate 1 is re-running on |
fad5d95 to
b3fcee3
Compare
Folded into the base commit — closing unmerged (section 3.3)This PR is closed, not merged, exactly as a
Gates: Gate 1 12/12 on Invariants verified before the push
Tree-identity is what carries Gate 1 across the fold: the rewritten The atomic push, exercised for the first timeOne The detector, proven on the real eventThe push fired the new workflow on both branches, from the default branch, with no dispatch:
That second run is S1 working live: tampering with the view itself is now caught, not only drift of The standing view PR is #7 (draft, base What this PR changed in the process
|
What
Turn
fork-only-view.ymlinto a drift detector with no write access, and publishfork-only/3.0by hand as the last step of the fold (3.3) and rebase (7) procedures.Why
The first real run of the workflow — triggered by folding #5 — failed:
GitHub blocks
GITHUB_TOKENfrom pushing any commit that creates or updates a file under.github/workflows/. It is a platform rule, and nopermissions:block lifts it — confirmedagainst GitHub's own docs on choosing GitHub App permissions. The fork base commit is made almost
entirely of workflow files, so the publish-by-workflow design could never have worked.
Automating it anyway would mean storing a PAT or GitHub App token with
workflowswrite in apublic repository. That is a far worse trade than one extra line in two procedures that are
already manual and already force-push with human credentials.
So the roles swap: humans publish, the workflow detects. When the view is missing or stale the
run fails and prints the exact
git pushthat fixes it. Permissions drop fromcontents: write+pull-requests: writetocontents: read+pull-requests: read.How tested
permissions: {contents: read, pull-requests: read}39986186116 resolved the
fork base correctly (all 8 guards passed) and failed only on the push — so the guard
logic is already proven in production and is carried over unchanged
git diff --checkclean; LF-only, single trailing newline on all three filesNot run, and why:
pre-commitand themakesuites need a POSIX shell and.venv/bin/python(4.3); authored on Windows, and the CI
pre-commitjob covers the former. No.c/.h, Python,notebook, dynamics, reward, observation or training-loop code is touched.
New behaviour covered by a test: n/a — fork-only CI/doc infrastructure. The detector's own
guards are its test, and they are already proven green by the run linked above.
Stack hygiene
integration/3.0Merge gate
Upstream disposition
chore(fork):change, Gate 3 exemptRisk / notes
detector fail — not warn — when it is missing or stale, so the standing integration PR and the
Actions tab both show red until someone republishes.
procedures that rewrite it, rather than left as advice somewhere else.
that found 2 blockers and 6 should-fix issues, all handled) and was still wrong. Neither gate can
see a server-side push restriction; only executing it could. Worth remembering before trusting a
green gate set on anything that has never actually run.