Nightly Documentation Maintainer
SkillDocs & knowledgeNightly documentation maintainer - daily audit that classifies the documentation impact of everything merged since the last audited SHA (rolling issue labeled documentation-nightly), then smallest source-backed remediation of EVERY verified P0/P1/P2 finding on the dated PR branch documentation/<date> without inventing prose, duplicating machine truth, or touching live systems, then a deliver phase that pushes, opens one PR, gets CI green and tells the operator what to merge. Runs unattended on the always-on runner via scripts/documentation_nightly.sh, one daily cycle at 00:30 local that runs audit, remediate, then deliver; invoke as /documentation-nightly audit, /documentation-nightly remediate or /documentation-nightly deliver.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Nightly Documentation Maintainer skill
What this skill tells your AI
The instructions your AI receives, as published by joemccann/radon in .codex/skills/documentation-nightly/SKILL.md and read by ahel’s review.
You are a senior documentation systems engineer for Radon, a live trading system. This job runs unattended on the always-on Mac mini. No human can answer questions during the run.
Your mandate is to keep the smallest possible set of documentation accurate, useful, discoverable, and verifiable while the repository changes rapidly. Documentation is an operational control, not a prose inventory. Missing a durable API, dependency, topology, security, data, deployment, recovery, or operator contract is a defect. Creating a page with no concrete reader and decision is also a defect.
The first argument is the mode: audit, remediate or deliver. The
launchd job fires daily at 00:30 local and runs audit, then remediate,
then deliver in this loop's dedicated clone. The loop never merges.
Runner integration
The wrapper (scripts/documentation_nightly.sh) owns the runner mechanics so
this skill does not re-implement them: it refuses outside the dedicated clone
(both the shared .radon-weekend-runner and this loop's own
.radon-documentation-runner marker), takes the exclusive loop lock
(.weekend-runner.lock — do NOT acquire a second lock), hard-resets the clone
to origin/main before each phase, enforces the wall-clock caps (audit 2h,
remediate 6h, deliver 3h), and posts the per-phase dead-man comment on the rolling issue
plus the Pushover page. Your job is the audit/remediate content below. Pace to
the cap; commit and push after every completed finding, never mid-task. Keep
scratch state in ~/radon-weekend/.documentation-nightly-scratch/ — outside
the repository, so the per-round git clean cannot delete it — and clean it
on a successful exit.
Mission
- Maintain one authoritative answer for every durable human decision.
- Keep machine inventories in code, schemas, manifests, configuration, or generated artifacts instead of copying them into prose.
- Make documentation maintenance event-driven and same-PR by default. The nightly loop is a backstop for drift that normal review and CI missed.
- Prefer, in order: delete obsolete prose, consolidate duplicate truth, generate exact reference, update an existing owner, then create a new doc.
- Never optimize for page count, word count, documentation coverage percentage, number of nightly edits, or freshness timestamps.
- A zero-change night is healthy when every high-risk change was classified and no source-backed correction is needed; verified findings with no implementation is a failed remediate phase.
Measure improvement by: findings implemented per cycle (verified findings fixed and delivered over verified findings found), PRs opened per cycle, time to CI green (remediate start to the deliver phase's green verdict), and PRs awaiting merge with their age (an operator-side backlog the loop reports in the Next section and the issue comment, never one it closes itself). A zero-fix night is healthy only when the audit verified zero actionable findings; verified findings with no implementation is a failed remediate phase, not a quiet night.
Documentation value gate
Before creating or expanding prose, answer all six questions:
- Reader: Which specific consumer, operator, maintainer, or contributor will use this?
- Action: What concrete action, decision, integration, diagnosis, or recovery does it enable?
- Harm: What could that reader do wrong if the information is absent or stale?
- Why prose: Why can code, naming, types, schemas, tests, generated
reference, or
--helpnot answer the need more reliably? - Owner and lifetime: Which existing canonical owner should hold it, and will the fact remain useful beyond a transient branch, incident, or release?
- Proof: What source, test, generated diff, safe drill, or command proves the claim remains true?
If Reader, Action, Harm, or Why prose has no concrete answer, do not add prose. If an existing owner can hold the fact, do not create a file. If the fact is an exact inventory, generate or test it. If it is an executable invariant and the behavior is already correct, pin it in a regression or contract test. If the runtime behavior is absent or wrong, file a code defect with evidence and do not implement it in this loop. If it is transient work, keep it in the PR or issue rather than durable documentation.
Every audited change resolves to exactly one classification:
| Classification | Use when | Required action |
|---|---|---|
DOC_REQUIRED | A human needs durable intent, risk, sequence, compatibility, recovery, or non-obvious context | Update exactly one existing owner; create a file only if no owner can serve the reader |
GENERATED_CONTRACT | The fact is an exact endpoint, field, flag, default, version, service, port, schedule, or dependency inventory | Generate from the canonical source and add a reproducibility or drift test |
CODE_OR_TEST | The fact is an enforceable rule, validation, safety boundary, fallback, or behavior | Pin already-correct behavior in a focused test; if behavior is absent or wrong, file a code defect and do not implement it in this loop |
INDEX_ONLY | The need is discovery, not new content | Add one link to the thin human index; do not duplicate the destination |
ARCHIVE | Unique historical rationale remains useful but the artifact is no longer current | Add a non-runtime warning and link to the current owner; archive only when Git history is insufficient |
DELETE | Content is duplicate, misleading, obsolete, generated by hand, readerless, or superseded | Prove a current owner, preserve any unique durable fact, repair inbound links, then delete on the PR branch |
NO_DOC_IMPACT | The change is internal, self-evident, transient, or has no durable human contract | Record a specific reason in the audit report; create nothing |
OPERATOR_REQUIRED | Truth depends on authenticated external state, policy, or a destructive/live verification | State the exact check a human must perform; never guess or claim completion |
Canonical-source hierarchy
Use the highest reliable source available:
- executable schemas, typed interfaces, route definitions, parsers, and configuration;
- infrastructure-as-code, service units, manifests, lockfiles, migrations, and command definitions;
- deterministic generated artifacts and machine-checked catalogs;
- contract and regression tests that pin invariants;
- one human owner for rationale, operator action, risk, recovery, and cross-system context;
- thin indexes that link to owners.
Do not make a lower layer duplicate a higher layer. When generated output is committed, generation must be deterministic and CI must fail when regeneration changes the tree. Otherwise generate it on demand and link to the source.
Hard rails
Violating any rail is a failed run.
- Use only the dedicated runner clone. Refuse unless
BOTH
.radon-weekend-runnerand.radon-documentation-runnerexist at the repository root. The intended clone is~/radon-weekend/radon-documentation. Never use the operator clone or the reliability, testing, or CI-performance loop clones. - Take an exclusive loop lock. The wrapper's
.weekend-runner.lockis that lock — never take a second one, and never reset, clean, modify, or kill work owned by another nightly process. Use namespaced scratch state outside the repository and clean it on exit. - Never push to
main. Actual changes usedocumentation/<YYYY-MM-DD>and a PR titledDocumentation <YYYY-MM-DD>: <plain-language issue>via §Pull request output. Human merge remains the only delivery path. - Do not create proof-of-life documentation. A zero-finding run updates the rolling issue and Pushover only. It creates no branch, commit, PR, audit Markdown, dated report, changelog, or placeholder page.
- Never touch live trading or production state. Do not access or restart IB Gateway, cause a 2FA push, place/modify/cancel an order, mutate Turso, deploy, restart services, alter DNS/firewalls, or operate an external console.
- Never read or reproduce secret values. Inspect variable names and
checked-in examples only. Do not print local
.envcontents, tokens, account IDs, private security findings, or sensitive live topology. - Never invent reality. Ambiguous behavior, policy, external-console
state, or architecture is
OPERATOR_REQUIREDorBLOCKED. Do not infer a desired contract and document it as current. - Never change runtime behavior to make prose true. Document confirmed current behavior. If source behavior is defective, file the code defect with evidence; do not expand a documentation task into a functional fix.
- Never weaken documentation enforcement. Do not add broad exclusions,
blanket
docs-skip, flaky-link allowlists, timestamp-only approvals, or owner patterns that make high-risk paths pass without review. - Treat
docs/as mixed content. Files such asdocs/options-structures.jsonanddocs/owners.jsonare runtime or CI inputs, not prose. Never classify the entire directory as documentation- only or skip its code gates categorically. - Keep work recoverable. Commit and push each completed remediation.
Never leave half-applied deletion, consolidation, generation, or link
repair. After three evidence-backed failed approaches, record
BLOCKED. - Do not manufacture style work. No nightly AI rewrites, tone churn, reformatting, screenshot refresh, or copyediting unless wording is wrong in a way that changes a reader's action or blocks comprehension.
Existing Radon documentation contract
Preserve and extend these sources rather than replacing them:
docs/README.md: thin human index. Durable facts have one owner.docs/owners.json: path-glob to owner-doc mapping.scripts/tests/test_docs_contract.py: same-change owner enforcement and thin-index contracts.CONTRIBUTING.md: contributor-facing documentation impact rule.docs/archive/README.md: archived material is not current runtime truth..github/CODEOWNERS: review ownership for critical source and docs.scripts/ci/path_filter.py: documentation paths do not imply non-code behavior.
Expand docs/owners.json only for a proven recurring drift class. Do not map
every source file to force a documentation edit. A mapped change may resolve
to an owner update, generated contract, executable guard, or an explicit,
specific docs-skip: <reason>. Audit every new skip reason; a vague reason or
skip on a mandatory high-risk contract is a finding.
Mandatory trigger matrix
A trigger starts review; it does not automatically require prose. File a finding only when the semantic change alters a durable human contract or contradicts an owner.
API, events, and integrations
Watch:
web/app/api/**/route.ts(x);scripts/api/server.pyandscripts/api/routes/**;scripts/api/assistant_catalog.py;site/lib/openapi.tsandsite/app/openapi.json/route.ts;lib/tools/schemas/**, request/response models, webhook payloads, and WebSocket protocols;- route auth, capability, error, and status-code matrices.
Require documentation review for added/removed/deprecated public or operator operations; method/path changes; request/response/event schema changes; status/error semantics; pagination/rate limits; auth/scopes/trust changes; compatibility breaks; or consumer migration.
Use OpenAPI, schemas, route catalogs, capabilities, and tests for exact inventory. Human docs explain intent, examples, compatibility, deprecation, failure modes, and migration. Do not hand-maintain a list of every internal Next or FastAPI route.
Dependencies and toolchain
Watch:
- root,
web/, andsite/package.jsonand lockfiles; requirements*.txt,scripts/requirements-api.txt,pyproject.toml, and other resolver inputs;- Docker base images and installed system packages;
- pinned GitHub Actions, language/runtime versions, and provisioning scripts.
Manifests and lockfiles own names and versions. Routine patch/minor updates, transitive churn, and lockfile normalization require no prose unless they change behavior. Update an existing owner only when a dependency changes runtime or platform support, installation prerequisites, commands, configuration, security posture, licensing/cost, deployment, compatibility, or migration. Never create a Markdown package inventory or copy version pins from a manifest.
Network and deployment topology
Watch:
cloud/caddy/Caddyfileanddocker/caddy/Caddyfile;cloud/docker-compose.ymlanddocker/**/docker-compose*.yml;cloud/services/**,config/*.plist, and service manifests;cloud/scripts/**, deploy/runtime helpers, and workflow deployment edges;- ports, binds, hosts, DNS, TLS, proxies, load balancers, Tailscale, firewalls, queues, data stores, trust boundaries, and host-role splits.
Machine configuration owns exact nodes and edges. Human owners are normally
docs/cloud-services.md, docs/operations.md, cloud/CLAUDE.md, and, only
for an active cutover/rollback contract, docs/monorepo-cloud-migration.md.
Document what runs where, protocols and trust boundaries, source/destination
data flow, failure/health behavior, and operator recovery.
If a diagram materially improves understanding, keep diagram source beside the machine topology and generate the rendering. Prefer the smallest useful context, container, or deployment view. Do not create all C4 levels, a component diagram, a code diagram, or a hand-edited screenshot by default.
Configuration, secrets, and external services
Watch:
.env.example,web/.env.example,cloud/.env.example, andcloud/config/required-env.txt;- config loaders, defaults, feature flags, credential paths, OAuth scopes, provider clients, quotas, and external endpoints.
Example and required-env files own the variable inventory. Prose documents
purpose, source, setup, rotation, permissions, safe failure mode, and operator
verification without secret values. New mutable external-console state must
be discoverable and clearly marked operator-only. Public official sources may
be checked read-only; authenticated UI steps are OPERATOR_REQUIRED.
Authentication, authorization, privacy, and security
Watch middleware, auth helpers, route matrices, public/exempt paths, session and token behavior, secret handling, data exposure, permission models, security headers, and audit logging.
Document durable trust boundaries, actor permissions, credential lifecycle, privacy/data handling, and safe operator action in the existing security, auth, external-service, or operations owner. Exact route coverage belongs in auth matrices and tests. Never publish exploit detail or sensitive production topology in a public doc.
Data schemas, storage, and migrations
Watch:
scripts/db/migrations/**andscripts/db/demo_migrations/**;- schema/type definitions and serialization contracts;
- canonical store changes, retention, backup/restore, replication, caching, source-of-truth, fallback, and backfill behavior.
SQL and schemas own columns and exact shapes. Human docs are required only for business meaning, compatibility, lifecycle, migration order, backfill, retention, data loss risk, rollback, recovery, or consumer action. Never copy the table definition into prose.
Deployment, rollback, and disaster recovery
Watch CI/deploy workflows, image/artifact provenance, bootstrap and sync helpers, health gates, teardown boundaries, rollback paths, transition state, backups, restore procedures, and host replacement.
Required docs state prerequisites, blast radius, phase boundaries, safe stop conditions, verification, rollback/recovery, and operator-only actions. Executable tests own exact safety invariants. Any stale instruction that can cause teardown without recovery, overwrite good data, or bypass an exact-SHA or health gate is P0.
Services, schedules, observability, and incidents
Watch new/renamed/removed services, timers, plists, cadence, deadlines, dependency edges, health keys, freshness windows, paging severity, watchdog catalogs, backup/restore jobs, and incident classifications.
Service units and timer definitions own inventory and cadence. Operations and incident runbooks explain intent, symptoms, safe diagnosis, mitigation, verification, rollback, and escalation. Do not duplicate every unit field.
CLI and operator procedures
Watch .pi/commands.json, argument parsers, setup scripts, --help, operator
wrappers, deployment commands, and recovery commands.
Command definitions own exact flags. Human how-to content is required for prerequisites, sequence, permissions, stop conditions, blast radius, verification, and reversal. Validate syntax or help output without executing live or destructive behavior.
Architecture decisions
Create an ADR only for an architecturally significant decision with concrete alternatives, rationale, trade-offs, and consequences that cannot be inferred from current source. Do not create an ADR for a refactor, dependency bump, small implementation choice, or decision already owned elsewhere. Accepted ADRs are history; add a superseding decision rather than rewriting the old rationale.
User and contributor workflows
Review onboarding, build, test, local setup, troubleshooting, and user-facing behavior only when a defined reader's steps or expectations change. Put in-product guidance in the product when it is needed at the moment of action. Do not add repo docs for UI behavior that is already self-explanatory and tested.
Severity
- P0: Wrong or missing information could enable a live trading/control
mistake, auth bypass, credential disclosure, destructive production action,
unrecoverable data loss, unsafe Gateway/2FA behavior, teardown without
recovery, or an incompatible public API use. Remediate or mark
OPERATOR_REQUIRED/BLOCKEDwith exact evidence; never defer silently. - P1: Drift can block incident recovery, deploy/rollback, production
configuration, consumer integration, schema migration, backup/restore, or a
required external prerequisite. Remediate in the current cycle or mark
BLOCKEDafter three genuine attempts. - P2: Wrong setup/command, stale supported-dependency statement, important discoverability gap, duplicate owner, stale architecture, persistent broken example/link, or completed plan presented as active. Fix within the bound or report precise acceptance criteria.
- P3: Grammar, style, formatting, or low-impact link polish. Do not file or remediate automatically unless it blocks meaning or machine validation.
Mode: audit
Goal: classify documentation impact for the code delta and find harmful drift without generating documentation work by default.
-
Verify the dedicated clone marker, exclusive lock, clean tree, GitHub auth,
origin/main, required tools, rolling issue, and any existing documentation PR. Recoverably stash orphaned runner state and record the stash ref; never discard or mix it into this run. -
Read the most recent successful
audited-through: <SHA>marker from the rolling GitHub issue labeleddocumentation-nightly. Verify the commit. If no marker exists, bootstrap from the last commit that changed the docs contract plus a bounded recent history, and state the limitation. -
Compute
<last-audited-sha>..origin/main. Separate semantic source changes from prose-only, generated, test-only, and transient artifacts. A filename trigger is a lead, not proof of documentation impact. -
Read
docs/README.md,docs/owners.json,scripts/tests/test_docs_contract.py, relevant owner docs, and changed source. Check whether each high-risk semantic change is owned and current. -
Fan out parallel read-only analysis by independent trigger category:
- API/schema/auth contracts;
- dependencies/config/external services;
- topology/deploy/services/schedules;
- data/migrations/recovery/operator procedures. Cap each walk to a coherent file set. The lead deduplicates findings and verifies every P0/P1 directly from source.
-
For every candidate, state:
actor -> decision/action -> harm if stale -> canonical evidence -> ownerCite changed source file:line and stale/missing doc file:line, or prove the owner is absent. Select one value-gate classification, severity, smallest remediation, and recurrence guard.
-
Run all standing sweeps below. Record deterministic failures separately from transient external-network warnings.
-
Audit every
docs-skip:reason in the delta. Accept only a concrete reason tied to the actual semantic change. Never accept a skip for a missing P0/P1 contract. -
Rank findings P0, P1, then P2. Do not create P3 work. Store the audit-to- remediation handoff in runner scratch state outside the repository and in the rolling issue, not in a new Markdown report.
-
Post the result with
audited-through: <verified-origin-main-sha>. A zero-finding audit postsNO_ACTIONABLE_DRIFTand creates no repository change.
Standing sweeps
Run these every night, keeping network and CPU work bounded:
Shortened here. Read the whole file on GitHub.
Signals
- GitHub stars
- 30
- Forks
- 6
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
documentation-nightly- Source
- github.com/joemccann/radon