Skip to content

Move the documentation site to CTRLRun/ctrlrun-docs - #133

Merged
arpanghoshal merged 1 commit into
mainfrom
split/docs-to-own-repo
Sep 9, 2026
Merged

Move the documentation site to CTRLRun/ctrlrun-docs#133
arpanghoshal merged 1 commit into
mainfrom
split/docs-to-own-repo

Conversation

@arpanghoshal

@arpanghoshal arpanghoshal commented Sep 9, 2026

Copy link
Copy Markdown
Member

A clone of this repository was 529 files and more than half of them were the website: 163
pages, the Mintlify configuration, the renderers, the browser demos and the Vercel function
behind the site's form. The sdist carried them too, video included.

They are CTRLRun/ctrlrun-docs now, with their
history. This repository keeps the library, its specifications, its README assets and its
tests.

before after
tracked files 529 290
docs/ the site, the specs, the assets the specs and the README assets
sdist 2.9M 1.4M
pip install ctrlrun pyyaml, click pyyaml, click

What did not move

The guarantee that a page describes the shipped library. Every check that needs both trees
runs in the other repository, which resolves a checkout of this one from $CTRLRUN_SOURCE
or ../ctrlrun and raises when there is none — a check that cannot find the code is a
red run, never a green one that verified nothing. This repository's CI runs those checks
from there against the commit being proposed, so a change here that makes a page wrong is
red on its own pull request, and there is one implementation of every rule rather than two
that drift.

Five test files split rather than moved

Each along a line that was already there:

File Keeps Goes
test_cookbook.py the three that only run examples/cookbook/ the three that need the pages
test_packaging.py the dependency rule four that read CLAIMS.md or adapters.md
test_release_v0_6.py T181, the packaging half T180, whose five documents span both repos
test_verify_action.py the composite action's 27 tests the six that read verify.md
test_readme_assets.py what this repository ships the comparison with the site's copies

Four of those tests had begun skipping rather than failing once the pages moved: each
guarded its read with pytest.skip("no repository checkout"), written for an sdist where the
pages are pruned, which after the move read as "nothing to check". They fail on a missing page
now, in the repository that has one. The suite's skip count and every skip reason are back to
exactly what they were before this change: 47, all Postgres or an uninstalled adapter.

Other changes

  • The test-count badge is written in the docs job, which needs: check. That is a stronger
    ordering than the two steps in one job it replaces: a step's order is a convention, needs:
    is enforced. badge gained docs as an upstream because that is where the artifact is
    produced now.
  • notify-docs tells the other repository the library changed. It needs a
    DOCS_DISPATCH_TOKEN secret
    ; until that is set the step warns and does nothing, and the
    backstop is that repository's weekly scheduled run.
  • griffe leaves the dev extra with the reference generator that needed it.
  • The socket guard that test_examples.py and test_cookbook.py had each written for
    themselves is one definition in tests/conftest.py.

Verification

Both suites run from a fresh clone, not the working tree:

  • library: 2824 passed, 47 skipped; ruff format --check, ruff check, mypy --strict src clean
  • documentation: 1628 passed, with ../ctrlrun found by the sibling default
  • sdist contains no .mdx, no docs/docs/, no docs_audit, no website-form
  • ctrlrun verify still reports 11/11 and 6/6 with 5 N/A
  • ctrlrun demo runs in 0.1s with no network

One thing this cannot do

The Mintlify content directory is still /docs in this repository. It has to be repointed at
the other repository's root, once, in the Mintlify dashboard, or the site keeps building from
a directory with no pages left in it.

A clone of this repository was 529 files and more than half of them were the website:
163 pages, the Mintlify configuration, the renderers, the browser demos and the Vercel
function behind the site's form. The sdist carried them too, video included. They are
CTRLRun/ctrlrun-docs now, with their history; this repository keeps the library, its
specifications, its README assets and its tests. 529 files becomes 291, and the sdist
2.9M becomes 1.4M.

`pip install ctrlrun` is unchanged: pyyaml and click, and nothing else. `griffe` leaves
the dev extra with the reference generator that needed it.

What did not move is the guarantee that a page describes the shipped library. Every check
that needs both trees runs in the other repository, which resolves a checkout of this one
from $CTRLRUN_SOURCE and **raises** when there is none, and this repository's CI runs those
checks from there against the commit being proposed -- the `docs` job. So a change here
that makes a page wrong is red on this repository's own pull request, and there is still
one implementation of every rule rather than two that drift.

Five test files were split rather than moved, each along a line that was already there:

- `test_cookbook.py` keeps the three tests that only run `examples/cookbook/`;
- `test_packaging.py` keeps the dependency rule and loses four tests that read a page;
- `test_release_v0_6.py` keeps T181, the packaging half, and T180 goes where it can read
  all five documents it scans;
- `test_verify_action.py` keeps the composite action's twenty-seven tests;
- `test_readme_assets.py` keeps what this repository ships and loses the comparison with
  the site's copies of it.

**Four of those tests had begun skipping rather than failing** once the pages moved: each
guarded its read with `pytest.skip("no repository checkout")`, written for an sdist where
the pages are pruned, which after the move read as "nothing to check". They fail on a
missing page now, in the repository that has one. The suite's skip count and every skip
reason are back to exactly what they were before this change.

The test-count badge is written in the `docs` job, which `needs: check` -- a stronger
ordering than the two steps in one job it replaces, because a step's order is a convention
and `needs:` is enforced.

`notify-docs` needs a DOCS_DISPATCH_TOKEN secret to tell the other repository that the
library changed. Until it is set the step warns and does nothing, and the backstop is that
repository's weekly scheduled run.

The network guard that `test_examples.py` and `test_cookbook.py` had each written for
themselves is one definition in `tests/conftest.py` now.
@mintlify

mintlify Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
ctrlrun 🔴 Failed Sep 9, 2026, 3:57 PM

💡 Tip: Enable Automations to automatically generate PRs for you.

@coderabbitai

coderabbitai Bot commented Sep 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 295 files, which is 195 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 9b7b4ea0-697a-4dec-9d49-609304be6675

📥 Commits

Reviewing files that changed from the base of the PR and between 637c699 and d39a990.

⛔ Files ignored due to path filters (15)
  • docs/generated/badges.readme.md is excluded by !**/generated/**
  • docs/generated/capabilities.mdx is excluded by !**/generated/**
  • docs/generated/capabilities.readme.md is excluded by !**/generated/**
  • docs/generated/capabilities.txt is excluded by !**/generated/**
  • docs/generated/readiness.full.mdx is excluded by !**/generated/**
  • docs/generated/readiness.json is excluded by !**/generated/**
  • docs/generated/readiness.mdx is excluded by !**/generated/**
  • docs/generated/readiness.readme.md is excluded by !**/generated/**
  • docs/images/demo-poster.jpg is excluded by !**/*.jpg
  • docs/images/demo.mp4 is excluded by !**/*.mp4
  • docs/images/favicon.svg is excluded by !**/*.svg
  • docs/images/social-preview.png is excluded by !**/*.png
  • docs/images/wordmark-dark.svg is excluded by !**/*.svg
  • docs/images/wordmark-light.svg is excluded by !**/*.svg
  • docs/images/wordmark.svg is excluded by !**/*.svg
📒 Files selected for processing (295)
  • .github/ISSUE_TEMPLATE/bug.yml
  • .github/ISSUE_TEMPLATE/feature.yml
  • .github/PULL_REQUEST_TEMPLATE.md
  • .github/workflows/ci.yml
  • CONTRIBUTING.md
  • MANIFEST.in
  • README.md
  • SECURITY.md
  • VISION.md
  • action.yml
  • docs/.mintignore
  • docs/IA.md
  • docs/README.md
  • docs/SEO.md
  • docs/STYLE.md
  • docs/assets/browser-demo.verified.json
  • docs/assets/verify-browser-demo.mjs
  • docs/assets/verify-browser-wiring.mjs
  • docs/assets/verify-medical-workbench.cjs
  • docs/assets/verify-website.cjs
  • docs/capabilities.yaml
  • docs/docs.json
  • docs/docs.mdx
  • docs/docs/ACS.md
  • docs/docs/ARCHITECTURE.md
  • docs/docs/CLAIMS.md
  • docs/docs/OWASP-AGENTIC-TOP10.md
  • docs/docs/ROADMAP.md
  • docs/docs/THREAT_MODEL.md
  • docs/docs/adapters.md
  • docs/docs/architecture/specifications.mdx
  • docs/docs/authority.md
  • docs/docs/compare/durable-workflows.mdx
  • docs/docs/compare/framework-hitl.mdx
  • docs/docs/compare/governance-toolkits.mdx
  • docs/docs/compare/guardrail-libraries.mdx
  • docs/docs/compare/idempotency-keys.mdx
  • docs/docs/concepts/action-and-hash.mdx
  • docs/docs/concepts/approval-binding.mdx
  • docs/docs/concepts/authority-and-delegation.mdx
  • docs/docs/concepts/decisions.mdx
  • docs/docs/concepts/effect-keys.mdx
  • docs/docs/concepts/fail-closed.mdx
  • docs/docs/concepts/observe-mode.mdx
  • docs/docs/concepts/outcomes-and-ambiguous.mdx
  • docs/docs/concepts/receipts-and-evidence.mdx
  • docs/docs/cookbook/credential-rotation-agent.mdx
  • docs/docs/cookbook/crm-update-agent.mdx
  • docs/docs/cookbook/customer-notification-agent.mdx
  • docs/docs/cookbook/data-deletion-agent.mdx
  • docs/docs/cookbook/database-migration-agent.mdx
  • docs/docs/cookbook/deploy-agent.mdx
  • docs/docs/cookbook/iam-agent.mdx
  • docs/docs/cookbook/index.mdx
  • docs/docs/cookbook/langgraph-interrupt.mdx
  • docs/docs/cookbook/manager-and-worker.mdx
  • docs/docs/cookbook/observe-then-enforce.mdx
  • docs/docs/cookbook/openai-agents-tool-approval.mdx
  • docs/docs/cookbook/outbound-email-agent.mdx
  • docs/docs/cookbook/payout-maker-checker.mdx
  • docs/docs/cookbook/protect-an-mcp-server.mdx
  • docs/docs/cookbook/receipts-to-opentelemetry.mdx
  • docs/docs/cookbook/reconcile-against-the-remote.mdx
  • docs/docs/cookbook/refund-agent.mdx
  • docs/docs/cookbook/resolve-an-ambiguous-effect.mdx
  • docs/docs/cookbook/slack-approvals.mdx
  • docs/docs/cookbook/sqlite-to-postgres.mdx
  • docs/docs/cookbook/verify-in-github-actions.mdx
  • docs/docs/demos/index.mdx
  • docs/docs/demos/medical-affairs.mdx
  • docs/docs/faq.mdx
  • docs/docs/get-started/choosing.mdx
  • docs/docs/get-started/install.mdx
  • docs/docs/get-started/quickstart.mdx
  • docs/docs/get-started/three-ways-in.mdx
  • docs/docs/guides/approvals-in-slack.mdx
  • docs/docs/guides/export-to-opentelemetry.mdx
  • docs/docs/guides/gateway-in-front-of-mcp.mdx
  • docs/docs/guides/langgraph-adapter.mdx
  • docs/docs/guides/observe-to-enforce.mdx
  • docs/docs/guides/openai-agents-adapter.mdx
  • docs/docs/guides/protect-a-function.mdx
  • docs/docs/guides/reconcile-automatically.mdx
  • docs/docs/guides/resolve-an-ambiguous-effect.mdx
  • docs/docs/guides/run-on-postgres.mdx
  • docs/docs/guides/verify-in-ci.mdx
  • docs/docs/how-this-is-built.md
  • docs/docs/mcp/approve-from-your-assistant.mdx
  • docs/docs/mcp/gateway-in-5-minutes.mdx
  • docs/docs/mcp/overview.mdx
  • docs/docs/mcp/use-the-docs-from-your-editor.mdx
  • docs/docs/not-only-agents.mdx
  • docs/docs/postgres.md
  • docs/docs/production/how-reservation-works.mdx
  • docs/docs/production/index.mdx
  • docs/docs/production/migrations.mdx
  • docs/docs/production/operations.mdx
  • docs/docs/production/postgres.mdx
  • docs/docs/production/receipt-integrity.mdx
  • docs/docs/production/recovery.mdx
  • docs/docs/production/soak.mdx
  • docs/docs/reference/api/Action.mdx
  • docs/docs/reference/api/ActionDenied.mdx
  • docs/docs/reference/api/AmbiguousEffect.mdx
  • docs/docs/reference/api/Approval.mdx
  • docs/docs/reference/api/ApprovalAnswer.mdx
  • docs/docs/reference/api/ApprovalMismatch.mdx
  • docs/docs/reference/api/ApprovalProvider.mdx
  • docs/docs/reference/api/ApprovalRequest.mdx
  • docs/docs/reference/api/ApprovalRequired.mdx
  • docs/docs/reference/api/ApprovalTimeout.mdx
  • docs/docs/reference/api/Authority.mdx
  • docs/docs/reference/api/AuthorityDenied.mdx
  • docs/docs/reference/api/AuthorityEscalation.mdx
  • docs/docs/reference/api/AuthorityResult.mdx
  • docs/docs/reference/api/CTRLRunError.mdx
  • docs/docs/reference/api/Condition.mdx
  • docs/docs/reference/api/Control.mdx
  • docs/docs/reference/api/Decision.mdx
  • docs/docs/reference/api/Delegation.mdx
  • docs/docs/reference/api/DelegationRecord.mdx
  • docs/docs/reference/api/DuplicateEffect.mdx
  • docs/docs/reference/api/EffectKeyError.mdx
  • docs/docs/reference/api/EffectRecord.mdx
  • docs/docs/reference/api/EffectState.mdx
  • docs/docs/reference/api/Event.mdx
  • docs/docs/reference/api/EventSink.mdx
  • docs/docs/reference/api/FrameworkInterrupt.mdx
  • docs/docs/reference/api/Grant.mdx
  • docs/docs/reference/api/HeaderIdentityProvider.mdx
  • docs/docs/reference/api/IdentityContext.mdx
  • docs/docs/reference/api/IdentityError.mdx
  • docs/docs/reference/api/IdentityProvider.mdx
  • docs/docs/reference/api/InMemoryStateStore.mdx
  • docs/docs/reference/api/InterruptApprovalProvider.mdx
  • docs/docs/reference/api/InvalidArgument.mdx
  • docs/docs/reference/api/JSONLEventSink.mdx
  • docs/docs/reference/api/LocalApprovalProvider.mdx
  • docs/docs/reference/api/MissingDependency.mdx
  • docs/docs/reference/api/NotExecuted.mdx
  • docs/docs/reference/api/PendingApproval.mdx
  • docs/docs/reference/api/Policy.mdx
  • docs/docs/reference/api/PolicyError.mdx
  • docs/docs/reference/api/Principal.mdx
  • docs/docs/reference/api/Receipt.mdx
  • docs/docs/reference/api/ReconcileOutcome.mdx
  • docs/docs/reference/api/SQLiteStateStore.mdx
  • docs/docs/reference/api/SchemaMismatch.mdx
  • docs/docs/reference/api/ScriptedApprovalProvider.mdx
  • docs/docs/reference/api/StateStore.mdx
  • docs/docs/reference/api/StaticIdentityProvider.mdx
  • docs/docs/reference/api/Subject.mdx
  • docs/docs/reference/api/Suspended.mdx
  • docs/docs/reference/api/WebhookApprovalProvider.mdx
  • docs/docs/reference/api/acs-AcsControlHook.mdx
  • docs/docs/reference/api/action_hash.mdx
  • docs/docs/reference/api/banner.mdx
  • docs/docs/reference/api/canonical_bytes.mdx
  • docs/docs/reference/api/canonicalize.mdx
  • docs/docs/reference/api/conformance-run.mdx
  • docs/docs/reference/api/conformance-store-run.mdx
  • docs/docs/reference/api/context.mdx
  • docs/docs/reference/api/gateway-serve.mdx
  • docs/docs/reference/api/index.mdx
  • docs/docs/reference/api/jwt_identity-JWTIdentityProvider.mdx
  • docs/docs/reference/api/needs_approval.mdx
  • docs/docs/reference/api/otel-OTelEventSink.mdx
  • docs/docs/reference/api/parse_conditions.mdx
  • docs/docs/reference/api/postgres-PostgresStateStore.mdx
  • docs/docs/reference/api/protect.mdx
  • docs/docs/reference/api/verify-run.mdx
  • docs/docs/reference/api/with_approval.mdx
  • docs/docs/reference/authority-yaml.mdx
  • docs/docs/reference/cli.mdx
  • docs/docs/reference/errors.mdx
  • docs/docs/reference/exit-codes.mdx
  • docs/docs/reference/policy-yaml.mdx
  • docs/docs/reference/receipt-and-event-schemas.mdx
  • docs/docs/security/disclosure.mdx
  • docs/docs/security/receipt-chain.mdx
  • docs/docs/security/verify-guarantees.mdx
  • docs/docs/study/does-your-framework-double-execute.mdx
  • docs/docs/try-it.mdx
  • docs/docs/verify.md
  • docs/docs/verify/get-the-badge.mdx
  • docs/docs/why.mdx
  • docs/index.mdx
  • docs/medical-demo.js
  • docs/medical-workbench.js
  • docs/protect-my-agent.mdx
  • docs/risk-check.mdx
  • docs/snippets/architecture-review.jsx
  • docs/snippets/demo-film.jsx
  • docs/snippets/risk-check.jsx
  • docs/snippets/scenario-explorer.jsx
  • docs/style.css
  • docs/try-it.js
  • docs/try.mdx
  • docs/website-events.js
  • examples/acs/README.md
  • examples/authority/README.md
  • examples/cookbook/credential-rotation-agent/ctrlrun.yaml
  • examples/cookbook/credential-rotation-agent/main.py
  • examples/cookbook/crm-update-agent/ctrlrun.yaml
  • examples/cookbook/crm-update-agent/main.py
  • examples/cookbook/customer-notification-agent/ctrlrun.yaml
  • examples/cookbook/customer-notification-agent/main.py
  • examples/cookbook/data-deletion-agent/ctrlrun.yaml
  • examples/cookbook/data-deletion-agent/main.py
  • examples/cookbook/database-migration-agent/ctrlrun.yaml
  • examples/cookbook/database-migration-agent/main.py
  • examples/cookbook/deploy-agent/ctrlrun.yaml
  • examples/cookbook/deploy-agent/main.py
  • examples/cookbook/iam-agent/ctrlrun.yaml
  • examples/cookbook/iam-agent/main.py
  • examples/cookbook/manager-and-worker/ctrlrun.yaml
  • examples/cookbook/manager-and-worker/main.py
  • examples/cookbook/observe-then-enforce/ctrlrun.yaml
  • examples/cookbook/observe-then-enforce/main.py
  • examples/cookbook/outbound-email-agent/ctrlrun.yaml
  • examples/cookbook/outbound-email-agent/main.py
  • examples/cookbook/payout-maker-checker/ctrlrun.yaml
  • examples/cookbook/payout-maker-checker/main.py
  • examples/cookbook/protect-an-mcp-server/ctrlrun.yaml
  • examples/cookbook/protect-an-mcp-server/main.py
  • examples/cookbook/receipts-to-opentelemetry/ctrlrun.yaml
  • examples/cookbook/receipts-to-opentelemetry/main.py
  • examples/cookbook/reconcile-against-the-remote/ctrlrun.yaml
  • examples/cookbook/reconcile-against-the-remote/main.py
  • examples/cookbook/refund-agent/ctrlrun.yaml
  • examples/cookbook/refund-agent/main.py
  • examples/cookbook/resolve-an-ambiguous-effect/ctrlrun.yaml
  • examples/cookbook/resolve-an-ambiguous-effect/main.py
  • examples/cookbook/slack-approvals/ctrlrun.yaml
  • examples/cookbook/slack-approvals/main.py
  • examples/cookbook/sqlite-to-postgres/ctrlrun.yaml
  • examples/cookbook/sqlite-to-postgres/main.py
  • examples/cookbook/verify-in-github-actions/ctrlrun.yaml
  • examples/cookbook/verify-in-github-actions/run.sh
  • examples/policies/devops.yaml
  • examples/policies/e-commerce.yaml
  • examples/policies/government.yaml
  • examples/policies/healthcare.yaml
  • examples/policies/hr.yaml
  • examples/policies/insurance.yaml
  • examples/policies/legal.yaml
  • examples/policies/payments.yaml
  • examples/policies/security.yaml
  • integrations/website-form/.gitignore
  • integrations/website-form/.vercelignore
  • integrations/website-form/README.md
  • integrations/website-form/api/review.mjs
  • integrations/website-form/package.json
  • integrations/website-form/public/robots.txt
  • integrations/website-form/review.test.mjs
  • integrations/website-form/vercel.json
  • pyproject.toml
  • research/soak/README.md
  • scripts/repoint-claims.py
  • src/ctrlrun/acs.py
  • tests/conftest.py
  • tests/test_claims_citations.py
  • tests/test_cookbook.py
  • tests/test_docs_audit.py
  • tests/test_docs_medical_demo.py
  • tests/test_docs_production.py
  • tests/test_docs_reference.py
  • tests/test_docs_seo.py
  • tests/test_docs_site.py
  • tests/test_docs_travelling.py
  • tests/test_examples.py
  • tests/test_framework_probe.py
  • tests/test_medical_workbench.py
  • tests/test_owasp_mapping.py
  • tests/test_packaging.py
  • tests/test_readme_assets.py
  • tests/test_release_v0_6.py
  • tests/test_repository_signals.py
  • tests/test_verify_action.py
  • tools/docs_audit/__init__.py
  • tools/docs_audit/_files.py
  • tools/docs_audit/claims.py
  • tools/docs_audit/links.py
  • tools/docs_audit/lint-allowlist.txt
  • tools/docs_audit/lint.py
  • tools/docs_audit/render_api.py
  • tools/docs_audit/render_badges.py
  • tools/docs_audit/render_capabilities.py
  • tools/docs_audit/render_cli.py
  • tools/docs_audit/render_cookbook.py
  • tools/docs_audit/render_probe.py
  • tools/docs_audit/render_readiness.py
  • tools/docs_audit/render_schemas.py
  • tools/docs_audit/render_soak.py
  • tools/docs_audit/snippets.py

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@arpanghoshal
arpanghoshal marked this pull request as ready for review September 9, 2026 16:02
@arpanghoshal
arpanghoshal merged commit 6495d89 into main Sep 9, 2026
19 of 21 checks passed
@arpanghoshal
arpanghoshal deleted the split/docs-to-own-repo branch September 9, 2026 16:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant