Skip to content

fix: 2026-11-03 principal review findings (7.3.0) - #416

Merged
PrzemekGalarowicz merged 104 commits into
mainfrom
batch/audit-2026-11-03
Nov 4, 2026
Merged

PrzemekGalarowicz merged 104 commits into
mainfrom
batch/audit-2026-11-03

Conversation

@PrzemekGalarowicz

Copy link
Copy Markdown
Member

Fixes the findings of the 2026-11-03 principal review of main @ dd0bb3d (7.2.1) in one release, 7.3.0.

Ten fix groups each ran on their own branch (nine through /pharn-dev-ship, one small-fixes group without it) and were merged into batch/audit-2026-11-03. Every edit to a protected file (the four hooks, .claude/settings.json, the four trusted docs, memory-bank canon) was applied by the maintainer through a sha256-pinned script. Each hook script was first reviewed by an independent adversarial agent in a throwaway clone; the scope-setter patch was sent back twice before it passed. GATE 1 and GATE 2 of every group were decided by the batch orchestrator (a model) under the maintainer's delegation, and each SHIP.md records them that way.

What changed

  • Plan scope (BLOCKER, narrowed, not closed): set-writes-scope.cjs --from-plan refuses the following:

    • memory-bank canon, everywhere, with no opt-in;
    • CI and hook config (.github/workflows, .github/actions, .husky, core.hooksPath, .mcp.json), everywhere, unless a human opts in;
    • instruction files (CLAUDE.md, CLAUDE.local.md, AGENTS.md) in an installed project;
    • PHARN's own surface and the instruction files while a /pharn-loop or /pharn-ship marker is open;
    • absolute, escaping, --led and quoted entries;
    • ## Files lists that hide items in comments, raw HTML or split sections.

    The dev build's formatter step passes paths NUL-separated, after --, and only for literal regular files. A model-approved dev plan with no product run open can still scope pharn/floor/**; GATE 1 and GitHub review guard that.

  • Guards: "onFailure": "block" is set on both write guards (Claude Code 2.1.295 or later). protect-trusted-paths.cjs denies the write tools everything below pharn/.run/pharn-{loop,ship,review}/.

  • Loop marker:

    • --open records the mode, refuses to overwrite an open marker, and writes atomically.
    • MODE_UNWITNESSED refuses a record whose mode differs from the marker's.
    • The blocked: vocabulary is closed.
    • --accept-host-execution is no longer pre-approved.
    • Repeated keys in reports are refused.
    • Placeholder attestations are refused.
    • The loop commit leaves out the user's own pre-run edits.
  • Floor checkers:

    • One CRLF-safe frontmatter reader replaces seven copies, and a displaced fence turns the floor RED.
    • A symlinked directory turns validate RED.
    • Zero capabilities under a capability root is INCONCLUSIVE.
    • One lesson-heading grammar now skips fences and comments.
  • Reconcile:

    • A second run can no longer reset an open run's window.
    • CI exec-config is always reconciled.
    • The cost-ledger exception is narrowed.
  • Review:

    • REVIEW.md is rendered by the floor (render-review.mjs), with every lens-supplied value fenced and capped.
    • type is closed to two members.
    • An unrecorded lens directory is refused.
  • Dev process:

    • /pharn-dev-verify runs on the gate runner and checks the result with --stamp.
    • A red verdict is a STOP that delegation cannot override.
    • A new per-PR check:ship-record requires a green record for product-path PRs.
  • Docs: the four trusted docs, CLAUDE.md, README, SECURITY and CONTRIBUTING now match the code. New lesson L82 corrects L14.

Gates on 8343100 (with origin/main ab77455 merged)

  • npm run check: exit 0, 6467 tests, 0 failed.
  • validate: GREEN, 37 capabilities.
  • check:changelog-entry: GREEN.
  • check:surface-bump: GREEN, 7.2.1 → 7.3.0.
  • check:ship-record: GREEN.
  • check:instruction-growth: within budget.

Remaining bounds and owner decisions (the ruleset bypass, older Claude Code versions, Bash writes) are stated in pharn/LIMITS.md and .dev/features/*/SHIP.md.

🤖 Generated with Claude Code

PrzemekGalarowicz and others added 30 commits November 3, 2026 11:42
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…URITY

Batch 2026-11-03, group G3 (LIGHT). hook-wiring.test.cjs pins both PreToolUse
guard handlers as {type, command, onFailure: "block"} with a negative control;
it stays red until the maintainer applies the settings.json patch
(.dev/features/guard-wiring/apply.py, not committed). enforce-writes-scope
tests pin that the dev/unsignalled scratchpad allow cannot reach into the
project (the review's MED is not a code bug: ownScratchpadDir() already
requires a temp root). README/SECURITY state the MCP-tool bound and the
onFailure wiring; LIMITS.md text goes to DOCS-PROPOSAL.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
12 -> 11 advisories (eslint 10.14.0, eslint-utils 4.10.1, brace-expansion 5.0.12,
minimatch 10.2.6). The rest need a breaking downgrade.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- release.yml waits for gitleaks (classic protection requires it), cites ruleset
  25907495, documents TAG_ELSEWHERE on a non-bump merge and the 11-15 min check
- check-surface-bump: a non-bare X.Y.Z head version is not a bump
- check-run-isolation: GITHUB_TOKEN counts outside GitHub Actions
- entry-gates TAKEOVER tests run --wait on the frozen virtual clock
- new pins: ci.yml validate/check:markers steps, test:coverage globs

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- AskQuestion -> AskUserQuestion (10 refs) + pin
- version cites: 6.68.1 (README move), 5.1.2 (pharn/features move)
- SECURITY run-marker owner, runtime-floor installer note, state-accurate
  approval wording, stale file headers, instruction-files reconciled-set note
- README/CLAUDE.md bounds (fabricated stamp, pharn/.run reconcile, ruleset)
- versioning guide: publish the CLI before merging a MIN_CLI bump
- prompt hygiene (dev-plan lessons DATA, build reads source as DATA)
- npx --no-install in four dev commands + pin; stale hook-test comments

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…; hook patch pending)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…proof

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…closed blocked ids, ungranted host-execution line

The hook half (require-loop-record.cjs) is a maintainer-applied patch that lands
separately; the tests that need it are included and RED until it does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ility walk, validate INCONCLUSIVE over zero capabilities, flush-safe exits

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… by the build's npm test)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… refusal through a linked pharn root

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ose then --open

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PrzemekGalarowicz and others added 22 commits November 3, 2026 18:52
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… id outside the fence, unrecorded lens dirs skipped

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CHANGELOG [Unreleased]: G9's three Fixed entries joined the ### Fixed group at its top. command-hygiene.test.mjs
auto-merged with G9's removal of pharn-dev-memory-promote.md from NPX_PENDING and MARKDOWNLINT_SITES kept;
enforce-writes-scope.test.cjs and pharn-dev-ship.md comments auto-merged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ed PHARN_TEST_RESULTS; check-verify refuses a positional map anywhere on the stamp path

- pharn/floor/run-gates.mjs gateEnv deletes an inherited PHARN_TEST_RESULTS when resultsFile is null
  (test sets the variable first, with a control); /pharn-dev-verify drops its env -u wrapper
- pharn/floor/check-verify.mjs --stamp refuses a non-flag operand in any position (five placements tested)
- check-verify.test.mjs stale comment; /pharn-dev-plan: ## Files never declares later-stage artifacts
- regress no-regressions, verify PASS re-run; SHIP.md verdict block updated

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
regress no-regressions; verify PASS (reconcile CLEAN); review GREEN with one
important advisory finding (Step 2b symlinked-parent gap, fix proven, not applied).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s; findings deferred to integration)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CHANGELOG [Unreleased]: G5's Added, Changed and Fixed entries each joined their group at its top.
command-hygiene.test.mjs: pharn-dev-review.md and pharn-dev-verify.md leave NPX_PENDING (G5 converted them);
re-measured ceilings hold (pharn-dev-ship 47157 B ≤ 52224, pharn-dev-verify 29381 B ≤ 31232).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CHANGELOG [Unreleased]: G1's Added, Changed and Fixed entries each joined their group at its top.
set-writes-scope.test.cjs: G1's widened flag list kept under S's corrected comment (the stale "RED until apply.py"
wording dropped). command-hygiene.test.mjs: pharn-dev-build.md leaves NPX_PENDING (now empty). pharn-loop.md:
G1's --check grant line sits beside G2's rewritten grants (auto-merged). set-writes-scope.cjs is G1's owner-applied
bytes, unedited.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(a) /pharn-dev-build Step 2b PICK also requires realpath === path.join(root, p), so an entry under a symlinked
    parent (gp/mb -> ../.dev/memory-bank) is no longer formatted: probe before REFORMATTED, after untouched, the
    plain control still formatted. Pinned in command-hygiene.test.mjs (mutant control: the regex fails without the
    clause); the build comment, .dev/guides/writes-scope.md and G1's CHANGELOG entry say so.
(b) apply-plan-deletions.mjs: the reader-reason comment names the contiguous-list rule, not round 1's ':' rule.
(c) writes-scope.md: re-measured at dd0bb3d - the pre-batch scope of 16 of 342 plans named a workflow; 7.3.0
    refuses 14 for that rule and 2 first for a split list. The CHANGELOG count says it counts by first rule.
(d) G1's CHANGELOG line: only the dev promote command's canon --check line was a no-op (G9 removed it); the
    product command's vendor/bin line reads an installed project's canon. S's two entries no longer call four dev
    commands pending.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CHANGELOG [Unreleased]: G8's Changed and Fixed entries each joined their group at its top.
cli-stdout-flush.test.mjs FLUSH_CLIS keeps both G4's validate.mjs row and G8's merge-findings.mjs row.
.dev/guides/floor-checks.md keeps G5's check-ship-record section (its fence closed) and G8's merge/render section.
.prettierignore / .markdownlint-cli2.jsonc auto-merged with G1's canon dirs and G8's pharn/features/*/REVIEW.md.
command-hygiene ceilings: pharn-review 30877 B <= 34304 beside G5's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e trailing-space variant

CONTRIBUTING.md:79, 92, 160 said an admin merge bypasses required checks. Ruleset 25907495 (no bypass actors,
gh api 2026-11-03) holds every account to them; the bypass of ruleset 18045407 and classic protection skips the
review and classic's gitleaks only. G9's CHANGELOG entry printed "## L20, ## L20" with the trailing space
invisible; it now says "with and without a trailing space". Orchestrator decisions for Phase C.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ps required checks

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The owner ran the Phase B apply-docs.py (sha256 c114b495…19939); AFTER hashes verified on disk:
LIMITS 5fa849f6, THREAT-MODEL 73a6a524, CONSTITUTION 8f0c7cad, ARCHITECTURE ab4dbd92, lessons-learned 8d7e7fd3.
27 trusted-doc edits (G1, G2, G3, G7, G8 proposals and orchestrator SPEC 1-7) and canon correction entry L82
(G9 Option B). With them: the community-privilege LIMITS marker in .dev/floor/specified-primitives.json follows
the new LIMITS §1a text, and docs/lessons-index.md is regenerated (82 lessons).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SKILLS_VERSION 7.2.1 -> 7.3.0 (minor: new checkers and commands' behaviour from the 2026-11-03 audit batch), the
README badge, and every [Unreleased] entry moved into ## [7.3.0] - 2026-11-03, plus one entry for the
maintainer-applied trusted-doc and canon patch. MIN_CLI unchanged: no installed path moved.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Important

  • Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 1e36e81c-fe52-41d4-9ec3-13d9f5a10ce3
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

pharn

🛡️ pharn-ci · ❌ Fail

Caution

Fail · Diff coverage of this change is 99.93% against a threshold of 100%; 10 test-integrity findings; 38 agent setup files found.

Verdict Diff coverage Test integrity Agent setup
❌ Fail 99.93% (threshold 100%) ℹ️ 10 findings 38 files

🧪 Diff coverage

99.93% of changed lines covered (2944/2946, threshold 100%)

Changed files (50)
File Coverage Covered Uncovered lines
pharn/floor/check-loop.mjs 96.49% 55/57 266-267
.claude/hooks/protect-trusted-paths.cjs 100% 36/36
.claude/hooks/require-loop-record.cjs 100% 76/76
.claude/hooks/set-writes-scope.cjs 100% 475/475
.dev/floor/capability-catalog-core.mjs 100% 8/8
.dev/floor/check-config.mjs 100% 11/11
.dev/floor/check-ship-record.mjs 100% 351/351
.dev/floor/check-surface-bump.mjs 100% 13/13
.dev/floor/check-variance.mjs 100% 4/4
.dev/floor/gen-lessons-index.mjs 100% 10/10
pharn/floor/apply-plan-deletions.mjs 100% 5/5
pharn/floor/capability-files-core.mjs 100% 59/59
pharn/floor/check-attestation.mjs 100% 51/51
pharn/floor/check-bash-reconcile.mjs 100% 23/23
pharn/floor/check-cost-ledger.mjs 100% 11/11
pharn/floor/check-loop-decision.mjs 100% 51/51
pharn/floor/check-loop-record.mjs 100% 33/33
pharn/floor/check-model-config.mjs 100% 14/14
pharn/floor/check-plan-lessons.mjs 100% 13/13
pharn/floor/check-provenance.mjs 100% 25/25
pharn/floor/check-regress.mjs 100% 2/2
pharn/floor/check-run-isolation-core.mjs 100% 16/16
pharn/floor/check-run-isolation.mjs 100% 23/23
pharn/floor/check-spec-approved.mjs 100% 1/1
pharn/floor/check-spec.mjs 100% 51/51
pharn/floor/check-verify.mjs 100% 10/10
pharn/floor/count-grillers.mjs 100% 27/27
pharn/floor/count-lenses.mjs 100% 31/31
pharn/floor/count-verifiers.mjs 100% 30/30
pharn/floor/frontmatter-core.mjs 100% 79/79
pharn/floor/gen-lessons-index.mjs 100% 20/20
pharn/floor/instruction-files-core.mjs 100% 2/2
pharn/floor/instruction-files.mjs 100% 3/3
pharn/floor/lessons-index-core.mjs 100% 99/99
pharn/floor/loop-closeout.mjs 100% 47/47
pharn/floor/loop-record-core.mjs 100% 34/34
pharn/floor/mark-phase.mjs 100% 3/3
pharn/floor/merge-findings.mjs 100% 87/87
pharn/floor/plan-files-core.mjs 100% 270/270
pharn/floor/pre-run-snapshot-core.mjs 100% 6/6
pharn/floor/pre-run-snapshot.mjs 100% 3/3
pharn/floor/reconcile-baseline.mjs 100% 152/152
pharn/floor/regress-base-reuse-core.mjs 100% 6/6
pharn/floor/render-review.mjs 100% 468/468
pharn/floor/render-ship-briefing.mjs 100% 13/13
pharn/floor/run-gates.mjs 100% 8/8
pharn/floor/run-marker.mjs 100% 3/3
pharn/floor/runtime-floor.mjs 100% 2/2
pharn/floor/spec-template-core.mjs 100% 18/18
pharn/floor/validate.mjs 100% 106/106

🔍 Test integrity

  • ℹ️ TI15 .claude/hooks/require-loop-record.cjs:329 — The condition at ".claude/hooks/require-loop-record.cjs:329" compares with a 6-character string literal that the test file ".claude/hooks/require-loop-record.test.cjs" also adds, so the code may special-case the test's input.
    • Hint: Check that the code handles the general case and not only the test's value, and add a test with another input.
  • ℹ️ TI15 .claude/hooks/set-writes-scope.cjs:208 — The condition at ".claude/hooks/set-writes-scope.cjs:208" compares with a 25-character string literal that the test file ".claude/hooks/set-writes-scope.test.cjs" also adds, so the code may special-case the test's input.
    • Hint: Check that the code handles the general case and not only the test's value, and add a test with another input.
  • ℹ️ TI15 .claude/hooks/set-writes-scope.cjs:209 — The condition at ".claude/hooks/set-writes-scope.cjs:209" compares with a 7-character string literal that the test file ".claude/hooks/set-writes-scope.test.cjs" also adds, so the code may special-case the test's input.
    • Hint: Check that the code handles the general case and not only the test's value, and add a test with another input.
  • ℹ️ TI15 .claude/hooks/set-writes-scope.cjs:224 — The condition at ".claude/hooks/set-writes-scope.cjs:224" compares with a 25-character string literal that the test file ".claude/hooks/set-writes-scope.test.cjs" also adds, so the code may special-case the test's input.
    • Hint: Check that the code handles the general case and not only the test's value, and add a test with another input.
  • ℹ️ TI15 .dev/floor/check-ship-record.mjs:146 — The condition at ".dev/floor/check-ship-record.mjs:146" compares with a 6-character string literal that the test file ".dev/floor/check-ship-record.test.mjs" also adds, so the code may special-case the test's input.
    • Hint: Check that the code handles the general case and not only the test's value, and add a test with another input.
  • ℹ️ TI15 .dev/floor/check-ship-record.mjs:146 — The condition at ".dev/floor/check-ship-record.mjs:146" compares with a 9-character string literal that the test file ".dev/floor/check-ship-record.test.mjs" also adds, so the code may special-case the test's input.
    • Hint: Check that the code handles the general case and not only the test's value, and add a test with another input.
  • ℹ️ TI15 .dev/floor/check-ship-record.mjs:148 — The condition at ".dev/floor/check-ship-record.mjs:148" compares with a 13-character string literal that the test file ".dev/floor/check-ship-record.test.mjs" also adds, so the code may special-case the test's input.
    • Hint: Check that the code handles the general case and not only the test's value, and add a test with another input.
  • ℹ️ TI15 .dev/floor/check-ship-record.mjs:148 — The condition at ".dev/floor/check-ship-record.mjs:148" compares with a 13-character string literal that the test file ".dev/floor/check-ship-record.test.mjs" also adds, so the code may special-case the test's input.
    • Hint: Check that the code handles the general case and not only the test's value, and add a test with another input.
  • ℹ️ TI15 .dev/floor/check-ship-record.mjs:149 — The condition at ".dev/floor/check-ship-record.mjs:149" compares with a 15-character string literal that the test file ".dev/floor/check-ship-record.test.mjs" also adds, so the code may special-case the test's input.
    • Hint: Check that the code handles the general case and not only the test's value, and add a test with another input.
  • ℹ️ TI15 .dev/floor/check-ship-record.mjs:150 — The condition at ".dev/floor/check-ship-record.mjs:150" compares with a 14-character string literal that the test file ".dev/floor/check-ship-record.test.mjs" also adds, so the code may special-case the test's input.
    • Hint: Check that the code handles the general case and not only the test's value, and add a test with another input.

💬 Messages (5)

  • ❌ DIFF_COVERAGE_BELOW_THRESHOLD Diff coverage 99.93% is below the threshold of 100%.
    • Hint: Add tests that exercise the uncovered lines listed in the table above.
  • ℹ️ COVERAGE_PATHS_PARTIALLY_UNMATCHED 126 file paths in the coverage report are not tracked files in the repository; their coverage is not used.
    • Hint: Nothing to do if those files are generated or outside the repo; if changed files are missing from the table, check the coverage root.
  • ⚠️ CONFIG_CHANGED_IN_DIFF This change edits files that configure this check: `.github/workflows/ci.yml`, `.github/workflows/release.yml`. Review them before trusting the verdict.
    • Hint: Review the config and workflow changes before trusting the verdict; protect .pharn/ci.yml and .github/workflows/ with CODEOWNERS.
  • ⚠️ TEST_INTEGRITY_INDEX_UNAVAILABLE TI02 and TI05 did not run: the text of the touched test files could not be read (`pr-number mode: the diff came from the GitHub API`), so removed tests and emptied assertions are not checked.
    • Hint: Review the named test files by hand for removed tests and weakened assertions. A file over 512 KiB, one with many syntax errors, a missing Python 3.8 or newer for .py files, or git objects that could not be read stop the comparison.
  • ⚠️ AGENT_CONFIG_SECRET_UNSCANNED Agent config files were not scanned for committed secrets: `pr-number mode: the checkout is not the pull request head, so its committed agent config files were not read`.
    • Hint: Keep agent config files text, under 512 KiB and inside the repository, and run on a checkout of the pull request head (not PR-number mode or a compare-API diff), so they can be scanned for committed secrets.

🤖 Agent setup (38 files)

Agent setup: 38 files · claude-code

Agent setup files (38)
Path Kind
.claude/agents/pharn-review-lens.md claude-agent
.claude/commands/pharn-build.md claude-command
.claude/commands/pharn-dev-build.md claude-command
.claude/commands/pharn-dev-eval.md claude-command
.claude/commands/pharn-dev-grill.md claude-command
.claude/commands/pharn-dev-memory-promote.md claude-command
.claude/commands/pharn-dev-plan.md claude-command
.claude/commands/pharn-dev-regress.md claude-command
.claude/commands/pharn-dev-review.md claude-command
.claude/commands/pharn-dev-ship.md claude-command
.claude/commands/pharn-dev-verify.md claude-command
.claude/commands/pharn-grill.md claude-command
.claude/commands/pharn-loop-close.md claude-command
.claude/commands/pharn-loop-quick.md claude-command
.claude/commands/pharn-loop.md claude-command
.claude/commands/pharn-memory-promote.md claude-command
.claude/commands/pharn-plan.md claude-command
.claude/commands/pharn-regress.md claude-command
.claude/commands/pharn-review.md claude-command
.claude/commands/pharn-ship-close.md claude-command
.claude/commands/pharn-ship-quick.md claude-command
.claude/commands/pharn-ship-stages.md claude-command
.claude/commands/pharn-ship.md claude-command
.claude/commands/pharn-spec.md claude-command
.claude/commands/pharn-test.md claude-command
.claude/commands/pharn-verify.md claude-command
.claude/hooks/enforce-writes-scope.cjs claude-hook
.claude/hooks/enforce-writes-scope.test.cjs claude-hook
.claude/hooks/hook-wiring.test.cjs claude-hook
.claude/hooks/protect-trusted-paths.cjs claude-hook
.claude/hooks/protect-trusted-paths.test.cjs claude-hook
.claude/hooks/require-loop-record.cjs claude-hook
.claude/hooks/require-loop-record.test.cjs claude-hook
.claude/hooks/set-writes-scope.cjs claude-hook
.claude/hooks/set-writes-scope.test.cjs claude-hook
.claude/hooks/writes-scope-release.test.cjs claude-hook
.claude/settings.json claude-settings
CLAUDE.md claude-md

pharn-ci 0.4.0 · report schema v2 · coverage format lcov

PrzemekGalarowicz and others added 4 commits November 3, 2026 23:41
Tests only. 16 of the 18 lines are now covered; pharn/floor/check-loop.mjs:266-267 (the catch
in repeatedTopLevelKeys) cannot be reached through the public interface, since its input already
passed JSON.parse. See .dev/features/pr416-coverage/NOTES.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@PrzemekGalarowicz
PrzemekGalarowicz merged commit 7a2340d into main Nov 4, 2026
7 of 8 checks passed
@PrzemekGalarowicz
PrzemekGalarowicz deleted the batch/audit-2026-11-03 branch November 4, 2026 11:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant