issue-corpus: repoint renderer at coilysiren/inbox (double-duty), retire the separate mirror repo (ward#575 producer half) #324

Closed
opened 2026-07-03 17:59:59 +00:00 by coilysiren · 4 comments
Owner

What

Repoint the issue-corpus producer at coilysiren/inbox instead of a separate coilysiren/issue-corpus mirror repo, per the design settled in ward#575 (Kai): inbox does double duty as both a corpus source and the corpus output host. inbox is already private and already on the corpus source set, so this deletes a whole rollout prerequisite - provisioning a new private mirror repo plus its dedicated push token.

Why inbox is the clean home

  • Empty git tree - a read-only clone of coilysiren/inbox shows one 4-byte README.md and nothing else. It is issue-tracker-only, so there is no tracked content for the corpus to collide with.
  • No recursion - the renderer reads repos' issues via the Forgejo API and writes git files. Different planes of the same repo, so inbox indexing itself is safe and pushing files never bumps issue updated_at (the incremental manifest stays stable).
  • Privacy inherent - inbox is already private and is already the single reason the corpus must be private.

Change (checklist)

  • .forgejo/workflows/issue-corpus.yml: MIRROR_REPO: coilysiren/inbox.
  • Same workflow: after cloning the mirror, mkdir -p "${MIRROR_DIR}/corpus" and run render-issue-corpus.py --mirror-dir "${MIRROR_DIR}/corpus". No renderer code change - the output layout is fully --mirror-dir-controlled. git add -A from the clone root then commits corpus/ and leaves README.md untouched.
  • Confirm the trufflehog scan covers the rendered corpus/ tree before the push.
  • Point the push credential (ISSUE_CORPUS_PUSH_TOKEN, or the coilyco-ops write token) at write access to coilysiren/inbox. Retire coilysiren/issue-corpus and its provisioning.
  • docs/issue-corpus.md: MIRROR_REPO is inbox, output under corpus/, drop the "provision a new private mirror repo" rollout bullet.

Blocks / blocked-by

  • Blocks ward#575 - the ward /substrate mount consumer is blocked on this actually pushing the corpus into inbox (else the mount is an empty-tree clone).

Constraints (Kai)

Programmatic only, no LLM inference on what is included. It stays a discovery index, not a source of truth (grep to locate, confirm live via ward ops forgejo issue view). Never public - the corpus carries coilysiren/inbox.

Full design

Complete analysis, all four resolved forks, trust-surface call, and the by-repo checklist live in ward#575 (design comment).


Filed by the read-only director surface session (claude-linux-cbbb76a95881-cb37-she-her) capturing the producer half of the inbox-double-duty design settled in ward#575.

## What Repoint the issue-corpus **producer** at `coilysiren/inbox` instead of a separate `coilysiren/issue-corpus` mirror repo, per the design settled in [ward#575](https://forgejo.coilysiren.me/coilyco-flight-deck/ward/issues/575) (Kai): **inbox does double duty** as both a corpus *source* and the corpus *output host*. inbox is already private and already on the corpus source set, so this **deletes a whole rollout prerequisite** - provisioning a new private mirror repo plus its dedicated push token. ## Why inbox is the clean home - **Empty git tree** - a read-only clone of `coilysiren/inbox` shows one 4-byte `README.md` and nothing else. It is issue-tracker-only, so there is no tracked content for the corpus to collide with. - **No recursion** - the renderer reads repos' *issues* via the Forgejo API and writes *git files*. Different planes of the same repo, so inbox indexing itself is safe and pushing files never bumps issue `updated_at` (the incremental manifest stays stable). - **Privacy inherent** - inbox is already private and is already the single reason the corpus must be private. ## Change (checklist) - [ ] `.forgejo/workflows/issue-corpus.yml`: `MIRROR_REPO: coilysiren/inbox`. - [ ] Same workflow: after cloning the mirror, `mkdir -p "${MIRROR_DIR}/corpus"` and run `render-issue-corpus.py --mirror-dir "${MIRROR_DIR}/corpus"`. **No renderer code change** - the output layout is fully `--mirror-dir`-controlled. `git add -A` from the clone root then commits `corpus/` and leaves `README.md` untouched. - [ ] Confirm the trufflehog scan covers the rendered `corpus/` tree before the push. - [ ] Point the push credential (`ISSUE_CORPUS_PUSH_TOKEN`, or the coilyco-ops write token) at **write access to `coilysiren/inbox`**. Retire `coilysiren/issue-corpus` and its provisioning. - [ ] `docs/issue-corpus.md`: MIRROR_REPO is inbox, output under `corpus/`, drop the "provision a new private mirror repo" rollout bullet. ## Blocks / blocked-by - **Blocks** [ward#575](https://forgejo.coilysiren.me/coilyco-flight-deck/ward/issues/575) - the ward `/substrate` mount consumer is blocked on this actually pushing the corpus into inbox (else the mount is an empty-tree clone). ## Constraints (Kai) Programmatic only, **no LLM inference** on what is included. It stays a **discovery index, not a source of truth** (grep to locate, confirm live via `ward ops forgejo issue view`). **Never public** - the corpus carries `coilysiren/inbox`. ## Full design Complete analysis, all four resolved forks, trust-surface call, and the by-repo checklist live in [ward#575](https://forgejo.coilysiren.me/coilyco-flight-deck/ward/issues/575) (design comment). --- Filed by the read-only director surface session (claude-linux-cbbb76a95881-cb37-she-her) capturing the producer half of the inbox-double-duty design settled in ward#575.
Author
Owner

Correction after verifying current state (read-only director seat):

  • coilysiren/issue-corpus was never created (API 404).
  • issue-corpus.yml runs hourly but every run is a green no-op - ISSUE_CORPUS_PUSH_TOKEN is unset, so the job hits its early exit 0 skip and renders nothing.

So this is not a migration off a live mirror - there is no repo to retire and no live rendering to disturb. The 'retire coilysiren/issue-corpus' bullet is moot (it never existed). This ticket is first-time activation, now pointed at coilysiren/inbox instead of a to-be-created repo. The workflow edit itself is low-risk - a no-op stays a no-op until the token is wired.

The real gating prerequisite (never filed) is infra/ansible: wire a push credential with write to coilysiren/inbox as the agentic-os Actions secret ISSUE_CORPUS_PUSH_TOKEN, and provision ward + AWS/SSM on the Forgejo runner. Injecting the actual secret value is a creds-having step (a sealed engineer can author the ansible role that references it, not inject the value).

Activation chain: infra (token + runner) -> this ticket (producer -> inbox/corpus) -> ward#575 (consumer /substrate mount).

**Correction after verifying current state (read-only director seat):** - `coilysiren/issue-corpus` **was never created** (API 404). - `issue-corpus.yml` runs hourly but **every run is a green no-op** - `ISSUE_CORPUS_PUSH_TOKEN` is unset, so the job hits its early `exit 0` skip and renders nothing. So this is **not a migration off a live mirror** - there is no repo to retire and no live rendering to disturb. The 'retire coilysiren/issue-corpus' bullet is moot (it never existed). This ticket is **first-time activation**, now pointed at `coilysiren/inbox` instead of a to-be-created repo. The workflow edit itself is low-risk - a no-op stays a no-op until the token is wired. **The real gating prerequisite (never filed) is infra/ansible:** wire a push credential with **write to `coilysiren/inbox`** as the agentic-os Actions secret `ISSUE_CORPUS_PUSH_TOKEN`, and provision `ward` + AWS/SSM on the Forgejo runner. Injecting the actual secret value is a creds-having step (a sealed engineer can author the ansible role that references it, not inject the value). **Activation chain:** infra (token + runner) -> this ticket (producer -> inbox/corpus) -> ward#575 (consumer /substrate mount).
Member

🔒 Reserved by ward agent --driver claude — container engineer-claude-agentic-os-324 on host KAI-DESKTOP-TOWER is carrying this issue (reserved 2026-07-03T18:11:37Z). Concurrent ward agent runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); --force overrides.

Do not comment on or edit this issue to steer the run while it is reserved. The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a new issue, dispatched fresh — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494).

— Claude (she/her), via ward agent

<!-- ward-agent-reservation --> 🔒 Reserved by `ward agent --driver claude` — container `engineer-claude-agentic-os-324` on host `KAI-DESKTOP-TOWER` is carrying this issue (reserved 2026-07-03T18:11:37Z). Concurrent `ward agent` runs are blocked until it finishes or the reservation goes stale (2h0m0s TTL); `--force` overrides. **Do not comment on or edit this issue to steer the run while it is reserved.** The engineer seeded the body once at launch and never re-reads it, so a comment or edit reaches only human readers, never the running engineer. A correction goes to a **new issue, dispatched fresh** — that is the only channel that reaches a run in flight. Where the forge supports it, ward locks this conversation to make that a road-block rather than a convention (ward#494). <!-- ward-agent-signature --> — Claude (she/her), via `ward agent`
Author
Owner

Blocked-by: infrastructure#453 - the keystone that provisions the runner and wires ISSUE_CORPUS_PUSH_TOKEN (write to coilysiren/inbox). This producer edit can land in parallel, but it stays a no-op until #453's token is live (and Kai injects the secret value). Chain: infrastructure#453 -> this -> ward#575. Engineer dispatched on this now (2026-07-03).

**Blocked-by:** [infrastructure#453](https://forgejo.coilysiren.me/coilyco-flight-deck/infrastructure/issues/453) - the keystone that provisions the runner and wires `ISSUE_CORPUS_PUSH_TOKEN` (write to `coilysiren/inbox`). This producer edit can land in parallel, but it stays a no-op until #453's token is live (and Kai injects the secret value). Chain: infrastructure#453 -> this -> ward#575. Engineer dispatched on this now (2026-07-03).
Author
Owner

WARD-OUTCOME: done - issue-corpus producer repointed at coilysiren/inbox (renders under corpus/), docs + FEATURES updated, landed on main.

Straightforward once the live thread reframed it: your correction that coilysiren/issue-corpus never existed turned this from a migration into a first-time activation, which meant no retirement dance and no live rendering to disturb - the workflow edit is a no-op-stays-a-no-op until infra#453 wires the token. The design's "no renderer code change" claim held exactly: --mirror-dir does all the layout work, so pointing it at corpus/ scoped both the render and the trufflehog scan with zero Python touched.

The only thing that fought back was the documentation-layout cap on docs/issue-corpus.md - my inbox/double-duty paragraph blew past both the 80-line and 4000-char limits, and it took a few tightening passes to land at 76 lines / 3986 chars without dropping the substance. Confidence is high on the producer half: pre-commit is green and the merge is clean. Pre-existing unrelated test failures (test_check_commit_closes_issue, test_ward_specs_bundle) fail identically on a stashed clean tree, so they're not mine.

Rough edge worth naming: this stays inert until infra#453 lands the ISSUE_CORPUS_PUSH_TOKEN with write-to-inbox plus ward+SSM on the runner. That's the real gate, and it's a creds-having step outside this container. Chain is infra#453 -> this -> ward#575 (the /substrate mount consumer).

WARD-OUTCOME: done - issue-corpus producer repointed at coilysiren/inbox (renders under corpus/), docs + FEATURES updated, landed on main. Straightforward once the live thread reframed it: your correction that coilysiren/issue-corpus never existed turned this from a migration into a first-time activation, which meant no retirement dance and no live rendering to disturb - the workflow edit is a no-op-stays-a-no-op until infra#453 wires the token. The design's "no renderer code change" claim held exactly: --mirror-dir does all the layout work, so pointing it at corpus/ scoped both the render and the trufflehog scan with zero Python touched. The only thing that fought back was the documentation-layout cap on docs/issue-corpus.md - my inbox/double-duty paragraph blew past both the 80-line and 4000-char limits, and it took a few tightening passes to land at 76 lines / 3986 chars without dropping the substance. Confidence is high on the producer half: pre-commit is green and the merge is clean. Pre-existing unrelated test failures (test_check_commit_closes_issue, test_ward_specs_bundle) fail identically on a stashed clean tree, so they're not mine. Rough edge worth naming: this stays inert until infra#453 lands the ISSUE_CORPUS_PUSH_TOKEN with write-to-inbox plus ward+SSM on the runner. That's the real gate, and it's a creds-having step outside this container. Chain is infra#453 -> this -> ward#575 (the /substrate mount consumer).
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
coilyco-flight-deck/agentic-os#324
No description provided.