Agent brief lands through the merge queue; the gallery meta says what ships

- AGENT-BRIEF.md told agents to push with an inline token, to a retired
  branch, and to main without the lock the server now requires. It now
  gives the askpass setup, the capture/scan/push/release order, and says to
  grade the push by exit code.
- README: the full build needs BUILD_ALLOW=1 (it refuses with exit 75
  otherwise); say so, and why, where the build is documented.
- doxa-maps-spa.meta.json described the retired iframe mode and listed six
  old children. `composes` now names the seven tabs the shell mounts, so the
  studio's Composed-of panel and check:composite see the real tree.
This commit is contained in:
doxa-maps-88655c70 2026-09-24 18:44:51 +00:00
parent c46a9a04bd
commit 29dfef1fc4
3 changed files with 39 additions and 32 deletions

View file

@ -14,31 +14,33 @@
**Ship a commit, then write two sentences. Not the reverse.** The artifact is the diff. A long,
honest report attached to no commit is the failure mode this file exists to end.
**Push it.** A local commit is invisible — the Driver runs a laptop watcher against the Forgejo repo
and sees changes in his browser *from that repo*. Work that stops at `git commit` is not delivered.
**Land it on `main`.** A local commit is invisible — the Driver watches **`main`** on the Forgejo
repo, so work that stops at `git commit`, or at a side branch, is not delivered. Work in your OWN
worktree off `main`, then land on `main` through the **merge queue** (`main-capture`). Pushes to `main`
without it are REJECTED by the server: several agents share one Forgejo account, so the lock is the
only thing that serializes them.
```sh
TOKEN="$(pass show vivarium/forgejo-certified-sandbox | head -1)"
git -c http.postBuffer=524288000 \
push "https://oauth2:${TOKEN}@git.nuxtbase.app/doxa-life/doxa-maps.git" HEAD:doxa-maps-plugin-studio \
2>&1 | sed "s/${TOKEN}/[REDACTED]/g"
unset TOKEN
# Credentials: route git through the host's askpass helper. NEVER put a token in a URL, a
# command line, or .git/config, and never let git prompt (a prompt hangs a headless agent).
export GIT_ASKPASS="$(dirname "$(command -v main-capture)")/forgejo-askpass"
export FORGEJO_PASS_ENTRY=vivarium/forgejo-certified-sandbox GIT_TERMINAL_PROMPT=0
unset SSH_ASKPASS DISPLAY
git fetch origin && git rebase origin/main # you resolve every conflict, not main
main-capture capture && \
main-capture scan && \
git push origin HEAD:main ; \
main-capture release # the ';' is load-bearing: ALWAYS release
```
Never echo the token; always filter output through `sed`; never let it reach `.git/config`.
Grade the push by its EXIT CODE (`${PIPESTATUS[0]}` if you pipe it), never by grepping its output:
the word `main` also appears in the rejection line, and a grep once reported 8 rejected pushes as
landed. After pushing, `git fetch origin` and confirm your commit is on `origin/main`.
★ **PUSH TO `main` TOO, once your change is verified.** The Driver's laptop dev-server watches
**`main`**, not the working branch — so work pushed only to `doxa-maps-plugin-studio` is invisible
to him no matter how well it was tested. That is how 287 commits accumulated without him seeing a
single one.
```sh
git -c http.postBuffer=524288000 \
push "https://oauth2:${TOKEN}@git.nuxtbase.app/doxa-life/doxa-maps.git" HEAD:main \
2>&1 | sed "s/${TOKEN}/[REDACTED]/g"
```
Only push to `main` what you have actually verified — it is the branch a human is looking at.
Only push to `main` what you have actually verified — it is the branch a human is looking at. The
old `doxa-maps-plugin-studio` branch is retired; do not push to it.
## Do not run the full build

View file

@ -293,7 +293,7 @@ Two things worth knowing:
| `bun run dev` | The Plugin Studio with hot reload, at http://localhost:5173 |
| `bun x vite --port 5299 --strictPort` | A dev server on your own port (see the swarm rules below) |
| `BUNDLE=<name> bun x vite build` | Build **one** bundle, without cleaning anyone else's output |
| `bun run build` | The full production tree in `public/doxa-maps/` (~4 minutes, takes a lock) |
| `BUILD_ALLOW=1 bun run build` | The full production tree in `public/doxa-maps/` (~4 minutes, takes a lock) |
| `bun run serve` | Serve the built tree at http://localhost:4173, the way production does |
| `bun run check:settled` | Exit 0 = the built tree is safe to measure or publish right now |
| `bun run gates:pre` / `bun run gates:post` | The static and post-build verification gates |
@ -330,11 +330,15 @@ The dev server is for working; **you do not need a build to see a change.** When
deployable tree:
```bash
bun run build # ~4 minutes; writes public/doxa-maps/
BUILD_ALLOW=1 bun run build # ~4 minutes; writes public/doxa-maps/
bun run serve # serve the BUILT tree at http://localhost:4173
```
`bun run build` takes a **lock**: if another build is already running it fails fast rather than
**`BUILD_ALLOW=1` is required on purpose.** Without it the build refuses (exit 75) and prints cheaper
alternatives, because a full build wipes the output tree that every other agent in a swarm is
reading. On your own machine, with no one else working, set it.
The build also takes a **lock**: if another build is already running it fails fast rather than
corrupting the shared output. Set `BUILD_LOCK_WAIT=600` to queue behind it instead.
**The lock protects a second WRITER. It does not protect a READER.** Every build begins by deleting
@ -400,7 +404,7 @@ Without `--strictPort`, Vite silently moves a busy port to the next one — and
about somebody else's page. With `--strictPort` the duplicate exits non-zero instead.
**4. One owner for the full build.** Agents edit source and check their own bundle with
`BUNDLE=<name> bun x vite build`. Only one agent runs `bun run build`, because every full build wipes
`BUNDLE=<name> bun x vite build`. Only one agent runs `BUILD_ALLOW=1 bun run build`, because every full build wipes
the shared output tree first.
**5. Land through the merge queue.** On one machine, a file lock is a complete merge queue — agents

View file

@ -1,13 +1,14 @@
{
"_comment": "Declares the composability tier. 'nested-mfe-spa' (display alias 'app-shell') = Capability-5: this plugin is the OUTER app-shell of the whole DX-maps app. Its single element <doxa-maps-spa> renders a VERTICAL-TAB layout that nests the OTHER plugins as its tabs — tab-1 = the Cat-4 Big Picture (mounted directly via its real <bp-big-picture> tag + its built .js, token-free), the other tabs = each production research map, nested as its OWN full SPA via that map's standalone leaf page (iframe, so each map keeps its own peer-engine + Mapbox-token ladder + profile-config and there is NO customElements.define collision — the one-shot-define hazard is avoided by giving each map its own document). This explicit meta is the ONLY way the Cat-5 tier is declared (discover.mjs never infers it). Filename must be <profile>.meta.json where profile = the root .vue name (doxa-maps-spa). generate-gallery.readSourceTiers() reads this and bakes capability 5 for the plugin, so it appears in the studio manifest as the app-shell (nested-mfe-spa).",
"_comment": "Declares the composability tier. 'nested-mfe-spa' (display alias 'app-shell') = Capability-5: this plugin is the OUTER app shell of the dx-maps app, the Research Gallery. Its single element <doxa-maps-spa> renders a vertical-tab rail whose tabs each mount a REAL, independently embeddable plugin: the shell loads that bundle's script (URL from manifest.json) and creates its registered custom element in the pane. There is no iframe mode. Tab order and grouping live in NAV_MODEL/TAB_DEFS in doxa-maps-spa.vue; `composes` below lists the seven curated tabs as bundle/profile and must be kept in step with TAB_DEFS (check:composite reads it; the studio's Composed-of panel shows it). Bundles not placed in a section appear under Experimental automatically. This explicit meta is the ONLY way the Cat-5 tier is declared (discover.mjs never infers it).",
"type": "nested-mfe-spa",
"composes": [
"bp-big-picture",
"doxa-research-map",
"doxa-simple-map",
"cities-internet-map",
"gospel-resources-map",
"my-upg-100-list-map"
"dashboard-plus-grid/dashboard-plus-grid",
"research-map-plus-grid/research-map-plus-grid",
"regions-dashboard/regions-mfe",
"my-upg-100-list/upg-100-mfe",
"doxa-simple-map/doxa-simple-map",
"cities-internet/connectivity-map",
"gospel-resources/resources-map"
],
"label": "Research Gallery (vertical-tab app-shell: Big Picture + every research map)"
"label": "Research Gallery (vertical-tab app shell: the seven production maps)"
}