Skip to content

docs(beta-docs-showcase): BS0 stage kickoff — Fumadocs prototype, leg A (build + in-container gate) - #1561

Merged
artyhoo merged 1 commit into
stagingfrom
claude/epic-rhodes-70b8d3
Sep 2, 2026
Merged

docs(beta-docs-showcase): BS0 stage kickoff — Fumadocs prototype, leg A (build + in-container gate)#1561
artyhoo merged 1 commit into
stagingfrom
claude/epic-rhodes-70b8d3

Conversation

@artyhoo

@artyhoo artyhoo commented Sep 2, 2026

Copy link
Copy Markdown
Owner

Summary

BS0 is the beta-docs-showcase umbrella's STOP-gate: if a Fumadocs static export cannot serve the route set the docs site depends on, the stack is retired to Starlight (design parent D5 falsifier-1). Dispatching it required a stage kickoff, and none existed — the umbrella had only its umbrella kickoff and the meta-launch.

This adds that dispatch input, plus the .gitignore exception that makes it a tracked file.

Why the stage is split into two legs

The design puts the prototype in a scratch repo, artyhoo/getff-docs-smoke. Measured 2026-09-02:

$ gh repo view artyhoo/getff-docs-smoke
GraphQL: Could not resolve to a Repository with the name 'artyhoo/getff-docs-smoke'. (repository)
$ docker exec aif-handoff-agent-1 curl -sI https://github.com
(no output — blocked)
$ gh api repos/artyhoo/getff-landing/pages | jq -c '{cname,source,build_type}'
{"cname":"getff.ai","source":{"branch":"main","path":"/"},"build_type":"workflow"}

The repo does not exist, the aif container has no github.com route, and creating a public repo under the operator's account is an outward-facing act no worker may take. So the stage splits:

  • Leg A (this kickoff, an aif task): build the prototype in the landing container on branch bs0-fumadocs-smoke, prove it against a local serve of the export.
  • Leg B (host + operator): create the scratch repo, transplant smoke/ as its root, enable Pages, quote the live gate.

The kickoff makes leg A green ≠ BS0 green a binding reporting rule, so BS0 → BS1 stays closed until deployed-URL evidence exists. This extends the design's own «flag, don't block» doctrine for the DNS step (umbrella kickoff.md:56-58, meta-launch kickoff.md:211-216) one step up to repo creation, on the same reasoning: the outward-facing act stays with the operator while the reversible measurement (risk R-B1) runs now.

Deliverables land only under a new smoke/ directory laid out as the future scratch-repo root, so leg B is a lossless copy. main is untouched and the branch never opens a PR against it — Pages is cname-bound to main:/, so a second deployment from the landing repo would displace production. The kickoff says this explicitly so the worker does not «help» by wiring a Pages workflow onto a landing branch.

Filename

kickoff-b0.md, not kickoff-bs0.md. The stage-kickoff family is ^kickoff-[a-z]\d[a-z0-9]*\.md$ (packages/core/principles/kickoff-population.ts:34); bs0 fails it at the \d position, so that form would be read as a sidecar and principle 12's citation gate would skip it silently. The .gitignore exception carries the reason inline rather than leaving the next author to rediscover it.

No bridge-profile marker, deliberately

All three modes on the landing project resolve to the executor tier per the operator's GLM-only directive of 2026-08-17 (PR #1446; umbrella kickoff.md:18-25). Measured now: 41315ef6 «Claude Opus (plan+review)» enabled=false lastUsageAt=null; project 361685f1 plan/review 53eca24c, task 088182b8. The kickoff §6 also records the live defect #1446 surfaced and nobody has fixed: the aif mode-override preset (.claude/skills/pipeline/references/mode-overrides.md:172) still names that disabled profile, and marker resolution reads an unfiltered profile list (packages/runtime-bridge/src/AifHandoffBackend.ts:132), so attaching it would dispatch «successfully» and then block on runtime auth.

Test plan

  • npx vitest run packages/core/principles/12-ai-laziness-traps.test.ts → 9 passed (the new kickoff is in-family and cites the rule + enumerates T-numbers)
  • bash scripts/host-verify.sh .claude/orchestrator-prompts/beta-docs-showcase/kickoff-b0.md → opt-out accepted (282 chars)
  • check-kickoff-traps.sh with JSON on stdin → exit 0
  • npx markdownlint-cli2 → 0 errors; npx prettier --check → clean
  • bash scripts/run-local-ci-sweep.shSWEEP: no gates selected for this diff (mode=diff)
  • pre-push green (lychee 5 OK / 0 errors, always-on 39988B within 54000B ceiling, ask-file schema valid)
  • git ls-files -s → mode 100644 (the umbrella dir's coordination hook turns new untracked files into symlinks; write + git add ran in one call)

§1.7 Skipped: dispatch-input documentation only — this PR adds one stage kickoff under .claude/orchestrator-prompts/** plus a .gitignore exception, and touches none of the §4b mandated paths (.claude/rules/**, packages/core/principles/**, EXECUTION-PLAN.md, prior-art-evaluations.md, CLAUDE.md, packages/core/templates/**, .claude/skills/**, agents/**). It changes no rule, principle, template, skill or agent semantics; the kickoff is consumed by an aif worker as a task description and enforces nothing on this repo.

Fidelity verdict

FIDELITY: skipped — this PR authors a stage kickoff; it is not itself a stage deliverable, so there is no kickoff scope and no acceptance package to audit the diff against. The kickoff it adds is what a later fidelity audit will judge BS0's own PR against.

… A (build + in-container gate)

BS0 is the umbrella's STOP-gate: if a Fumadocs static export cannot serve the
route set the docs site depends on, the stack is retired to Starlight (parent D5
falsifier-1). Dispatching it needed a stage kickoff, which did not exist.

Two-leg shape (advisor Decision 2, 2026-09-02). The scratch repo the design names,
`artyhoo/getff-docs-smoke`, does not exist (`gh repo view` -> "Could not resolve to
a Repository"), the aif container has no github.com route, and creating a public
repo under the operator's account is outward-facing. So the stage splits: leg A
(this kickoff) builds the prototype in the landing container and proves it against
a local serve of the export; leg B (host + operator) creates the scratch repo,
transplants `smoke/` as its root, enables Pages and quotes the live gate. Leg A
green is explicitly NOT BS0 green -- the kickoff states that as a binding reporting
rule, so BS0 -> BS1 stays closed until the deployed-URL evidence exists.

Deliverables land only under a new `smoke/` directory, laid out as the future
scratch-repo root so leg B is a lossless copy. `main` is untouched and the branch
never opens a PR against it: the landing repo's Pages is cname-bound to `main:/`
(getff.ai), so a second deployment from that repo would displace production.

Filename is `kickoff-b0.md`, not `kickoff-bs0.md`, so it matches
`^kickoff-[a-z]\d[a-z0-9]*\.md$` (packages/core/principles/kickoff-population.ts:34)
and principle 12's citation gate actually resolves it; the `bs0` form would be read
as a sidecar and skipped silently. The .gitignore exception mirrors the existing
per-umbrella precedents and carries that reason inline.

No bridge-profile marker, deliberately: all three modes on the landing project
resolve to the executor tier per the operator's GLM-only directive (PR #1446), and
the `aif` preset's marker still names the disabled Opus profile.

Verification: principle 12 green (9/9); host-verify opt-out accepted;
check-kickoff-traps exit 0; markdownlint 0 errors; prettier clean;
run-local-ci-sweep -> no gates selected for this diff.

Prior-art: skipped -- dispatch-input documentation only. Adds one stage kickoff and
one .gitignore exception; no new dependency, no code, no new capability under
packages/.
@artyhoo
artyhoo merged commit d813773 into staging Sep 2, 2026
46 checks passed
@artyhoo
artyhoo deleted the claude/epic-rhodes-70b8d3 branch September 2, 2026 03:38
artyhoo added a commit that referenced this pull request Sep 2, 2026
…e the static-export .md trap (#1562)

* fix(beta-docs-showcase): BS0 kickoff — drop the literal profile-marker token from the header

The kickoff added by #1561 could not be dispatched. Its scope comment said, in
prose, that no runtime-profile marker is attached — and spelled the marker token
out to say so. `extractProfileHint` (packages/runtime-bridge/src/kickoff.ts:3,13)
scans the header region (everything before the first `##`) with a lazy regex whose
capture group requires at least one character, so it started at the token, could
not close on the immediately following arrow, and expanded to the end of the scope
comment. Measured:

    bridge-profile hint "-->` marker on purpose — see §6." matched no runtime
    profile. Available: Claude Opus (plan+review), Z.AI GLM-5.3 SDK,
    Qwen3.8-Max-Preview, Z.AI GLM-5.3 Flash (implementer)
    — falling back to ManualBackend

No task was created and no dedup entry was recorded (ManualBackend is deliberately
not deduped), so the retry is clean.

Fix is local to this kickoff: state the intent without naming the token, and record
the trap inline so the next kickoff author does not re-spend it. Verified with the
real parser:

    extractProfileHint(<this file>) -> undefined

Note the kickoff.ts doc comment covers only half of this: it says body prose past
the first `##` is never scanned, "so a kickoff documenting this marker in its
§-sections does not false-positive". True — but a kickoff documenting it in the
HEADER region does false-positive, and the failure is a silent degrade to
ManualBackend rather than an error. Surfaced as an observation, not fixed here:
touching the parser is outside this umbrella's scope (CLAUDE.md PR strategy).

Verification: principle 12 green (9/9); markdownlint 0 errors; prettier clean.

Prior-art: skipped -- one-line correction to a dispatch-input document; no new
dependency, no code change, no new capability under packages/.

* docs(beta-docs-showcase): BS0 kickoff — make the static-export Markdown-twin trap explicit

D4 asked for `/docs/<slug>.md` "as a real file in the export" but did not say why
that phrasing is load-bearing. Fumadocs documents per-page Markdown as a
`next.config` `rewrites()` mapping, and `rewrites()` has no static equivalent —
a Pages host has no rewrite layer — so a worker following the documented recipe
under `output: 'export'` gets nothing in `out/` and discovers it as a silent 404
at gate row 4, after the build.

Name the trap in the kickoff so it is measured deliberately, and restate that an
inability to emit the file physically is a headline finding (R-B1), never a licence
to hand-write the twin. Same discipline the stage already applies to the llms
routes.

Measured by session zen-panini-3ac9cf-c3 while probing this umbrella and relayed at
stand-down; carried here because the dispatch input is where it changes behaviour.

Verification: markdownlint 0 errors; prettier clean; extractProfileHint(<this file>)
-> undefined (still no accidental profile hint after the edit).

Prior-art: skipped -- prose clarification inside one dispatch-input document; no new
dependency, no code change, no new capability under packages/.

---------

Co-authored-by: Test <test@example.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant