diff --git a/.agents/skills/harness-improvement/references/platforms/codex.md b/.agents/skills/harness-improvement/references/platforms/codex.md index 23ab9968d7..6929593610 100644 --- a/.agents/skills/harness-improvement/references/platforms/codex.md +++ b/.agents/skills/harness-improvement/references/platforms/codex.md @@ -76,9 +76,10 @@ Codex subagents inherit the parent sandbox policy and live runtime overrides. A Use read-only sandbox for review, exploration, and security agents. Use write access only for implementers or fixers. -Kandev maintains only the read-only `.codex/agents/pr-poller.toml`, using Codex -Spark for an explicitly user-authorized PR wait. Other project-local agents -require the user's explicit request and cost approval. +Kandev maintains only the read-only `.codex/agents/pr-poller.toml`, using +GPT-5.6 Luna at medium reasoning effort for an explicitly user-authorized PR +wait. Other project-local agents require the user's explicit request and cost +approval. ## Conversion Notes diff --git a/.codex/agents/pr-poller.toml b/.codex/agents/pr-poller.toml index 41b9d1e730..ce9a56b82d 100644 --- a/.codex/agents/pr-poller.toml +++ b/.codex/agents/pr-poller.toml @@ -1,7 +1,7 @@ name = "pr-poller" -description = "Read-only GPT-5.3 Codex Spark monitor for a user-authorized wait on PR CI or review updates." -model = "gpt-5.3-codex-spark" -model_reasoning_effort = "low" +description = "Read-only GPT-5.6 Luna monitor for a user-authorized wait on PR CI or review updates." +model = "gpt-5.6-luna" +model_reasoning_effort = "medium" sandbox_mode = "read-only" developer_instructions = """ Poll one named GitHub PR and return a compact status report to the primary diff --git a/.github/scripts/pr-docs.cjs b/.github/scripts/pr-docs.cjs index 3600addab3..6b60764ff3 100644 --- a/.github/scripts/pr-docs.cjs +++ b/.github/scripts/pr-docs.cjs @@ -98,6 +98,18 @@ function pathExemption(pathname) { if (/\.(?:md|mdx|markdown)$/i.test(pathname)) { return 'Markdown file'; } + if (/^\.codex\/agents\/[^/]+\.toml$/.test(pathname)) { + return 'Codex agent definition'; + } + if (pathname === '.codex/config.toml') { + return 'Codex configuration'; + } + if (pathname === '.claude/settings.json') { + return 'Claude configuration'; + } + if (/^\.cursor\/rules\/[^/]+\.mdc$/.test(pathname)) { + return 'Cursor rule'; + } if (/_test\.go$/i.test(pathname)) { return 'Go test file'; } diff --git a/.github/scripts/pr-docs.test.cjs b/.github/scripts/pr-docs.test.cjs index 2cad3c1df1..1279e9f0cc 100644 --- a/.github/scripts/pr-docs.test.cjs +++ b/.github/scripts/pr-docs.test.cjs @@ -39,6 +39,25 @@ test('recognized documentation-only paths are exempt', () => { assert.equal(result.exemptPaths.length, 9); }); +// @covers AC-CI-PR-DOCS-001.2 +test('recognized harness configuration paths are exempt', () => { + const result = validator.classifyChangedFiles([ + { filename: '.codex/agents/pr-poller.toml', status: 'modified' }, + { filename: '.codex/config.toml', status: 'modified' }, + { filename: '.claude/settings.json', status: 'modified' }, + { filename: '.cursor/rules/kandev-harness.mdc', status: 'modified' }, + ]); + + assert.equal(result.requiresCoverage, false); + assert.deepEqual(result.triggeringPaths, []); + assert.deepEqual(result.exemptPaths, [ + '.codex/agents/pr-poller.toml', + '.codex/config.toml', + '.claude/settings.json', + '.cursor/rules/kandev-harness.mdc', + ]); +}); + // @covers AC-CI-PR-DOCS-001.3 test('shipped files and unsupported test-like paths require coverage', () => { const result = validator.classifyChangedFiles([ diff --git a/docs/decisions/2026-09-10-pr-documentation-coverage.md b/docs/decisions/2026-09-10-pr-documentation-coverage.md index 5ddb94fd2c..f08931ff1e 100644 --- a/docs/decisions/2026-09-10-pr-documentation-coverage.md +++ b/docs/decisions/2026-09-10-pr-documentation-coverage.md @@ -20,6 +20,8 @@ Other changes require a changed work order linked to a plan, requirements, accep Previously merged specifications can be referenced without cosmetic edits. Reviewers judge whether changed behavior needs updated contracts. The override persists while the label is present and affects only this check. +Harness configuration and definitions are exempt when they use the repository's recognized harness formats: Codex agent or config TOML, Claude settings JSON, or Cursor rule MDC. Markdown harness files are covered by the general Markdown exemption. This avoids requiring delivery records for contributor tooling changes while keeping arbitrary JSON, YAML, and other files subject to normal evaluation. + CI owns this policy. It does not require use of a particular agent or prove that plans were committed before code. The check reports failures before ruleset activation; mandatory merge enforcement requires a separately verified administrator rollout. diff --git a/docs/plans/pr-documentation-coverage/task-01-coverage-validator.md b/docs/plans/pr-documentation-coverage/task-01-coverage-validator.md index c7c1cec0ae..1d10643861 100644 --- a/docs/plans/pr-documentation-coverage/task-01-coverage-validator.md +++ b/docs/plans/pr-documentation-coverage/task-01-coverage-validator.md @@ -135,3 +135,22 @@ evaluator. Workflow permissions, bounds, policy, and status rules are unchanged. Internal docs updated only. This CI implementation change has no public product documentation or screenshot impact. + +### Harness path exemption regression, 2026-09-13 + +The path classifier now exempts the non-Markdown harness formats recognized by +the repository harness linter: Codex agent and config TOML, Claude settings +JSON, and Cursor rule MDC. Markdown harness files remain covered by the +existing Markdown exemption. Arbitrary JSON, YAML, scripts, and other files +remain subject to coverage. + +TDD evidence: + +- Red: a fixture containing the four supported harness formats required + documentation coverage. +- Green: the same fixture is exempt, while unrelated implementation paths + still trigger coverage. +- `node --test .github/scripts/pr-docs.test.cjs`: 51 tests passed. +- `python3 scripts/lint-spec-files.test.py`: 36 tests passed. +- `python3 scripts/lint-spec-files.py --all`: passed. +- `git diff --check`: passed. diff --git a/docs/specs/ci/requirements/pull-request-documentation-coverage.md b/docs/specs/ci/requirements/pull-request-documentation-coverage.md index 39e4baa38e..fd9d31c26a 100644 --- a/docs/specs/ci/requirements/pull-request-documentation-coverage.md +++ b/docs/specs/ci/requirements/pull-request-documentation-coverage.md @@ -23,7 +23,7 @@ Contributors can write the artifacts manually; use of the repository harness is #### Acceptance criteria - **AC-CI-PR-DOCS-001.1:** Every open pull request shall receive a documentation coverage result, including drafts and forks. -- **AC-CI-PR-DOCS-001.2:** A pull request containing only recognized documentation, tests, translation catalogs, or dependency lock changes shall pass without a delivery package. +- **AC-CI-PR-DOCS-001.2:** A pull request containing only recognized documentation, tests, translation catalogs, dependency lock, or harness changes shall pass without a delivery package. - **AC-CI-PR-DOCS-001.3:** Other changes shall require an added or modified work order, its plan, and linked requirements and system designs. Changing the title to `fix`, `chore`, or `refactor` shall not exempt the change. - **AC-CI-PR-DOCS-001.4:** Existing plans and specifications shall qualify when the work order references them and they exist in the proposed revision. Contributors shall update contracts when behavior changes, but shall not need meaningless edits to unchanged contracts. - **AC-CI-PR-DOCS-001.5:** A deleted artifact, empty file, unresolved reference, unrelated unlinked document, or work order without requirement and acceptance references shall not satisfy coverage. diff --git a/docs/specs/ci/system-design/pull-request-documentation-coverage.md b/docs/specs/ci/system-design/pull-request-documentation-coverage.md index e45c040e0e..11bd75bf34 100644 --- a/docs/specs/ci/system-design/pull-request-documentation-coverage.md +++ b/docs/specs/ci/system-design/pull-request-documentation-coverage.md @@ -41,6 +41,7 @@ Initial exemptions: - Go `*_test.go`; JS/TS `*.test.*` and `*.spec.*` restricted to JS/TS source extensions; `apps/web/e2e/**`. - `apps/web/src/locales//.json`. - Exact lock basenames `pnpm-lock.yaml`, `package-lock.json`, `yarn.lock`, `go.sum`, and `Cargo.lock`. +- Recognized non-Markdown harness files: `.codex/agents/*.toml`, `.codex/config.toml`, `.claude/settings.json`, and `.cursor/rules/*.mdc`. Do not exempt all JSON, YAML, assets, scripts, package manifests, Rust files, workflows, generated directories, or files containing the word `test`. These can change shipped behavior or repository contracts. Add exemptions later only with concrete fixtures.