Skip to content

docs: consolidate docs/reborn/ into docs/internal/reborn/ - #7559

Merged
gagdiez merged 2 commits into
mainfrom
docs/reborn-internal-consolidation
Aug 13, 2026
Merged

gagdiez merged 2 commits into
mainfrom
docs/reborn-internal-consolidation

Conversation

@thisisjoshford

@thisisjoshford thisisjoshford commented Aug 12, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Executes the follow-up PR docs: enforce the docs/ publication boundary (frozen .mintignore + CI gate) and consolidate internal docs under docs/internal/ #7259 left open: docs/reborn/ moves under docs/internal/reborn/, ending the last legacy location outside the internal/ publication fence.
  • Move-only: git mv of all 115 files (history preserved) plus a repo-wide mechanical rewrite of docs/reborn → docs/internal/reborn in 225 consumer files — crate AGENTS/READMEs and doc-comments, .claude/ skills/rules/commands, AGENTS.md, CI scripts, reborn-e2e.yml path filters, Dockerfile, tests, and docs/internal plans. Six relative internal/adr/ links inside the moved tree are depth-fixed for the added directory level.
  • The fence shrinks as designed: reborn/ is removed from docs/.mintignore and from FROZEN_MINTIGNORE_PATTERNS in scripts/ci/docs_publication_boundary.py (the frozen list only ever shrinks; internal/ already covers the new location). Comments in both updated.
  • CI follow-up commit (d02a54cc4), forced by the planner's fail-closed arms: tests/dockerfile_runtime_home.rs (whose edit here is functional — it reads the moved deploy doc) was deliberately unmapped in the Reborn PR test planner because no lane ran it. This PR decides it: _root_test_partitions() and run-reborn-root-partition.sh now inventory it alongside support_unit_tests.rs, so the hermetic root-partition lanes execute it (previously it ran in no CI lane), and the two config.hosted-single-tenant*.toml files it reads are mapped to it in DOCKER_RUNTIME_CONFIG_OWNERS (root-test owners select their root partition). docker/process-sandbox-entrypoint.sh stays fail-closed. The docs-boundary self-test fixture also drops reborn/ from its frozen-list sample.
  • Beyond path references, the fence edits, and that planner decision, no content or behavior changes.

Change Type

  • Documentation
  • CI/Infrastructure

Linked Issue

Related #7259 (follow-up named in its .mintignore/boundary-script comments)

Validation

  • cargo fmt --all -- --check
  • cargo clippy --all --benches --tests --examples --all-features -- -D warnings
  • cargo build
  • Relevant tests pass: cargo test -p ironclaw_architecture_tests --no-fail-fast (41 binaries, 297 passed, 0 failed); dockerfile_runtime_home (19 passed) — no Rust logic changed, only path strings in doc-comments/test fixtures, so clippy/build are unaffected
  • Manual testing: verified zero docs/reborn references remain repo-wide; verified all six depth-fixed ADR links resolve; verified no programmatically-assembled docs/reborn paths exist that a text rewrite would miss

Test Strategy

User behavior: None — internal engineering docs and the CI publication fence; no product behavior.

Risk areas: none checked — no model, browser, side-effect, persistence, security, provider, or cross-component behavior changes.

Tests added or updated:

  • Unit or contract: Not applicable: move-only path rewrite; existing gates (architecture tests, check-guidance, docs_publication_boundary, ws12 contract pins) already pin these paths and all pass against the new location
  • Reborn integration: Not applicable: no runtime behavior changed
  • Recorded fixture: Not applicable
  • Browser E2E: Not applicable
  • Backend or runtime: Not applicable
  • Live canary: Not applicable

What the tests prove: every consumer of the old path — the architecture-test suite reading contract files, check-guidance.py's 2,098 verified path references, the reborn-e2e.yml scope filters pinned by ws12_workflow_contracts.py, the coverage/classify CI scripts, and the Dockerfile deploy-doc test — resolves the new location.

Commands run:

  • python3 scripts/ci/docs_publication_boundary.py — every page published or fenced
  • python3 scripts/ci/check-guidance.py — 241 guidance files, 2,098 path references verified
  • python3 scripts/ci/check-target-tree.py, python3 scripts/ci/ws12_workflow_contracts.py — pass
  • python3 scripts/ci/test_reborn_pr_test_plan.py (76), test_reborn_changed_coverage.py (28), bash scripts/ci/test-reborn-changed-coverage.sh (113), test-classify-test-scope.sh, test-build-wasm-extensions.sh — pass
  • cargo test -p ironclaw_architecture_tests --no-fail-fast — 297 passed, 0 failed (unfiltered output)
  • cargo test -p ironclaw_integration_tests --test dockerfile_runtime_home — 19 passed
  • bash scripts/ci/check-generic-without-concrete.sh --trees-only, python3 scripts/check_no_panics.py --reborn-baseline, bash scripts/ci/check-composition-budget.sh — pass
  • Note: bash scripts/ci/test-reborn-coverage.sh fails 12/186 cases locally (exit 127 in the sticky-comment cases) — reproduced identically on a pristine HEAD worktree, pre-existing environment issue unrelated to this change

Security Impact

None. The publication boundary tightens (one fewer fence entry; the moved tree sits under the already-fenced internal/). No permissions, network, secrets, file-access, tool-execution, or sandbox changes.

Reborn Trust-Boundary Checklist

N/A — documentation move and CI path updates only; no trust-bearing types, prompts, hashes, variants, serde fields, buffers, error classes, or sandbox boundaries touched.

Database Impact

None.

Blast Radius

Anything that reads docs/reborn/ by path: architecture tests, check-guidance.py, docs_publication_boundary.py, reborn-e2e.yml path filters + scope regex (pinned by ws12 contracts), classify-test-scope.sh, coverage scripts, the Dockerfile deploy-doc test, and agent guidance (.claude/, AGENTS.md hierarchy). All were rewritten in the same commit and their gates executed. In-flight branches referencing the old path will need a trivial rebase. External deep links to github.com/.../docs/reborn/... (e.g. from the moved explorer.html's absolute URLs before this PR) break; the moved copies now point at the new location.

Rollback Plan

Single-commit revert (git revert) restores the tree and every reference atomically; the fence entries (reborn/ in .mintignore + FROZEN_MINTIGNORE_PATTERNS) come back with it, so the boundary gate stays consistent in both directions. Mintlify: the moved pages were already fenced (reborn/ entry) and remain fenced (internal/), so no publication change occurs on deploy in either direction.

Review Follow-Through

The planner decision above is the one judgment call reviewers may want to weigh: laning dockerfile_runtime_home.rs means the root-partition lanes now run 19 additional hermetic tests (~2s, no Docker daemon; they parse the Dockerfile/configs and drive docker/reborn/entrypoint.sh under bash). The alternative — classifying it as prose — would have kept a functional test file invisible to CI. Also: the 12 pre-existing local failures in test-reborn-coverage.sh are environmental (verified against clean HEAD) and left untouched.


Review track: B (docs move plus a real CI-planner decision: the previously unlaned tests/dockerfile_runtime_home.rs now runs in the root-partition lanes)

🤖 Generated with Claude Code

Move-only migration; no content changes beyond path references. Executes
the follow-up that PR #7259 left open: docs/.mintignore's reborn/ entry
was kept only because the path was load-bearing, and its comment
documented that it moves under internal/ once its consumers move with it.

- git mv docs/reborn docs/internal/reborn (115 files, history preserved)
- rewrite docs/reborn -> docs/internal/reborn across every consumer
  (crate AGENTS/READMEs and doc-comments, .claude/ skills and rules,
  AGENTS.md, CI scripts, reborn-e2e.yml path filters, Dockerfile, tests,
  docs/internal plans)
- fix six relative internal/adr/ links inside the moved tree for the
  added directory level
- drop reborn/ from docs/.mintignore and FROZEN_MINTIGNORE_PATTERNS in
  scripts/ci/docs_publication_boundary.py (the frozen list only ever
  shrinks); internal/ already fences the new location

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings August 12, 2026 22:34
@railway-app

railway-app Bot commented Aug 12, 2026

Copy link
Copy Markdown

This PR was not deployed automatically as @thisisjoshford does not have access to the Railway project.

In order to get automatic PR deploys, please add @thisisjoshford to your workspace on Railway.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of files (300). Try reducing the number of changed files and requesting a review from Copilot again.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 336 files, which is 36 over the limit of 300.

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

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: f920e623-ff63-4270-bbe0-0af3d5560c18

📥 Commits

Reviewing files that changed from the base of the PR and between d4fa8e1 and d02a54c.

⛔ Files ignored due to path filters (6)
  • docs/internal/reborn/subagent-spawn/diagrams/architecture.svg is excluded by !**/*.svg
  • docs/internal/reborn/subagent-spawn/diagrams/blocking-lifecycle.svg is excluded by !**/*.svg
  • docs/internal/reborn/subagent-spawn/diagrams/loop-execution.svg is excluded by !**/*.svg
  • docs/internal/reborn/subagent-spawn/diagrams/phase-dag.svg is excluded by !**/*.svg
  • docs/internal/reborn/subagent-spawn/diagrams/spawn-flow.svg is excluded by !**/*.svg
  • docs/internal/reborn/subagent-spawn/diagrams/static-vs-dynamic.svg is excluded by !**/*.svg
📒 Files selected for processing (336)
  • .claude/commands/deslop-reborn.md
  • .claude/rules/review-discipline.md
  • .claude/rules/safety-and-sandbox.md
  • .claude/skills/ironclaw-reborn-skill-maintainer/SKILL.md
  • .claude/skills/ironclaw-reborn-testing/SKILL.md
  • .claude/skills/ironclaw-reborn-testing/references/exemplar-tests.md
  • .claude/skills/reborn-extension-surfaces/SKILL.md
  • .github/workflows/reborn-e2e.yml
  • AGENTS.md
  • Dockerfile
  • crates/AGENTS.md
  • crates/Architecture.md
  • crates/README.md
  • crates/app/AGENTS.md
  • crates/app/ironclaw_architecture_tests/AGENTS.md
  • crates/app/ironclaw_architecture_tests/README.md
  • crates/app/ironclaw_architecture_tests/tests/ratchet_support/mod.rs
  • crates/app/ironclaw_architecture_tests/tests/reborn_build_script_roots.rs
  • crates/app/ironclaw_architecture_tests/tests/reborn_capability_dto_collapse_ratchet.rs
  • crates/app/ironclaw_architecture_tests/tests/reborn_dependency_boundaries.rs
  • crates/app/ironclaw_architecture_tests/tests/reborn_deployment_mode_branching_ratchet.rs
  • crates/app/ironclaw_architecture_tests/tests/reborn_deployment_mode_typename_ratchet.rs
  • crates/app/ironclaw_architecture_tests/tests/reborn_extension_specificity.rs
  • crates/app/ironclaw_architecture_tests/tests/reborn_registration_pipeline_boundary.rs
  • crates/app/ironclaw_architecture_tests/tests/reborn_restructure_baselines.rs
  • crates/app/ironclaw_architecture_tests/tests/reborn_service_method_freeze_ratchet.rs
  • crates/app/ironclaw_architecture_tests/tests/reborn_standalone_typename_ratchet.rs
  • crates/app/ironclaw_cli/README.md
  • crates/app/ironclaw_composition/AGENTS.md
  • crates/app/ironclaw_composition/CONTRACT.md
  • crates/app/ironclaw_composition/README.md
  • crates/app/ironclaw_config/AGENTS.md
  • crates/app/ironclaw_config/README.md
  • crates/app/ironclaw_config/src/secrets_guard.rs
  • crates/contracts/AGENTS.md
  • crates/contracts/ironclaw_common/AGENTS.md
  • crates/contracts/ironclaw_extension_contracts/AGENTS.md
  • crates/contracts/ironclaw_extension_contracts/README.md
  • crates/contracts/ironclaw_extension_contracts/src/channel.rs
  • crates/contracts/ironclaw_extension_contracts/src/lib.rs
  • crates/contracts/ironclaw_extension_contracts/src/recipe.rs
  • crates/contracts/ironclaw_extension_contracts/src/state.rs
  • crates/contracts/ironclaw_extension_contracts/src/tool_adapter.rs
  • crates/contracts/ironclaw_host_api/AGENTS.md
  • crates/contracts/ironclaw_host_api/README.md
  • crates/contracts/ironclaw_host_api/src/authorized.rs
  • crates/contracts/ironclaw_host_api/src/failure.rs
  • crates/contracts/ironclaw_host_api/src/gate_record.rs
  • crates/contracts/ironclaw_host_api/src/invocation.rs
  • crates/contracts/ironclaw_host_api/src/resolution.rs
  • crates/contracts/ironclaw_host_api/src/safe_summary.rs
  • crates/contracts/ironclaw_host_api/src/trust.rs
  • crates/contracts/ironclaw_loop_contracts/AGENTS.md
  • crates/contracts/ironclaw_loop_contracts/README.md
  • crates/contracts/ironclaw_loop_contracts/src/lib.rs
  • crates/contracts/ironclaw_product_contracts/AGENTS.md
  • crates/contracts/ironclaw_product_contracts/README.md
  • crates/contracts/ironclaw_product_contracts/src/error.rs
  • crates/contracts/ironclaw_product_contracts/src/lib.rs
  • crates/contracts/ironclaw_prompt_envelope/README.md
  • crates/domains/AGENTS.md
  • crates/domains/ironclaw_auth/AGENTS.md
  • crates/domains/ironclaw_auth/README.md
  • crates/domains/ironclaw_auth/src/account_state.rs
  • crates/domains/ironclaw_auth/src/engine/mod.rs
  • crates/domains/ironclaw_auth/src/product_auth/durable/mod.rs
  • crates/domains/ironclaw_conversations/AGENTS.md
  • crates/domains/ironclaw_llm/AGENTS.md
  • crates/domains/ironclaw_memory/AGENTS.md
  • crates/domains/ironclaw_outbound/AGENTS.md
  • crates/domains/ironclaw_outbound/README.md
  • crates/domains/ironclaw_outbound/src/test_support.rs
  • crates/domains/ironclaw_skills/AGENTS.md
  • crates/domains/ironclaw_threads/AGENTS.md
  • crates/domains/ironclaw_threads/README.md
  • crates/domains/ironclaw_triggers/AGENTS.md
  • crates/domains/ironclaw_triggers/README.md
  • crates/events/AGENTS.md
  • crates/events/ironclaw_event_log/AGENTS.md
  • crates/events/ironclaw_event_log/README.md
  • crates/events/ironclaw_event_projections/AGENTS.md
  • crates/events/ironclaw_event_projections/README.md
  • crates/events/ironclaw_event_store/AGENTS.md
  • crates/events/ironclaw_event_store/README.md
  • crates/events/ironclaw_event_streams/AGENTS.md
  • crates/events/ironclaw_event_streams/README.md
  • crates/extensions/AGENTS.md
  • crates/extensions/ironclaw_extension_host/README.md
  • crates/extensions/ironclaw_extension_host/src/ingress/verifier.rs
  • crates/extensions/ironclaw_extension_manager/AGENTS.md
  • crates/extensions/ironclaw_extension_manager/README.md
  • crates/extensions/ironclaw_extension_registry/AGENTS.md
  • crates/extensions/ironclaw_extension_registry/README.md
  • crates/extensions/ironclaw_extension_registry/src/resolved.rs
  • crates/extensions/ironclaw_extension_support/src/packages/mod.rs
  • crates/extensions/packages/memory-native/AGENTS.md
  • crates/kernel/AGENTS.md
  • crates/kernel/ironclaw_approvals/AGENTS.md
  • crates/kernel/ironclaw_approvals/README.md
  • crates/kernel/ironclaw_approvals/src/test_support.rs
  • crates/kernel/ironclaw_authorization/AGENTS.md
  • crates/kernel/ironclaw_authorization/README.md
  • crates/kernel/ironclaw_authorization/src/test_support.rs
  • crates/kernel/ironclaw_capabilities/AGENTS.md
  • crates/kernel/ironclaw_capabilities/README.md
  • crates/kernel/ironclaw_capabilities/src/ports.rs
  • crates/kernel/ironclaw_capabilities/tests/memory_profile_schema_refs_exist.rs
  • crates/kernel/ironclaw_host_runtime/AGENTS.md
  • crates/kernel/ironclaw_host_runtime/README.md
  • crates/kernel/ironclaw_processes/AGENTS.md
  • crates/kernel/ironclaw_processes/README.md
  • crates/kernel/ironclaw_processes/src/test_support.rs
  • crates/kernel/ironclaw_resources/AGENTS.md
  • crates/kernel/ironclaw_resources/README.md
  • crates/kernel/ironclaw_resources/src/test_support.rs
  • crates/kernel/ironclaw_runtime_policy/AGENTS.md
  • crates/kernel/ironclaw_runtime_policy/README.md
  • crates/kernel/ironclaw_runtime_policy/src/lib.rs
  • crates/kernel/ironclaw_trust/AGENTS.md
  • crates/kernel/ironclaw_trust/CONTRACT.md
  • crates/kernel/ironclaw_trust/src/lib.rs
  • crates/kernel/ironclaw_turns/AGENTS.md
  • crates/kernel/ironclaw_turns/README.md
  • crates/lanes/AGENTS.md
  • crates/lanes/ironclaw_mcp/AGENTS.md
  • crates/lanes/ironclaw_mcp/README.md
  • crates/lanes/ironclaw_sandbox/AGENTS.md
  • crates/lanes/ironclaw_sandbox/README.md
  • crates/lanes/ironclaw_wasm/AGENTS.md
  • crates/lanes/ironclaw_wasm/README.md
  • crates/lanes/ironclaw_wasm_limiter/README.md
  • crates/loop/AGENTS.md
  • crates/loop/ironclaw_agent_loop/README.md
  • crates/loop/ironclaw_hooks/README.md
  • crates/loop/ironclaw_loop_host/README.md
  • crates/loop/ironclaw_turn_runner/README.md
  • crates/product/AGENTS.md
  • crates/product/ironclaw_assistant/README.md
  • crates/product/ironclaw_assistant/src/error.rs
  • crates/product/ironclaw_host_ingress/README.md
  • crates/product/ironclaw_openai_compat/README.md
  • crates/product/ironclaw_operator/README.md
  • crates/product/ironclaw_webui/AGENTS.md
  • crates/product/ironclaw_webui/CONTRACT.md
  • crates/product/ironclaw_webui/README.md
  • crates/product/ironclaw_webui/src/lib.rs
  • crates/product/ironclaw_webui/src/product_auth/mod.rs
  • crates/product/ironclaw_webui/src/webui_serve.rs
  • crates/product/ironclaw_webui/tests/auth_route_contract.rs
  • crates/substrates/AGENTS.md
  • crates/substrates/ironclaw_filesystem/AGENTS.md
  • crates/substrates/ironclaw_filesystem/CONTRACT.md
  • crates/substrates/ironclaw_filesystem/README.md
  • crates/substrates/ironclaw_libsql_runtime/README.md
  • crates/substrates/ironclaw_network/README.md
  • crates/substrates/ironclaw_secrets/README.md
  • crates/substrates/ironclaw_secrets/src/legacy_store.rs
  • crates/substrates/ironclaw_secrets/src/secret_store.rs
  • docs/.mintignore
  • docs/internal/adr/0003-triggers-keeps-hand-written-sql.md
  • docs/internal/design/2026-08-08-web-push-notifications.md
  • docs/internal/design/2026-08-10-unified-channel-model.md
  • docs/internal/plans/2026-05-16-scoped-filesystem-tenant-isolation.md
  • docs/internal/plans/2026-06-05-trigger-delivery-default-outbound-e2e-plan.md
  • docs/internal/plans/2026-08-07-doc-truth-pipeline.md
  • docs/internal/plans/2026-08-11-channel-complete-inbound-implementation.md
  • docs/internal/reborn-binary.md
  • docs/internal/reborn/2026-07-24-static-kernel-process-journal-proof.md
  • docs/internal/reborn/2026-07-26-process-kernel-next-collapses.md
  • docs/internal/reborn/README.md
  • docs/internal/reborn/auth/recipe-parity-checklist.md
  • docs/internal/reborn/contracts/AGENTS.md
  • docs/internal/reborn/contracts/_contract-freeze-index.md
  • docs/internal/reborn/contracts/agent-loop-protocol.md
  • docs/internal/reborn/contracts/approvals.md
  • docs/internal/reborn/contracts/auth-product.md
  • docs/internal/reborn/contracts/capabilities.md
  • docs/internal/reborn/contracts/capability-access.md
  • docs/internal/reborn/contracts/communication-delivery-resolution.md
  • docs/internal/reborn/contracts/conversation-binding.md
  • docs/internal/reborn/contracts/dispatcher.md
  • docs/internal/reborn/contracts/events-projections.md
  • docs/internal/reborn/contracts/events.md
  • docs/internal/reborn/contracts/extensions.md
  • docs/internal/reborn/contracts/filesystem.md
  • docs/internal/reborn/contracts/host-api.md
  • docs/internal/reborn/contracts/host-runtime.md
  • docs/internal/reborn/contracts/kernel-boundary.md
  • docs/internal/reborn/contracts/lightweight-agent-loop.md
  • docs/internal/reborn/contracts/live-vertical-slice.md
  • docs/internal/reborn/contracts/loop-exit.md
  • docs/internal/reborn/contracts/mcp.md
  • docs/internal/reborn/contracts/memory-profiles.md
  • docs/internal/reborn/contracts/memory.md
  • docs/internal/reborn/contracts/migration-compatibility.md
  • docs/internal/reborn/contracts/network.md
  • docs/internal/reborn/contracts/openai-compatible-api.md
  • docs/internal/reborn/contracts/operator-effective-config.md
  • docs/internal/reborn/contracts/operator-observability-backends.md
  • docs/internal/reborn/contracts/processes.md
  • docs/internal/reborn/contracts/resources.md
  • docs/internal/reborn/contracts/run-state.md
  • docs/internal/reborn/contracts/runtime-profiles.md
  • docs/internal/reborn/contracts/runtime-selection.md
  • docs/internal/reborn/contracts/runtime-workflows.md
  • docs/internal/reborn/contracts/schemas/memory/context-retrieve.input.v1.json
  • docs/internal/reborn/contracts/schemas/memory/context-retrieve.output.v1.json
  • docs/internal/reborn/contracts/schemas/memory/document-read.input.v1.json
  • docs/internal/reborn/contracts/schemas/memory/document-read.output.v1.json
  • docs/internal/reborn/contracts/schemas/memory/document-write.input.v1.json
  • docs/internal/reborn/contracts/schemas/memory/document-write.output.v1.json
  • docs/internal/reborn/contracts/schemas/memory/interaction-record.input.v1.json
  • docs/internal/reborn/contracts/schemas/memory/interaction-record.output.v1.json
  • docs/internal/reborn/contracts/scripts.md
  • docs/internal/reborn/contracts/secrets.md
  • docs/internal/reborn/contracts/settings-config.md
  • docs/internal/reborn/contracts/skills-extension.md
  • docs/internal/reborn/contracts/storage-placement.md
  • docs/internal/reborn/contracts/triggers.md
  • docs/internal/reborn/contracts/trust-boundary-hardening.md
  • docs/internal/reborn/contracts/turn-persistence.md
  • docs/internal/reborn/contracts/turn-runner.md
  • docs/internal/reborn/contracts/turns-agent-loop.md
  • docs/internal/reborn/contracts/wasm.md
  • docs/internal/reborn/contracts/web-debug-inspector.md
  • docs/internal/reborn/deploy-reborn-cli-docker.md
  • docs/internal/reborn/engine-v2-to-reborn-parity.md
  • docs/internal/reborn/extension-runtime/adr/0001-multiple-accounts-per-vendor.md
  • docs/internal/reborn/extension-runtime/checklist.md
  • docs/internal/reborn/extension-runtime/implementation.md
  • docs/internal/reborn/extension-runtime/overview.md
  • docs/internal/reborn/extension-runtime/standard-operations.md
  • docs/internal/reborn/guidance-conventions.md
  • docs/internal/reborn/harness/e2e.md
  • docs/internal/reborn/harness/landing-policy.md
  • docs/internal/reborn/harness/local-dev.md
  • docs/internal/reborn/harness/observability.md
  • docs/internal/reborn/harness/replay.md
  • docs/internal/reborn/how-to-port-channel-to-reborn.md
  • docs/internal/reborn/how-to-port-tool-to-reborn.md
  • docs/internal/reborn/onboarding.md
  • docs/internal/reborn/production-cutover-readiness-closeout.md
  • docs/internal/reborn/railway-sandbox-operator.md
  • docs/internal/reborn/security-parity/01-auth.md
  • docs/internal/reborn/security-parity/02-network-limits.md
  • docs/internal/reborn/security-parity/03-headers-errors.md
  • docs/internal/reborn/setup-slack-for-reborn-binary.md
  • docs/internal/reborn/subagent-spawn/README.md
  • docs/internal/reborn/subagent-spawn/diagrams/architecture.d2
  • docs/internal/reborn/subagent-spawn/diagrams/blocking-lifecycle.d2
  • docs/internal/reborn/subagent-spawn/diagrams/loop-execution.d2
  • docs/internal/reborn/subagent-spawn/diagrams/phase-dag.d2
  • docs/internal/reborn/subagent-spawn/diagrams/spawn-flow.d2
  • docs/internal/reborn/subagent-spawn/diagrams/static-vs-dynamic.d2
  • docs/internal/reborn/subagent-spawn/phase-1-contracts.md
  • docs/internal/reborn/subagent-spawn/phase-2-mechanisms.md
  • docs/internal/reborn/subagent-spawn/phase-3-integration.md
  • docs/internal/reborn/subagent-spawn/thread-harness-design.md
  • docs/internal/reborn/target-architecture/CHECKLIST.md
  • docs/internal/reborn/target-architecture/PLAN.md
  • docs/internal/reborn/target-architecture/PROPOSAL.md
  • docs/internal/reborn/target-architecture/README.md
  • docs/internal/reborn/target-architecture/explorer.html
  • docs/internal/reborn/target-architecture/families/app.md
  • docs/internal/reborn/target-architecture/families/contracts.md
  • docs/internal/reborn/target-architecture/families/domains.md
  • docs/internal/reborn/target-architecture/families/events.md
  • docs/internal/reborn/target-architecture/families/extensions.md
  • docs/internal/reborn/target-architecture/families/kernel.md
  • docs/internal/reborn/target-architecture/families/lanes.md
  • docs/internal/reborn/target-architecture/families/loop.md
  • docs/internal/reborn/target-architecture/families/product.md
  • docs/internal/reborn/target-architecture/families/substrates.md
  • docs/internal/reborn/target-architecture/ws12-gauntlet-report.md
  • docs/internal/reborn/target-architecture/ws12-mapping-audit.md
  • docs/internal/reborn/target-architecture/ws12-security-audit.md
  • docs/internal/superpowers/plans/2026-07-13-combined-slack-lifecycle-implementation.md
  • docs/internal/superpowers/plans/2026-07-13-frontend-source-conventions.md
  • docs/internal/superpowers/plans/2026-07-14-resource-governor-recovery-hardening.md
  • docs/internal/superpowers/plans/2026-07-16-telegram-extension.md
  • docs/internal/superpowers/plans/2026-07-17-pr-6159-architecture-simplification.md
  • docs/internal/superpowers/plans/2026-07-22-generic-extension-correctness-merge-readiness.md
  • docs/internal/superpowers/plans/2026-07-24-extension-state-records-v2.md
  • docs/internal/superpowers/plans/2026-07-24-nested-dispatch-run-projection.md
  • docs/internal/superpowers/plans/2026-07-27-channel-delivery-tool.md
  • docs/internal/superpowers/plans/2026-07-27-standardized-messaging-framework.md
  • docs/internal/superpowers/plans/2026-07-28-channel-command-allowlist.md
  • docs/internal/superpowers/plans/2026-07-29-generic-cross-channel-attachments.md
  • docs/internal/superpowers/plans/2026-07-29-libsql-single-writer-recovery.md
  • docs/internal/superpowers/plans/2026-07-29-pr3-slack-native-dispatcher.md
  • docs/internal/superpowers/plans/2026-07-31-new-stop-commands.md
  • docs/internal/superpowers/specs/2026-07-16-telegram-extension-design.md
  • docs/internal/superpowers/specs/2026-07-17-pr-6159-architecture-simplification-design.md
  • docs/internal/superpowers/specs/2026-07-27-channel-delivery-tool-design.md
  • docs/internal/superpowers/specs/2026-07-27-standardized-messaging-framework-design.md
  • docs/internal/superpowers/specs/2026-07-29-product-command-train-design.md
  • scripts/build-wasm-extensions.sh
  • scripts/check-version-bumps.sh
  • scripts/check_no_panics.py
  • scripts/ci/check-composition-budget.sh
  • scripts/ci/check-generic-without-concrete.sh
  • scripts/ci/check-guidance.py
  • scripts/ci/check-target-tree.py
  • scripts/ci/classify-test-scope.sh
  • scripts/ci/critical_mutation_gate.py
  • scripts/ci/docs_publication_boundary.py
  • scripts/ci/lib/crate_tree.py
  • scripts/ci/lib/reborn_coverage_lcov.py
  • scripts/ci/quality_gate_strict.sh
  • scripts/ci/reborn-coverage-merge-lcov.sh
  • scripts/ci/reborn_changed_coverage.py
  • scripts/ci/reborn_pr_test_plan.py
  • scripts/ci/regression-test-check.py
  • scripts/ci/run-hermetic-deterministic-suite.sh
  • scripts/ci/run-reborn-root-partition.sh
  • scripts/ci/test-build-wasm-extensions.sh
  • scripts/ci/test-classify-test-scope.sh
  • scripts/ci/test-hermetic-test-process.sh
  • scripts/ci/test-reborn-changed-coverage.sh
  • scripts/ci/test-reborn-coverage.sh
  • scripts/ci/test_docs_publication_boundary.py
  • scripts/ci/test_reborn_changed_coverage.py
  • scripts/ci/test_reborn_pr_test_plan.py
  • scripts/ci/ws12_workflow_contracts.py
  • scripts/dev_metrics.py
  • scripts/live-canary/scrub-artifacts.sh
  • scripts/reborn-e2e-rust.sh
  • scripts/reborn_qa_matrix/audit_surface_inventory.py
  • scripts/reborn_webui_v2_live_qa/slack_helpers.py
  • scripts/run-reborn-webui.sh
  • tests/dockerfile_runtime_home.rs
  • tests/integration/CLAUDE.md
  • tests/integration/coverage-floor.toml
  • tests/integration/http_matcher.rs
  • tests/reborn_qa_connect_flows.rs
  • tools/ironclaw_stress/results/2026-07-26-process-journal-rerun/README.md

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.

@github-actions github-actions Bot added scope: sandbox Docker sandbox scope: ci CI/CD workflows scope: docs Documentation size: XL 500+ changed lines risk: medium Business logic, config, or moderate-risk modules contributor: experienced 6-19 merged PRs labels Aug 12, 2026
@ironloopai

ironloopai Bot commented Aug 12, 2026 •

Copy link
Copy Markdown
Contributor

🧭 IronLoop Run · Review

This comment updates in place as the Run moves through its stages.

🟩 Final result · Completed

🟨 Queued → 🟦 Working → 🟦 Posting results → 🟩 Completed

Automatic trigger · attempt 1 of 3 · completed in 4m 43s

IronLoop completed the review and posted it to GitHub.

🔗 Result

Open submitted review →

Run details

Run: a5e2fc6c-2ca6-47be-a24c-fbe4c16e2c05
Base: main at d4fa8e1
Head: docs/reborn-internal-consolidation at 13fcae8
Created: 2026-08-12 22:39 UTC
Updated: 2026-08-12 22:44 UTC

@ironloopai ironloopai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 IronLoop review

🟢 No actionable findings

No actionable issues found in this documentation relocation. The path rewrites, CI scope updates, publication fence change, and moved-document links were consistent with the intended move.

Validation

  • ✅ Documentation publication boundary — All documentation pages are published or fenced as required.
  • ✅ Guidance path validation — Validated 2,098 guidance path references successfully.
  • ✅ Workflow and scope checks — Workflow contracts, target-tree validation, and test-scope classification passed.
  • ✅ Architecture path consumers — Relevant architecture test targets passed (62 tests total).
  • ✅ Mechanical relocation audit — All modified consumers were literal path rewrites except the intended fence change; moved documents preserved content with the necessary relative-link depth fixes.
Review details
  • Run: a5e2fc6c-2ca6-47be-a24c-fbe4c16e2c05
  • Workflow: Review
  • Attempts: 1

…f-test fixture

Two CI gates failed on the docs/reborn consolidation and forced decisions
this commit records:

- The Reborn PR test planner failed closed on tests/dockerfile_runtime_home.rs
  (its path-rewrite edit is functional: the test reads the moved deploy doc).
  The file was deliberately unmapped because no lane inventoried it. Decide it
  now: _root_test_partitions() and run-reborn-root-partition.sh both inventory
  it alongside support_unit_tests.rs, so the hermetic root-partition lanes run
  it (they previously ran it nowhere) and a change to it selects its partition.
  With the reader laned, map the two config.hosted-single-tenant*.toml readers
  it owns in DOCKER_RUNTIME_CONFIG_OWNERS — root-test owners select their root
  partition, completing the per-file decision set the planner comments left
  open. docker/process-sandbox-entrypoint.sh stays fail-closed.
- test_docs_publication_boundary.py's subset fixture still listed reborn/ in
  the frozen mintignore list; use the surviving entries.

Verified: both self-test suites pass (77 planner + boundary), the planner
emits a valid selected plan for this PR's full 342-path diff, shell and
Python inventories agree on partition assignment (index 0), and
dockerfile_runtime_home passes (19 tests).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings August 12, 2026 23:07

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of files (300). Try reducing the number of changed files and requesting a review from Copilot again.

@gagdiez
gagdiez added this pull request to the merge queue Aug 13, 2026
Merged via the queue into main with commit 318a6e6 Aug 13, 2026
50 checks passed
@gagdiez
gagdiez deleted the docs/reborn-internal-consolidation branch August 13, 2026 10:27
thisisjoshford added a commit that referenced this pull request Aug 13, 2026
…he docs/internal migration

The docs-surface scan carried a double negative — exclude docs/reborn/ as
an archive class, then re-include its living pages via
DOCS_REINCLUDED_PREFIXES — because the old tree mixed dead archives with
living specs. #7559 moved everything under docs/internal/, so the structure
is now: one excluded archive class (docs/internal/), and the living spec
pages (the contract corpus, the two extension-runtime spec pages,
guidance-conventions.md) named in INTERNAL_GUIDANCE_PREFIXES and scanned as
first-class guidance files — full link checking, guarded by the same
per-prefix zero-match refusal. The published-docs floor now counts only the
Mintlify surface (measured 2026-08-13: 82 pages; floor re-halved to 40).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
thisisjoshford added a commit that referenced this pull request Aug 13, 2026
… mirrors

reborn/ left docs/.mintignore when #7559 consolidated it into internal/;
the fence mirrors in docs_manifest_schema_version.rs and
reborn_pr_test_plan.py still listed it. Fixture paths follow the move.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
pull Bot pushed a commit to Stars1233/ironclaw that referenced this pull request Aug 13, 2026
…oc-truth PR 2/5) (nearai#7376)

* docs: fix live drift in extension, responses API, and channel docs

The public tutorial taught the retired manifest v2 authoring format
([[host_api]] / [capability_provider.tools] / runtime_credentials), which
the v3 parser hard-rejects, and never mentioned origin_gate_matrix; the
Responses API page claimed temperature is rejected (accepted 0.0-2.0 and
forwarded), claimed model must be "default" (any well-formed name <= 256
bytes), claimed max_output_tokens is rejected (accepted and ignored by DTO
policy), and omitted the required model field from every request example;
the channel tutorial pointed at two files that no longer exist.

- docs/extensions/building-a-tool.md: rewrite manifest sections to the v3
  [[tools]] / [[tools.credentials]] / [auth.<vendor>] shape, document
  origin_gate_matrix (origins, policies, ratchet), correct the hosted-MCP
  [mcp] section, packaging via ironclaw_extension_support package modules,
  and v3 test references; drop the nonexistent script runtime kind.
- docs/api/responses.mdx: correct model/temperature/tools/tool_choice
  rejection rules, document unknown-field tolerance, add the required
  model field to all 15 request examples.
- docs/channels/building-a-channel.mdx: replace dead
  crates/ironclaw_first_party_extensions + available_extensions.rs
  registration instructions with the current package-directory mechanism.
- docs/reborn/contracts/extensions.md: state that production manifests
  author v3 (lowering into the v2 resolved model described there); label
  the v2 examples as legacy.
- docs/reborn/how-to-port-tool-to-reborn.md: superseded banner pointing at
  the v3 guides.

Part of nearai#7317 (doc-truth pipeline, PR 1 of 5).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): extend the reference gate to the docs/ surface

The public Mintlify tree had no path-reference validation — a published
tutorial told contributors to edit files that no longer exist and nothing
caught it. check-guidance.py already owned the machinery (tracked-tree
resolution, fence exclusion, suppress markers, shrink-only debt, fail-closed
floors), so the docs surface joins the same gate rather than a fork.

- discover_guidance() now collects every tracked docs/**.md|.mdx: published
  pages, the zh/ locale mirror, and the living contract corpus
  docs/reborn/contracts/. Dated archives (docs/internal/, the non-contract
  parts of docs/reborn/) are excluded as classes — measured 2026-08-07,
  705 of 709 dangling docs references sat in those historical corpora, and
  forcing dated plans/ADRs to track today's tree would either rewrite
  history or drown KNOWN_MISSING.
- docs/ files extract backticked inline paths only; Mintlify markdown link
  targets are site routes (extensionless pages, site-absolute /using/cli),
  a different namespace than the tracked tree, so the link extractor is off
  there by design.
- _reference_lines learns MDX comments ({/* ... */}), including
  {/* check-guidance: path-ok */} as the .mdx suppress-marker form, with the
  same one-reference-per-marker and multi-line semantics as HTML comments.
- Floors re-measured and re-dated (364 files / 2276 references; floors
  180/1100), plus a dedicated MIN_DOCS_FILES=60 floor: the aggregate floors
  sit below the guidance-only remainder, so the docs branch of discovery
  silently breaking needs its own refusal. --json now reports docs_files.
- Fixes the four real dangles the new scan found in docs/reborn/contracts/
  (moved nested_dispatch_stream.rs test home, retired event-store migrations
  directory, loop_driver_host tests->src move). KNOWN_MISSING stays empty.
- Self-tests: 8 new cases (dangling docs path fails; Mintlify links are not
  references; MDX marker suppresses exactly one reference; multi-line MDX
  comment hides content; zh discovered; archives excluded but contracts
  scanned; docs fence fails closed; docs floor refuses).
- ws12_workflow_contracts.py: docs/api/responses.mdx and docs/zh/index.mdx
  join the has_guidance in-scope probes so a narrowed trigger regex cannot
  silently skip the gate for public docs.

Part of nearai#7317 (doc-truth pipeline, PR 2 of 5); stacked on nearai#7375.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: address Copilot and CodeRabbit review on doc-drift PR

- responses.mdx: tool_choice is rejected only without external-tools wiring;
  with external tools enabled it passes validation and is currently ignored
  (validate_responses_supported_fields_with_external_tools never checks it).
- building-a-tool.md: clarify that effect-derived host ports are validation
  vocabulary against the HostPortCatalog allowlist; adapters are built by
  host-runtime services after authorization/obligations, never from manifests.
- how-to-port-tool-to-reborn.md: mark the decision tree's RuntimeKind targets
  historical (v3 accepts only wasm|first_party; MCP is top-level [mcp];
  process/CLI work is the sandbox lane).
- building-a-channel.mdx: document the user install flow — virtual package
  root /system/extensions/<id>/manifest.toml, ironclaw extension search /
  install <extension-id> (ID, not path), WebUI Extensions lifecycle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(responses): align the limits bullet with the corrected tool_choice claim

The rejection list was corrected in the previous commit (tool_choice is
rejected only without external-tools wiring); the "Limits and quirks"
bullet still said "not supported ... rejected with 400". Same claim, one
wording.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: apply verified code-review findings on the drift PR

A full code review of this PR against live code surfaced claims the
original drift pass got wrong or missed; every fix below was re-verified
against the cited source before editing:

- responses.mdx: standard `ironclaw serve` deployments always wire
  external tools (OpenAiCompatRouteMountPorts requires the store/resume
  pair; mount.rs wires them unconditionally), so `tools` is accepted and
  `tool_choice` is accepted-and-ignored on shipped binaries — the
  conditional 400s apply only to custom compositions without the wiring
  (now a Note). temperature is validated and carried in the submitted turn
  payload but not applied as a provider sampling parameter. Non-streaming
  wait timeout is 30 s (DEFAULT_RESPONSES_WAIT_TIMEOUT), not 120. usage on
  retrieval is read best-effort from persisted run state incl. USD cost
  (read_run_usage), not always zero.
- building-a-tool.md: the [auth.example] oauth2_code recipe gains the
  required token_response map (deny_unknown_fields rejects the example as
  previously written); Gmail/Google Calendar corrected to first_party
  runtimes (their manifests declare kind = "first_party"); the worked
  api_key recipe is github's, not slack's; the tail "Quick implementation
  checklist" and reference list were still v2-era (script lane,
  assets/<extension>/ path, "manifest v2", v2.rs pointer) and now teach
  the v3 shape; composition/CLI package-naming claim narrowed (the binary
  does link slack/telegram adapter crates).
- contracts/extensions.md: legacy-format paragraph no longer claims
  host-bundled packages ship v2 (none do), and origin_gate_matrix is
  attributed to capability.rs + building-a-tool.md instead of
  extension-runtime/overview.md §3, which does not mention it.
- how-to-port banner: `script` manifest authoring is retired; the
  RuntimeKind::Script symbol survives as the process-sandbox lane's kind.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(contracts): repoint delivery_resolution.rs to its family directory

PR nearai#7157 (merged to main 2026-08-07) cited
crates/ironclaw_outbound/src/delivery_resolution.rs in the
communication-delivery-resolution contract; the crate lives at
crates/domains/ironclaw_outbound/. Caught by this branch's docs surface of
check-guidance.py on the first merge of main after the gate landed —
exactly the drift class it exists for.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): harden the docs gate and fix review-surfaced doc drift

Applies the verified findings from the PR nearai#7376 code review:

- The loop-exit and turn-runner contract docs claimed the deleted
  loop_driver_host checkpoint-rejection test had 'moved into the
  module'; it was deleted in nearai#6696 and the fenced verification command
  could not run. Both now cite the real surviving pins
  (planned_driver.rs executor test + the ironclaw_turns projection
  test mapped in scripts/reborn-e2e-rust.sh), with runnable commands.
- An unterminated comment now refuses at EOF like an unterminated
  fence; before, one typo'd closer silently un-scanned the rest of the
  file.
- Markdown links in the re-included corpora are now checked as repo
  paths (they are never published, so the Mintlify-route rationale did
  not apply); this alone added ~165 verified references.
- Each DOCS_REINCLUDED_PREFIXES entry must match at least one tracked
  page or discovery refuses, so the planned docs/reborn consolidation
  cannot silently drop the corpus from the scan.
- The living extension-runtime spec pages (overview.md,
  standard-operations.md) and guidance-conventions.md join the scan;
  guidance-conventions.md now describes the docs surface and the MDX
  marker form, and its one dangling test path is repointed.
- Floors comment corrected (57 rule globs, not 38).

Also fixes four drifted claims from nearai#7375's pages, verified against
live code: the interleaved function_call_output example was rejected
with 400 (resume input must be exclusively function_call_output items
with previous_response_id); model is echoed only on create (GET/cancel
report the 'reborn' placeholder); output_schema_ref is optional; and
the unknown-fields claim now names the two deliberate exemptions.

Self-tests: 43 pass (three new arms — unterminated comment refusal in
both syntaxes, re-included links as repo claims, stale re-included
prefix refusal).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): sync module docstring with re-included link checking

CodeRabbit caught the docstring still claiming the link extractor is
off for all of docs/** — stale since b172f69 enabled it for the
re-included corpora. The docstring now states the exception and the
current re-include set.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): drop the docs/reborn re-include machinery after the docs/internal migration

The docs-surface scan carried a double negative — exclude docs/reborn/ as
an archive class, then re-include its living pages via
DOCS_REINCLUDED_PREFIXES — because the old tree mixed dead archives with
living specs. nearai#7559 moved everything under docs/internal/, so the structure
is now: one excluded archive class (docs/internal/), and the living spec
pages (the contract corpus, the two extension-runtime spec pages,
guidance-conventions.md) named in INTERNAL_GUIDANCE_PREFIXES and scanned as
first-class guidance files — full link checking, guarded by the same
per-prefix zero-match refusal. The published-docs floor now counts only the
Mintlify surface (measured 2026-08-13: 82 pages; floor re-halved to 40).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): validate docs discovery against docs.json navigation instead of a count floor

MIN_DOCS_FILES was an arbitrary magnitude tripwire (half of last measured,
hand-re-dated) that only caught the docs branch of discovery losing ~half
its pages. The published surface already has an independent definition —
docs.json navigation, owned by docs_publication_boundary.py — so the gate
now asserts every navigation page's source file is in the reference scan
(reusing the boundary script's nav walker and OpenAPI pseudo-page filter).
Discovery breaking refuses on the first missing published page, unreadable
or page-less navigation refuses rather than passing vacuously, and there
is no docs count floor left to tune. --json reports nav_pages_covered.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): count the living internal spec pages in the docs_files metric

CodeRabbit: docs_files under-reported the scan — the living internal spec
pages are scanned docs files but were excluded from the count, a leftover
of the deleted MIN_DOCS_FILES floor's published-only semantics. The metric
now reports every scanned file under docs/ (131 at measurement); published
surface health has its own signal in nav_pages_covered.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): tighten comments and docstrings

Same behavior; the docs-surface comments and test docstrings were carrying
paragraph-length rationale better kept in the PR description.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
pull Bot pushed a commit to soitun/ironclaw that referenced this pull request Aug 17, 2026
…claims (doc-truth PR 3/5) (nearai#7378)

* docs: fix live drift in extension, responses API, and channel docs

The public tutorial taught the retired manifest v2 authoring format
([[host_api]] / [capability_provider.tools] / runtime_credentials), which
the v3 parser hard-rejects, and never mentioned origin_gate_matrix; the
Responses API page claimed temperature is rejected (accepted 0.0-2.0 and
forwarded), claimed model must be "default" (any well-formed name <= 256
bytes), claimed max_output_tokens is rejected (accepted and ignored by DTO
policy), and omitted the required model field from every request example;
the channel tutorial pointed at two files that no longer exist.

- docs/extensions/building-a-tool.md: rewrite manifest sections to the v3
  [[tools]] / [[tools.credentials]] / [auth.<vendor>] shape, document
  origin_gate_matrix (origins, policies, ratchet), correct the hosted-MCP
  [mcp] section, packaging via ironclaw_extension_support package modules,
  and v3 test references; drop the nonexistent script runtime kind.
- docs/api/responses.mdx: correct model/temperature/tools/tool_choice
  rejection rules, document unknown-field tolerance, add the required
  model field to all 15 request examples.
- docs/channels/building-a-channel.mdx: replace dead
  crates/ironclaw_first_party_extensions + available_extensions.rs
  registration instructions with the current package-directory mechanism.
- docs/reborn/contracts/extensions.md: state that production manifests
  author v3 (lowering into the v2 resolved model described there); label
  the v2 examples as legacy.
- docs/reborn/how-to-port-tool-to-reborn.md: superseded banner pointing at
  the v3 guides.

Part of nearai#7317 (doc-truth pipeline, PR 1 of 5).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): extend the reference gate to the docs/ surface

The public Mintlify tree had no path-reference validation — a published
tutorial told contributors to edit files that no longer exist and nothing
caught it. check-guidance.py already owned the machinery (tracked-tree
resolution, fence exclusion, suppress markers, shrink-only debt, fail-closed
floors), so the docs surface joins the same gate rather than a fork.

- discover_guidance() now collects every tracked docs/**.md|.mdx: published
  pages, the zh/ locale mirror, and the living contract corpus
  docs/reborn/contracts/. Dated archives (docs/internal/, the non-contract
  parts of docs/reborn/) are excluded as classes — measured 2026-08-07,
  705 of 709 dangling docs references sat in those historical corpora, and
  forcing dated plans/ADRs to track today's tree would either rewrite
  history or drown KNOWN_MISSING.
- docs/ files extract backticked inline paths only; Mintlify markdown link
  targets are site routes (extensionless pages, site-absolute /using/cli),
  a different namespace than the tracked tree, so the link extractor is off
  there by design.
- _reference_lines learns MDX comments ({/* ... */}), including
  {/* check-guidance: path-ok */} as the .mdx suppress-marker form, with the
  same one-reference-per-marker and multi-line semantics as HTML comments.
- Floors re-measured and re-dated (364 files / 2276 references; floors
  180/1100), plus a dedicated MIN_DOCS_FILES=60 floor: the aggregate floors
  sit below the guidance-only remainder, so the docs branch of discovery
  silently breaking needs its own refusal. --json now reports docs_files.
- Fixes the four real dangles the new scan found in docs/reborn/contracts/
  (moved nested_dispatch_stream.rs test home, retired event-store migrations
  directory, loop_driver_host tests->src move). KNOWN_MISSING stays empty.
- Self-tests: 8 new cases (dangling docs path fails; Mintlify links are not
  references; MDX marker suppresses exactly one reference; multi-line MDX
  comment hides content; zh discovered; archives excluded but contracts
  scanned; docs fence fails closed; docs floor refuses).
- ws12_workflow_contracts.py: docs/api/responses.mdx and docs/zh/index.mdx
  join the has_guidance in-scope probes so a narrowed trigger regex cannot
  silently skip the gate for public docs.

Part of nearai#7317 (doc-truth pipeline, PR 2 of 5); stacked on nearai#7375.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(docs): pin CLI, manifest, and Responses doc claims to code

Three deterministic doc-fact contract tests, each living in the crate that
owns the truth it checks, so the drift nearai#7317 describes fails CI instead of
shipping:

- crates/app/ironclaw_cli/tests/docs_cli_reference.rs: parses the real
  binary's --help and cross-checks docs/using/cli.mdx table rows both ways
  (every visible subcommand documented, any alias form counting; every
  documented command real), with a fail-closed row floor. Doc gaps this
  surfaced are fixed here: ironhub had no rows at all, completion was
  fence-only, and the Trace Commons table lacked the `ironclaw` prefix the
  rest of the page uses.
- crates/extensions/ironclaw_extension_registry/tests/
  docs_manifest_schema_version.rs: walks the published docs tree (the
  frozen .mintignore fence mirrored as constants) and asserts zero
  occurrences of the retired reborn.extension_manifest.v2 literal, fenced
  code included; asserts building-a-tool.md names
  MANIFEST_SCHEMA_VERSION_V3 verbatim and documents origin_gate_matrix.
- crates/product/ironclaw_openai_compat/tests/docs_responses_contract.rs:
  docs/api/responses.mdx now carries a machine-readable
  {/* doc-fact:responses-request-policy */} marker block (invisible when
  rendered); the test parses it and drives every claim through the same
  route-level seam as the sibling *_contract.rs suites — the marker's
  values parameterize the assertions (temperature accepted at the
  documented max and rejected just above it, model accepted at the byte
  cap and rejected past it, tool_choice always 400, tools 400 without /
  registered with external-tool wiring, empty tools treated as omitted,
  unknown fields like max_output_tokens accepted and ignored, and one
  request carrying every documented field accepted).

Part of nearai#7317 (doc-truth pipeline, PR 3 of 5); stacked on nearai#7376.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: address Copilot and CodeRabbit review on doc-drift PR

- responses.mdx: tool_choice is rejected only without external-tools wiring;
  with external tools enabled it passes validation and is currently ignored
  (validate_responses_supported_fields_with_external_tools never checks it).
- building-a-tool.md: clarify that effect-derived host ports are validation
  vocabulary against the HostPortCatalog allowlist; adapters are built by
  host-runtime services after authorization/obligations, never from manifests.
- how-to-port-tool-to-reborn.md: mark the decision tree's RuntimeKind targets
  historical (v3 accepts only wasm|first_party; MCP is top-level [mcp];
  process/CLI work is the sandbox lane).
- building-a-channel.mdx: document the user install flow — virtual package
  root /system/extensions/<id>/manifest.toml, ironclaw extension search /
  install <extension-id> (ID, not path), WebUI Extensions lifecycle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(responses): align the limits bullet with the corrected tool_choice claim

The rejection list was corrected in the previous commit (tool_choice is
rejected only without external-tools wiring); the "Limits and quirks"
bullet still said "not supported ... rejected with 400". Same claim, one
wording.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(docs): tool_choice is conditionally rejected, not always

Copilot review on the docs PR caught that
validate_responses_supported_fields_with_external_tools never checks
tool_choice — with external tools wired it is accepted and ignored, not
400'd. The doc-fact marker moves tool_choice into
rejected_without_external_tools, and the dedicated test now proves both
sides: 400 naming the param on the plain router, accepted-and-ignored
(submit succeeds, nothing registers) with external-tool wiring.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: apply verified code-review findings on the drift PR

A full code review of this PR against live code surfaced claims the
original drift pass got wrong or missed; every fix below was re-verified
against the cited source before editing:

- responses.mdx: standard `ironclaw serve` deployments always wire
  external tools (OpenAiCompatRouteMountPorts requires the store/resume
  pair; mount.rs wires them unconditionally), so `tools` is accepted and
  `tool_choice` is accepted-and-ignored on shipped binaries — the
  conditional 400s apply only to custom compositions without the wiring
  (now a Note). temperature is validated and carried in the submitted turn
  payload but not applied as a provider sampling parameter. Non-streaming
  wait timeout is 30 s (DEFAULT_RESPONSES_WAIT_TIMEOUT), not 120. usage on
  retrieval is read best-effort from persisted run state incl. USD cost
  (read_run_usage), not always zero.
- building-a-tool.md: the [auth.example] oauth2_code recipe gains the
  required token_response map (deny_unknown_fields rejects the example as
  previously written); Gmail/Google Calendar corrected to first_party
  runtimes (their manifests declare kind = "first_party"); the worked
  api_key recipe is github's, not slack's; the tail "Quick implementation
  checklist" and reference list were still v2-era (script lane,
  assets/<extension>/ path, "manifest v2", v2.rs pointer) and now teach
  the v3 shape; composition/CLI package-naming claim narrowed (the binary
  does link slack/telegram adapter crates).
- contracts/extensions.md: legacy-format paragraph no longer claims
  host-bundled packages ship v2 (none do), and origin_gate_matrix is
  attributed to capability.rs + building-a-tool.md instead of
  extension-runtime/overview.md §3, which does not mention it.
- how-to-port banner: `script` manifest authoring is retired; the
  RuntimeKind::Script symbol survives as the process-sandbox lane's kind.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(contracts): repoint delivery_resolution.rs to its family directory

PR nearai#7157 (merged to main 2026-08-07) cited
crates/ironclaw_outbound/src/delivery_resolution.rs in the
communication-delivery-resolution contract; the crate lives at
crates/domains/ironclaw_outbound/. Caught by this branch's docs surface of
check-guidance.py on the first merge of main after the gate landed —
exactly the drift class it exists for.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(test-plan): route docs pages to the doc-fact tests that read them

docs/ sat in IGNORED_PREFIXES as a pure-prose class, which this PR's
doc-fact tests falsify: three cargo tests now read published pages, so
a docs-only PR would have selected zero crate tests and merged green,
leaving the failure to land on whichever unrelated change ran the full
plan next.

Published Markdown now selects the registry's schema-version sweep;
docs/using/cli.mdx and docs/api/responses.mdx additionally select
their owning crates. All selections are direct exact test targets —
no reverse-dependency widening, since prose only changes the doc-fact
assertions that read it. Fenced trees (docs/internal/, docs/reborn/,
drafts) and non-page files keep the prose classification.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): harden the docs gate and fix review-surfaced doc drift

Applies the verified findings from the PR nearai#7376 code review:

- The loop-exit and turn-runner contract docs claimed the deleted
  loop_driver_host checkpoint-rejection test had 'moved into the
  module'; it was deleted in nearai#6696 and the fenced verification command
  could not run. Both now cite the real surviving pins
  (planned_driver.rs executor test + the ironclaw_turns projection
  test mapped in scripts/reborn-e2e-rust.sh), with runnable commands.
- An unterminated comment now refuses at EOF like an unterminated
  fence; before, one typo'd closer silently un-scanned the rest of the
  file.
- Markdown links in the re-included corpora are now checked as repo
  paths (they are never published, so the Mintlify-route rationale did
  not apply); this alone added ~165 verified references.
- Each DOCS_REINCLUDED_PREFIXES entry must match at least one tracked
  page or discovery refuses, so the planned docs/reborn consolidation
  cannot silently drop the corpus from the scan.
- The living extension-runtime spec pages (overview.md,
  standard-operations.md) and guidance-conventions.md join the scan;
  guidance-conventions.md now describes the docs surface and the MDX
  marker form, and its one dangling test path is repointed.
- Floors comment corrected (57 rule globs, not 38).

Also fixes four drifted claims from nearai#7375's pages, verified against
live code: the interleaved function_call_output example was rejected
with 400 (resume input must be exclusively function_call_output items
with previous_response_id); model is echoed only on create (GET/cancel
report the 'reborn' placeholder); output_schema_ref is optional; and
the unknown-fields claim now names the two deliberate exemptions.

Self-tests: 43 pass (three new arms — unterminated comment refusal in
both syntaxes, re-included links as repo claims, stale re-included
prefix refusal).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): sync module docstring with re-included link checking

CodeRabbit caught the docstring still claiming the link extractor is
off for all of docs/** — stale since b172f69 enabled it for the
re-included corpora. The docstring now states the exception and the
current re-include set.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(docs): drop the retired reborn/ entry from the publication-fence mirrors

reborn/ left docs/.mintignore when nearai#7559 consolidated it into internal/;
the fence mirrors in docs_manifest_schema_version.rs and
reborn_pr_test_plan.py still listed it. Fixture paths follow the move.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(docs): tighten doc-fact comments and docstrings

Same behavior; module docs and test docstrings trimmed to the point.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(docs): harden the doc-fact suites per CodeRabbit review

- CLI: validate full documented command paths via `ironclaw <path> --help`
  (immediately caught and removed the nonexistent `extension activate` row)
  and match visible aliases as exact tokens, not substrings.
- Responses: seed a real prior response so `previous_response_id` is
  actually submitted and accepted; document `metadata` in the visible table
  to match the marker.
- Manifest sweep: parse the publication fence from docs/.mintignore instead
  of mirroring it, so a removed fence entry widens the scan with it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(docs): correct the completion syntax and parse the fence in the planner

Review findings (sub-agent /code-review):
- docs/using/cli.mdx taught `ironclaw completion <shell>`; the binary only
  accepts `--shell <shell>`. The contract test stops extracting at flags,
  so it could not catch this.
- The planner's doc-fact arm mirrored the .mintignore fence as constants —
  the same hand-maintained-mirror class the PR removes elsewhere. It now
  parses docs/.mintignore via docs_publication_boundary, and a .mintignore
  edit itself routes to the published sweep.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(test-plan): treat a missing docs/.mintignore as no fence, not a crash

Matches docs_publication_boundary.find_violations(): fence gone means
everything is published, so every page routes to the sweep.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(docs): replace the doc-fact count floors with derived anchors

Same move as nearai#7376's MIN_DOCS_FILES removal: MIN_DOC_COMMAND_ROWS was
redundant with the completeness check (the binary defines the expected
set), and MIN_SCANNED_PAGES is now a docs.json nav-coverage assertion —
every source-backed navigation route must be among the walked pages.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(docs): assert the current schema version instead of scanning for a retired literal

Hardcoding `reborn.extension_manifest.v2` was backward-looking: retiring
v3 would need a hand-edit or the test goes stale. The scan now extracts
every `reborn.extension_manifest.<version>` mention in published pages
and asserts it equals `MANIFEST_SCHEMA_VERSION_V3`, with the family
prefix derived from the same constant — the next schema bump retargets
the test by itself, and typo'd or older versions (v1, v33) are caught
too.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
l3ocifer pushed a commit to l3ocifer/frick-ironclaw that referenced this pull request Sep 3, 2026
* docs: consolidate docs/reborn/ into docs/internal/reborn/

Move-only migration; no content changes beyond path references. Executes
the follow-up that PR nearai#7259 left open: docs/.mintignore's reborn/ entry
was kept only because the path was load-bearing, and its comment
documented that it moves under internal/ once its consumers move with it.

- git mv docs/reborn docs/internal/reborn (115 files, history preserved)
- rewrite docs/reborn -> docs/internal/reborn across every consumer
  (crate AGENTS/READMEs and doc-comments, .claude/ skills and rules,
  AGENTS.md, CI scripts, reborn-e2e.yml path filters, Dockerfile, tests,
  docs/internal plans)
- fix six relative internal/adr/ links inside the moved tree for the
  added directory level
- drop reborn/ from docs/.mintignore and FROZEN_MINTIGNORE_PATTERNS in
  scripts/ci/docs_publication_boundary.py (the frozen list only ever
  shrinks); internal/ already fences the new location

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci: classify tests/dockerfile_runtime_home.rs and shrink boundary self-test fixture

Two CI gates failed on the docs/reborn consolidation and forced decisions
this commit records:

- The Reborn PR test planner failed closed on tests/dockerfile_runtime_home.rs
  (its path-rewrite edit is functional: the test reads the moved deploy doc).
  The file was deliberately unmapped because no lane inventoried it. Decide it
  now: _root_test_partitions() and run-reborn-root-partition.sh both inventory
  it alongside support_unit_tests.rs, so the hermetic root-partition lanes run
  it (they previously ran it nowhere) and a change to it selects its partition.
  With the reader laned, map the two config.hosted-single-tenant*.toml readers
  it owns in DOCKER_RUNTIME_CONFIG_OWNERS — root-test owners select their root
  partition, completing the per-file decision set the planner comments left
  open. docker/process-sandbox-entrypoint.sh stays fail-closed.
- test_docs_publication_boundary.py's subset fixture still listed reborn/ in
  the frozen mintignore list; use the surviving entries.

Verified: both self-test suites pass (77 planner + boundary), the planner
emits a valid selected plan for this PR's full 342-path diff, shell and
Python inventories agree on partition assignment (index 0), and
dockerfile_runtime_home passes (19 tests).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
l3ocifer pushed a commit to l3ocifer/frick-ironclaw that referenced this pull request Sep 3, 2026
…oc-truth PR 2/5) (nearai#7376)

* docs: fix live drift in extension, responses API, and channel docs

The public tutorial taught the retired manifest v2 authoring format
([[host_api]] / [capability_provider.tools] / runtime_credentials), which
the v3 parser hard-rejects, and never mentioned origin_gate_matrix; the
Responses API page claimed temperature is rejected (accepted 0.0-2.0 and
forwarded), claimed model must be "default" (any well-formed name <= 256
bytes), claimed max_output_tokens is rejected (accepted and ignored by DTO
policy), and omitted the required model field from every request example;
the channel tutorial pointed at two files that no longer exist.

- docs/extensions/building-a-tool.md: rewrite manifest sections to the v3
  [[tools]] / [[tools.credentials]] / [auth.<vendor>] shape, document
  origin_gate_matrix (origins, policies, ratchet), correct the hosted-MCP
  [mcp] section, packaging via ironclaw_extension_support package modules,
  and v3 test references; drop the nonexistent script runtime kind.
- docs/api/responses.mdx: correct model/temperature/tools/tool_choice
  rejection rules, document unknown-field tolerance, add the required
  model field to all 15 request examples.
- docs/channels/building-a-channel.mdx: replace dead
  crates/ironclaw_first_party_extensions + available_extensions.rs
  registration instructions with the current package-directory mechanism.
- docs/reborn/contracts/extensions.md: state that production manifests
  author v3 (lowering into the v2 resolved model described there); label
  the v2 examples as legacy.
- docs/reborn/how-to-port-tool-to-reborn.md: superseded banner pointing at
  the v3 guides.

Part of nearai#7317 (doc-truth pipeline, PR 1 of 5).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): extend the reference gate to the docs/ surface

The public Mintlify tree had no path-reference validation — a published
tutorial told contributors to edit files that no longer exist and nothing
caught it. check-guidance.py already owned the machinery (tracked-tree
resolution, fence exclusion, suppress markers, shrink-only debt, fail-closed
floors), so the docs surface joins the same gate rather than a fork.

- discover_guidance() now collects every tracked docs/**.md|.mdx: published
  pages, the zh/ locale mirror, and the living contract corpus
  docs/reborn/contracts/. Dated archives (docs/internal/, the non-contract
  parts of docs/reborn/) are excluded as classes — measured 2026-08-07,
  705 of 709 dangling docs references sat in those historical corpora, and
  forcing dated plans/ADRs to track today's tree would either rewrite
  history or drown KNOWN_MISSING.
- docs/ files extract backticked inline paths only; Mintlify markdown link
  targets are site routes (extensionless pages, site-absolute /using/cli),
  a different namespace than the tracked tree, so the link extractor is off
  there by design.
- _reference_lines learns MDX comments ({/* ... */}), including
  {/* check-guidance: path-ok */} as the .mdx suppress-marker form, with the
  same one-reference-per-marker and multi-line semantics as HTML comments.
- Floors re-measured and re-dated (364 files / 2276 references; floors
  180/1100), plus a dedicated MIN_DOCS_FILES=60 floor: the aggregate floors
  sit below the guidance-only remainder, so the docs branch of discovery
  silently breaking needs its own refusal. --json now reports docs_files.
- Fixes the four real dangles the new scan found in docs/reborn/contracts/
  (moved nested_dispatch_stream.rs test home, retired event-store migrations
  directory, loop_driver_host tests->src move). KNOWN_MISSING stays empty.
- Self-tests: 8 new cases (dangling docs path fails; Mintlify links are not
  references; MDX marker suppresses exactly one reference; multi-line MDX
  comment hides content; zh discovered; archives excluded but contracts
  scanned; docs fence fails closed; docs floor refuses).
- ws12_workflow_contracts.py: docs/api/responses.mdx and docs/zh/index.mdx
  join the has_guidance in-scope probes so a narrowed trigger regex cannot
  silently skip the gate for public docs.

Part of nearai#7317 (doc-truth pipeline, PR 2 of 5); stacked on nearai#7375.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: address Copilot and CodeRabbit review on doc-drift PR

- responses.mdx: tool_choice is rejected only without external-tools wiring;
  with external tools enabled it passes validation and is currently ignored
  (validate_responses_supported_fields_with_external_tools never checks it).
- building-a-tool.md: clarify that effect-derived host ports are validation
  vocabulary against the HostPortCatalog allowlist; adapters are built by
  host-runtime services after authorization/obligations, never from manifests.
- how-to-port-tool-to-reborn.md: mark the decision tree's RuntimeKind targets
  historical (v3 accepts only wasm|first_party; MCP is top-level [mcp];
  process/CLI work is the sandbox lane).
- building-a-channel.mdx: document the user install flow — virtual package
  root /system/extensions/<id>/manifest.toml, ironclaw extension search /
  install <extension-id> (ID, not path), WebUI Extensions lifecycle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(responses): align the limits bullet with the corrected tool_choice claim

The rejection list was corrected in the previous commit (tool_choice is
rejected only without external-tools wiring); the "Limits and quirks"
bullet still said "not supported ... rejected with 400". Same claim, one
wording.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: apply verified code-review findings on the drift PR

A full code review of this PR against live code surfaced claims the
original drift pass got wrong or missed; every fix below was re-verified
against the cited source before editing:

- responses.mdx: standard `ironclaw serve` deployments always wire
  external tools (OpenAiCompatRouteMountPorts requires the store/resume
  pair; mount.rs wires them unconditionally), so `tools` is accepted and
  `tool_choice` is accepted-and-ignored on shipped binaries — the
  conditional 400s apply only to custom compositions without the wiring
  (now a Note). temperature is validated and carried in the submitted turn
  payload but not applied as a provider sampling parameter. Non-streaming
  wait timeout is 30 s (DEFAULT_RESPONSES_WAIT_TIMEOUT), not 120. usage on
  retrieval is read best-effort from persisted run state incl. USD cost
  (read_run_usage), not always zero.
- building-a-tool.md: the [auth.example] oauth2_code recipe gains the
  required token_response map (deny_unknown_fields rejects the example as
  previously written); Gmail/Google Calendar corrected to first_party
  runtimes (their manifests declare kind = "first_party"); the worked
  api_key recipe is github's, not slack's; the tail "Quick implementation
  checklist" and reference list were still v2-era (script lane,
  assets/<extension>/ path, "manifest v2", v2.rs pointer) and now teach
  the v3 shape; composition/CLI package-naming claim narrowed (the binary
  does link slack/telegram adapter crates).
- contracts/extensions.md: legacy-format paragraph no longer claims
  host-bundled packages ship v2 (none do), and origin_gate_matrix is
  attributed to capability.rs + building-a-tool.md instead of
  extension-runtime/overview.md §3, which does not mention it.
- how-to-port banner: `script` manifest authoring is retired; the
  RuntimeKind::Script symbol survives as the process-sandbox lane's kind.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(contracts): repoint delivery_resolution.rs to its family directory

PR nearai#7157 (merged to main 2026-08-07) cited
crates/ironclaw_outbound/src/delivery_resolution.rs in the
communication-delivery-resolution contract; the crate lives at
crates/domains/ironclaw_outbound/. Caught by this branch's docs surface of
check-guidance.py on the first merge of main after the gate landed —
exactly the drift class it exists for.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): harden the docs gate and fix review-surfaced doc drift

Applies the verified findings from the PR nearai#7376 code review:

- The loop-exit and turn-runner contract docs claimed the deleted
  loop_driver_host checkpoint-rejection test had 'moved into the
  module'; it was deleted in nearai#6696 and the fenced verification command
  could not run. Both now cite the real surviving pins
  (planned_driver.rs executor test + the ironclaw_turns projection
  test mapped in scripts/reborn-e2e-rust.sh), with runnable commands.
- An unterminated comment now refuses at EOF like an unterminated
  fence; before, one typo'd closer silently un-scanned the rest of the
  file.
- Markdown links in the re-included corpora are now checked as repo
  paths (they are never published, so the Mintlify-route rationale did
  not apply); this alone added ~165 verified references.
- Each DOCS_REINCLUDED_PREFIXES entry must match at least one tracked
  page or discovery refuses, so the planned docs/reborn consolidation
  cannot silently drop the corpus from the scan.
- The living extension-runtime spec pages (overview.md,
  standard-operations.md) and guidance-conventions.md join the scan;
  guidance-conventions.md now describes the docs surface and the MDX
  marker form, and its one dangling test path is repointed.
- Floors comment corrected (57 rule globs, not 38).

Also fixes four drifted claims from nearai#7375's pages, verified against
live code: the interleaved function_call_output example was rejected
with 400 (resume input must be exclusively function_call_output items
with previous_response_id); model is echoed only on create (GET/cancel
report the 'reborn' placeholder); output_schema_ref is optional; and
the unknown-fields claim now names the two deliberate exemptions.

Self-tests: 43 pass (three new arms — unterminated comment refusal in
both syntaxes, re-included links as repo claims, stale re-included
prefix refusal).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): sync module docstring with re-included link checking

CodeRabbit caught the docstring still claiming the link extractor is
off for all of docs/** — stale since b172f69 enabled it for the
re-included corpora. The docstring now states the exception and the
current re-include set.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): drop the docs/reborn re-include machinery after the docs/internal migration

The docs-surface scan carried a double negative — exclude docs/reborn/ as
an archive class, then re-include its living pages via
DOCS_REINCLUDED_PREFIXES — because the old tree mixed dead archives with
living specs. nearai#7559 moved everything under docs/internal/, so the structure
is now: one excluded archive class (docs/internal/), and the living spec
pages (the contract corpus, the two extension-runtime spec pages,
guidance-conventions.md) named in INTERNAL_GUIDANCE_PREFIXES and scanned as
first-class guidance files — full link checking, guarded by the same
per-prefix zero-match refusal. The published-docs floor now counts only the
Mintlify surface (measured 2026-08-13: 82 pages; floor re-halved to 40).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): validate docs discovery against docs.json navigation instead of a count floor

MIN_DOCS_FILES was an arbitrary magnitude tripwire (half of last measured,
hand-re-dated) that only caught the docs branch of discovery losing ~half
its pages. The published surface already has an independent definition —
docs.json navigation, owned by docs_publication_boundary.py — so the gate
now asserts every navigation page's source file is in the reference scan
(reusing the boundary script's nav walker and OpenAPI pseudo-page filter).
Discovery breaking refuses on the first missing published page, unreadable
or page-less navigation refuses rather than passing vacuously, and there
is no docs count floor left to tune. --json reports nav_pages_covered.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): count the living internal spec pages in the docs_files metric

CodeRabbit: docs_files under-reported the scan — the living internal spec
pages are scanned docs files but were excluded from the count, a leftover
of the deleted MIN_DOCS_FILES floor's published-only semantics. The metric
now reports every scanned file under docs/ (131 at measurement); published
surface health has its own signal in nav_pages_covered.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): tighten comments and docstrings

Same behavior; the docs-surface comments and test docstrings were carrying
paragraph-length rationale better kept in the PR description.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
l3ocifer pushed a commit to l3ocifer/frick-ironclaw that referenced this pull request Sep 3, 2026
…claims (doc-truth PR 3/5) (nearai#7378)

* docs: fix live drift in extension, responses API, and channel docs

The public tutorial taught the retired manifest v2 authoring format
([[host_api]] / [capability_provider.tools] / runtime_credentials), which
the v3 parser hard-rejects, and never mentioned origin_gate_matrix; the
Responses API page claimed temperature is rejected (accepted 0.0-2.0 and
forwarded), claimed model must be "default" (any well-formed name <= 256
bytes), claimed max_output_tokens is rejected (accepted and ignored by DTO
policy), and omitted the required model field from every request example;
the channel tutorial pointed at two files that no longer exist.

- docs/extensions/building-a-tool.md: rewrite manifest sections to the v3
  [[tools]] / [[tools.credentials]] / [auth.<vendor>] shape, document
  origin_gate_matrix (origins, policies, ratchet), correct the hosted-MCP
  [mcp] section, packaging via ironclaw_extension_support package modules,
  and v3 test references; drop the nonexistent script runtime kind.
- docs/api/responses.mdx: correct model/temperature/tools/tool_choice
  rejection rules, document unknown-field tolerance, add the required
  model field to all 15 request examples.
- docs/channels/building-a-channel.mdx: replace dead
  crates/ironclaw_first_party_extensions + available_extensions.rs
  registration instructions with the current package-directory mechanism.
- docs/reborn/contracts/extensions.md: state that production manifests
  author v3 (lowering into the v2 resolved model described there); label
  the v2 examples as legacy.
- docs/reborn/how-to-port-tool-to-reborn.md: superseded banner pointing at
  the v3 guides.

Part of nearai#7317 (doc-truth pipeline, PR 1 of 5).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): extend the reference gate to the docs/ surface

The public Mintlify tree had no path-reference validation — a published
tutorial told contributors to edit files that no longer exist and nothing
caught it. check-guidance.py already owned the machinery (tracked-tree
resolution, fence exclusion, suppress markers, shrink-only debt, fail-closed
floors), so the docs surface joins the same gate rather than a fork.

- discover_guidance() now collects every tracked docs/**.md|.mdx: published
  pages, the zh/ locale mirror, and the living contract corpus
  docs/reborn/contracts/. Dated archives (docs/internal/, the non-contract
  parts of docs/reborn/) are excluded as classes — measured 2026-08-07,
  705 of 709 dangling docs references sat in those historical corpora, and
  forcing dated plans/ADRs to track today's tree would either rewrite
  history or drown KNOWN_MISSING.
- docs/ files extract backticked inline paths only; Mintlify markdown link
  targets are site routes (extensionless pages, site-absolute /using/cli),
  a different namespace than the tracked tree, so the link extractor is off
  there by design.
- _reference_lines learns MDX comments ({/* ... */}), including
  {/* check-guidance: path-ok */} as the .mdx suppress-marker form, with the
  same one-reference-per-marker and multi-line semantics as HTML comments.
- Floors re-measured and re-dated (364 files / 2276 references; floors
  180/1100), plus a dedicated MIN_DOCS_FILES=60 floor: the aggregate floors
  sit below the guidance-only remainder, so the docs branch of discovery
  silently breaking needs its own refusal. --json now reports docs_files.
- Fixes the four real dangles the new scan found in docs/reborn/contracts/
  (moved nested_dispatch_stream.rs test home, retired event-store migrations
  directory, loop_driver_host tests->src move). KNOWN_MISSING stays empty.
- Self-tests: 8 new cases (dangling docs path fails; Mintlify links are not
  references; MDX marker suppresses exactly one reference; multi-line MDX
  comment hides content; zh discovered; archives excluded but contracts
  scanned; docs fence fails closed; docs floor refuses).
- ws12_workflow_contracts.py: docs/api/responses.mdx and docs/zh/index.mdx
  join the has_guidance in-scope probes so a narrowed trigger regex cannot
  silently skip the gate for public docs.

Part of nearai#7317 (doc-truth pipeline, PR 2 of 5); stacked on nearai#7375.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(docs): pin CLI, manifest, and Responses doc claims to code

Three deterministic doc-fact contract tests, each living in the crate that
owns the truth it checks, so the drift nearai#7317 describes fails CI instead of
shipping:

- crates/app/ironclaw_cli/tests/docs_cli_reference.rs: parses the real
  binary's --help and cross-checks docs/using/cli.mdx table rows both ways
  (every visible subcommand documented, any alias form counting; every
  documented command real), with a fail-closed row floor. Doc gaps this
  surfaced are fixed here: ironhub had no rows at all, completion was
  fence-only, and the Trace Commons table lacked the `ironclaw` prefix the
  rest of the page uses.
- crates/extensions/ironclaw_extension_registry/tests/
  docs_manifest_schema_version.rs: walks the published docs tree (the
  frozen .mintignore fence mirrored as constants) and asserts zero
  occurrences of the retired reborn.extension_manifest.v2 literal, fenced
  code included; asserts building-a-tool.md names
  MANIFEST_SCHEMA_VERSION_V3 verbatim and documents origin_gate_matrix.
- crates/product/ironclaw_openai_compat/tests/docs_responses_contract.rs:
  docs/api/responses.mdx now carries a machine-readable
  {/* doc-fact:responses-request-policy */} marker block (invisible when
  rendered); the test parses it and drives every claim through the same
  route-level seam as the sibling *_contract.rs suites — the marker's
  values parameterize the assertions (temperature accepted at the
  documented max and rejected just above it, model accepted at the byte
  cap and rejected past it, tool_choice always 400, tools 400 without /
  registered with external-tool wiring, empty tools treated as omitted,
  unknown fields like max_output_tokens accepted and ignored, and one
  request carrying every documented field accepted).

Part of nearai#7317 (doc-truth pipeline, PR 3 of 5); stacked on nearai#7376.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: address Copilot and CodeRabbit review on doc-drift PR

- responses.mdx: tool_choice is rejected only without external-tools wiring;
  with external tools enabled it passes validation and is currently ignored
  (validate_responses_supported_fields_with_external_tools never checks it).
- building-a-tool.md: clarify that effect-derived host ports are validation
  vocabulary against the HostPortCatalog allowlist; adapters are built by
  host-runtime services after authorization/obligations, never from manifests.
- how-to-port-tool-to-reborn.md: mark the decision tree's RuntimeKind targets
  historical (v3 accepts only wasm|first_party; MCP is top-level [mcp];
  process/CLI work is the sandbox lane).
- building-a-channel.mdx: document the user install flow — virtual package
  root /system/extensions/<id>/manifest.toml, ironclaw extension search /
  install <extension-id> (ID, not path), WebUI Extensions lifecycle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(responses): align the limits bullet with the corrected tool_choice claim

The rejection list was corrected in the previous commit (tool_choice is
rejected only without external-tools wiring); the "Limits and quirks"
bullet still said "not supported ... rejected with 400". Same claim, one
wording.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(docs): tool_choice is conditionally rejected, not always

Copilot review on the docs PR caught that
validate_responses_supported_fields_with_external_tools never checks
tool_choice — with external tools wired it is accepted and ignored, not
400'd. The doc-fact marker moves tool_choice into
rejected_without_external_tools, and the dedicated test now proves both
sides: 400 naming the param on the plain router, accepted-and-ignored
(submit succeeds, nothing registers) with external-tool wiring.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: apply verified code-review findings on the drift PR

A full code review of this PR against live code surfaced claims the
original drift pass got wrong or missed; every fix below was re-verified
against the cited source before editing:

- responses.mdx: standard `ironclaw serve` deployments always wire
  external tools (OpenAiCompatRouteMountPorts requires the store/resume
  pair; mount.rs wires them unconditionally), so `tools` is accepted and
  `tool_choice` is accepted-and-ignored on shipped binaries — the
  conditional 400s apply only to custom compositions without the wiring
  (now a Note). temperature is validated and carried in the submitted turn
  payload but not applied as a provider sampling parameter. Non-streaming
  wait timeout is 30 s (DEFAULT_RESPONSES_WAIT_TIMEOUT), not 120. usage on
  retrieval is read best-effort from persisted run state incl. USD cost
  (read_run_usage), not always zero.
- building-a-tool.md: the [auth.example] oauth2_code recipe gains the
  required token_response map (deny_unknown_fields rejects the example as
  previously written); Gmail/Google Calendar corrected to first_party
  runtimes (their manifests declare kind = "first_party"); the worked
  api_key recipe is github's, not slack's; the tail "Quick implementation
  checklist" and reference list were still v2-era (script lane,
  assets/<extension>/ path, "manifest v2", v2.rs pointer) and now teach
  the v3 shape; composition/CLI package-naming claim narrowed (the binary
  does link slack/telegram adapter crates).
- contracts/extensions.md: legacy-format paragraph no longer claims
  host-bundled packages ship v2 (none do), and origin_gate_matrix is
  attributed to capability.rs + building-a-tool.md instead of
  extension-runtime/overview.md §3, which does not mention it.
- how-to-port banner: `script` manifest authoring is retired; the
  RuntimeKind::Script symbol survives as the process-sandbox lane's kind.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(contracts): repoint delivery_resolution.rs to its family directory

PR nearai#7157 (merged to main 2026-08-07) cited
crates/ironclaw_outbound/src/delivery_resolution.rs in the
communication-delivery-resolution contract; the crate lives at
crates/domains/ironclaw_outbound/. Caught by this branch's docs surface of
check-guidance.py on the first merge of main after the gate landed —
exactly the drift class it exists for.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(test-plan): route docs pages to the doc-fact tests that read them

docs/ sat in IGNORED_PREFIXES as a pure-prose class, which this PR's
doc-fact tests falsify: three cargo tests now read published pages, so
a docs-only PR would have selected zero crate tests and merged green,
leaving the failure to land on whichever unrelated change ran the full
plan next.

Published Markdown now selects the registry's schema-version sweep;
docs/using/cli.mdx and docs/api/responses.mdx additionally select
their owning crates. All selections are direct exact test targets —
no reverse-dependency widening, since prose only changes the doc-fact
assertions that read it. Fenced trees (docs/internal/, docs/reborn/,
drafts) and non-page files keep the prose classification.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): harden the docs gate and fix review-surfaced doc drift

Applies the verified findings from the PR nearai#7376 code review:

- The loop-exit and turn-runner contract docs claimed the deleted
  loop_driver_host checkpoint-rejection test had 'moved into the
  module'; it was deleted in nearai#6696 and the fenced verification command
  could not run. Both now cite the real surviving pins
  (planned_driver.rs executor test + the ironclaw_turns projection
  test mapped in scripts/reborn-e2e-rust.sh), with runnable commands.
- An unterminated comment now refuses at EOF like an unterminated
  fence; before, one typo'd closer silently un-scanned the rest of the
  file.
- Markdown links in the re-included corpora are now checked as repo
  paths (they are never published, so the Mintlify-route rationale did
  not apply); this alone added ~165 verified references.
- Each DOCS_REINCLUDED_PREFIXES entry must match at least one tracked
  page or discovery refuses, so the planned docs/reborn consolidation
  cannot silently drop the corpus from the scan.
- The living extension-runtime spec pages (overview.md,
  standard-operations.md) and guidance-conventions.md join the scan;
  guidance-conventions.md now describes the docs surface and the MDX
  marker form, and its one dangling test path is repointed.
- Floors comment corrected (57 rule globs, not 38).

Also fixes four drifted claims from nearai#7375's pages, verified against
live code: the interleaved function_call_output example was rejected
with 400 (resume input must be exclusively function_call_output items
with previous_response_id); model is echoed only on create (GET/cancel
report the 'reborn' placeholder); output_schema_ref is optional; and
the unknown-fields claim now names the two deliberate exemptions.

Self-tests: 43 pass (three new arms — unterminated comment refusal in
both syntaxes, re-included links as repo claims, stale re-included
prefix refusal).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(check-guidance): sync module docstring with re-included link checking

CodeRabbit caught the docstring still claiming the link extractor is
off for all of docs/** — stale since b172f69 enabled it for the
re-included corpora. The docstring now states the exception and the
current re-include set.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(docs): drop the retired reborn/ entry from the publication-fence mirrors

reborn/ left docs/.mintignore when nearai#7559 consolidated it into internal/;
the fence mirrors in docs_manifest_schema_version.rs and
reborn_pr_test_plan.py still listed it. Fixture paths follow the move.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(docs): tighten doc-fact comments and docstrings

Same behavior; module docs and test docstrings trimmed to the point.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(docs): harden the doc-fact suites per CodeRabbit review

- CLI: validate full documented command paths via `ironclaw <path> --help`
  (immediately caught and removed the nonexistent `extension activate` row)
  and match visible aliases as exact tokens, not substrings.
- Responses: seed a real prior response so `previous_response_id` is
  actually submitted and accepted; document `metadata` in the visible table
  to match the marker.
- Manifest sweep: parse the publication fence from docs/.mintignore instead
  of mirroring it, so a removed fence entry widens the scan with it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(docs): correct the completion syntax and parse the fence in the planner

Review findings (sub-agent /code-review):
- docs/using/cli.mdx taught `ironclaw completion <shell>`; the binary only
  accepts `--shell <shell>`. The contract test stops extracting at flags,
  so it could not catch this.
- The planner's doc-fact arm mirrored the .mintignore fence as constants —
  the same hand-maintained-mirror class the PR removes elsewhere. It now
  parses docs/.mintignore via docs_publication_boundary, and a .mintignore
  edit itself routes to the published sweep.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(test-plan): treat a missing docs/.mintignore as no fence, not a crash

Matches docs_publication_boundary.find_violations(): fence gone means
everything is published, so every page routes to the sweep.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(docs): replace the doc-fact count floors with derived anchors

Same move as nearai#7376's MIN_DOCS_FILES removal: MIN_DOC_COMMAND_ROWS was
redundant with the completeness check (the binary defines the expected
set), and MIN_SCANNED_PAGES is now a docs.json nav-coverage assertion —
every source-backed navigation route must be among the walked pages.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* test(docs): assert the current schema version instead of scanning for a retired literal

Hardcoding `reborn.extension_manifest.v2` was backward-looking: retiring
v3 would need a hand-edit or the test goes stale. The scan now extracts
every `reborn.extension_manifest.<version>` mention in published pages
and asserts it equals `MANIFEST_SCHEMA_VERSION_V3`, with the family
prefix derived from the same constant — the next schema bump retargets
the test by itself, and typo'd or older versions (v1, v33) are caught
too.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

contributor: experienced 6-19 merged PRs risk: medium Business logic, config, or moderate-risk modules scope: ci CI/CD workflows scope: docs Documentation scope: sandbox Docker sandbox size: XL 500+ changed lines

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants