docs+agents: reconcile with the 2026-09 release and modernize the agent surface - #33
Merged
Merged
Conversation
The first production release is complete, so the documentation that still described it as pending is now wrong. Reconcile the source-of-truth files against the observed provider state and drop the intermediate-state language. - status.md: release, stats projection and RLS actions closed; action 8 rewritten to the remaining legacy Worker boundary; new actions 16 and 17 for the Cloudflare token scope and the expiring Supabase CLI credential; readbacks replaced by current subjects, superseded rows dropped. - cloudflare.md: Pages removed as an origin and as a rollback path; the completed cutover runbook replaced by the platform constraints that stay true; live checks narrowed to the zone-route gap the scoped token cannot read; the zone redirects recorded for the first time. - roadmap.md: section 1 reordered around the work the release did not close; the Pages/OpenTofu field-boundary bullet retargeted at the surfaces that actually overlap now. - project.yaml, AGENTS.md, organization-alignment.md: phase, cutover and Worker-classification statements brought into line. - architecture/README.md: record the is_game_participant RLS-recursion invariant, which existed only in a migration header. - ws proxies: the frontend is the dicee-web Worker, not Pages. No infrastructure was touched. Live claims trace to operator readbacks; counts, names and HTTP status only. pnpm lint green (rust, analysis, biome, akg, cf:audit, scripts, docs).
…s hazard Three rules existed only as gate code with no stated reason, so a future reader could not tell a deliberate constraint from an accident. - Say why lint:docs refuses a hooks key and tracked command/hook files: it is an anti-regrowth ratchet from the 2026-09-13 cleanup, not a claim that the features are useless, and Claude agent and rule directories are deliberately outside it. - Warn against enableAllProjectMcpServers. It enables every .mcp.json entry including the opt-in OAuth servers, and the gate cannot catch it because it reads only the shared settings file. - Note that the skill front-matter fields and the 60-line cap are enforced.
…lchain One repository contract, thin client adapters, no repo-wide model pinning, and a check that catches drift in the places the docs gate structurally cannot see. Boundaries encoded rather than described: - .claude/settings.json denies mcp__supabase__execute_sql and mcp__supabase__apply_migration. Deny outranks allow from any settings file, so the prohibition now survives a local override. - .codex/rules/dicee.rules no longer auto-allows linked-project Supabase writes. Read-only inspection stays allow; db push/pull/dump/reset, migration repair/up/apply, link, login, secrets, functions deploy/delete, gen types, pnpm db:types and op read/item are prompt. Destructive Git stays forbidden. op item was added because it reaches the same credential as op read. Drift detection: - scripts/agent-doctor.mjs, dependency-free and in the house style. Committed checks run in CI; local checks run only when the file or client exists, so an absent ignored file can never fail CI. It is what would have caught the enableAllProjectMcpServers hole and the AKG launcher drift below. Completions rather than transitional states: - Infisical is out: launcher, metadata names, credential checks, wrapper tests and command-policy rules deleted, tracked references down from 15 files to 8, each one a deliberate guard or a retirement note. A retired-token entry in the docs gate keeps the remainder visible and shrinking. - The dead Cloudflare Pages permission and policy entries are gone. - check-1password-setup.sh no longer fails closed on display-only identifiers. Consistency: - Every client launches the AKG MCP server through mise, so it runs on the pinned Bun rather than whatever is first on that client's PATH. - agent-clients.md records supported minimums instead of pinning patch releases, corrects the Codex rules description, and adds model guidance as guidance. pnpm lint green. agent-doctor: 0 errors. 40 doctor fixtures pass.
Yesterday three client versions were hand-written into a Markdown table. One day later Codex had moved 0.147.0-alpha.6.4 -> 0.155.0-alpha.2.5 and the line saying "the 0.155 series is prerelease and is not a target" was already wrong. Prose is the wrong storage for a number that moves weekly. Versions become data: - scripts/agent-doctor.config.json holds one entry per client: the supported minimum and whether a prerelease channel is deliberate. agent-clients.md now carries no version number at all and points at that file. - The CLIENT rule compares the installed build against the minimum instead of only reporting it, and understands each client's spelling of --version (2.1.273 (Claude Code), codex-cli 0.155.0-alpha.2.5, 1.137.0). A minimum is a floor, not a mirror: a patch release is not a reason to edit the file. The binary becomes the schema: - Codex 0.155 rejects an unknown config key rather than ignoring it, verified empirically, and accepts agents.max_depth which its published reference omits. So the new CODEX rule asks the installed Codex whether this repository's configuration loads rather than keeping a copy of the schema in the gate. It reports honestly that Codex reads .codex/ only for a trusted project. Codex config: - Both [agents] keys confirmed still valid on 0.155. - akg gets startup_timeout_sec: mise exec may resolve the pinned Bun on a cold checkout and exceed the default allowance. Confirmed applied via codex mcp get. - The header records the vendor's own project-scope rule, which enforces the same personal/project split the file already asked for. Also: the sharpened PERSONAL rule caught three more machine-specific absolute paths in the ignored local settings; they now name commands on PATH. pnpm lint exit 0. 40 doctor fixtures, 31 self-test cases, codex rules test green.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Two related workstreams: reconcile the documentation with the completed 2026-09 production release, then tighten the agent-client configuration that the reconciliation exposed as drifting.
Part 1 — documentation reconciliation
Every document still described the release as pending.
docs/status.md— actions 3, 5, 6 and 7 closed; action 8 rewritten to the remaining legacy-Worker boundary with the gamelobby-first sequence and the required dashboard route read; new actions 16 (Cloudflare token scope) and 17 (expiring Supabase CLI credential); readback rows replaced rather than appended. 73/80 lines.docs/cloudflare.md— Pages removed as an origin and as a rollback path. The completed five-step cutover runbook is gone; the platform constraints that stay true were kept. "Live checks still needed" narrowed to the one genuinely unknown surface: zone-level Worker routes, which the scoped credential cannot read (HTTP 403).docs/roadmap.md— section 1 reordered around unfinished work; the Pages/OpenTofu field-boundary bullet retargeted at surfaces that still exist.AGENTS.md,project.yaml,organization-alignment.md,architecture/README.md, two ws proxies — phase, cutover and Worker-classification statements aligned; theis_game_participantRLS-recursion invariant recorded; two file headers no longer claim a Pages frontend.Two durable facts were recorded that existed nowhere in the repository: the legacy aliases redirect from
jefahnierocks.com, a second zone, and the RLS invariant.Four drafted statements were corrected before landing: an invented precise timestamp (now date-only, the precision the evidence supports); a claim the full post-deploy smoke was green (only routing, headers and the lobby REST path were evidenced — the browser-side items are now listed as still owed); a retained "the Worker had likely never persisted a game" contradicting the one completed game; and a live-state claim placed in the file that forbids them.
Part 2 — agent-client configuration
Boundaries encoded rather than described.
.claude/settings.jsonnow deniesmcp__supabase__execute_sqlandmcp__supabase__apply_migration; deny outranks allow from any settings file, so the prohibition survives a local override..codex/rules/dicee.rulesno longer auto-allows linked-project Supabase writes — read-only inspection staysallow, whiledb push/pull/dump/reset,migration repair/up/apply,link,login,secrets,functions deploy/delete,gen types,pnpm db:typesandop read/op itemareprompt. Destructive Git staysforbidden.op itemwas added because it reaches the same credential asop read.Drift detection. New
pnpm agent:doctor(scripts/agent-doctor.mjs), dependency-free and in the house style. Committed checks run in CI; local checks run only when the file or client exists, so an absent ignored file can never fail CI. This closes the blind spot that let.claude/settings.local.jsonsetenableAllProjectMcpServers: trueand pre-allow mutating Supabase MCP tools whilelint:docsstayed green —check-docs.mjsfixes its file set togit ls-filesand hardcodes the shared settings path.Completions rather than transitional states. Infisical is out: launcher, metadata names, credential checks, wrapper tests and command-policy rules deleted. Tracked references drop from 15 files to 8, each a deliberate guard or a retirement note, and a new retired-token entry keeps the remainder visible and shrinking.
check-1password-setup.shpreviously failed closed on six retired Infisical fields before reaching the Cloudflare check; it no longer does, and display-only identifiers no longer gate the credential report. The dead Cloudflare Pages permission and policy entries are gone.Consistency. Every client now launches the AKG MCP server through
mise, so it runs on the pinned Bun rather than whatever is first on that client's PATH.agent-clients.mdrecords supported minimums (VS Code 1.137, Claude Code 2.1.272 stable, Codex 0.154.0) instead of pinning patch releases, corrects the Codex rules description, and adds model selection as guidance only — nomodelormaxEffortLevelin repository config.Validation
pnpm lintexit 0 across all eight lanes,agent-doctor0 errors, 40 doctor fixtures pass,check-docs0 findings across 647 files,git diff --checkclean. Pre-pushvalidate-cigreen on both pushes.Risks and what is not included
.vscode/settings.jsoncarries an unrelated local modification, deliberately excluded..windsurf/,.codex/workflows/,.claude/AGENT-CONFIGURATION-SUMMARY.md,.codex/rules/core-guardrails.md) are triaged DELETE OUTRIGHT with nothing to fold in, but remain on disk — removing never-tracked files is irreversible and was left to the owner.agent:doctorwarns about it.supabase db reset --localnow prompts: a prefix rule cannot distinguish--localfrom--linkedat that token position, and a destructive reset defaults to the safer decision. Documented as known friction.