Add CLAUDE.local.md per-developer overrides#9
Merged
filip-ceos merged 3 commits intoJun 17, 2026
Conversation
Introduce a local override mechanism where an optional, gitignored CLAUDE.local.md is merged over CLAUDE.md (local wins) before parsing Automation Config (core/config-reader.md Step 0). Add claude_local_md_content input and merge rules, document the feature in CLAUDE.md and docs/reference/automation-config.md, and show example usage in onboard docs. Introduce browser.enabled (default true) and a derived gate browser_verification_enabled = false when the Browser Verification section is absent or Enabled is false; update agents and skills to consume the merged config and to skip/defensively refuse based on the new gate (browser-agent, deployment-verifier, skills/fix-bugs, steps/03-reproduce.md, steps/08-browser-verify.md, skills/check-setup/SKILL.md). Also update tracker-type lookup in fix-bugs to prefer CLAUDE.local.md when present. Files changed: CLAUDE.md, core/config-reader.md, docs/reference/automation-config.md, agents/browser-agent.md, agents/deployment-verifier.md, skills/check-setup/SKILL.md, skills/fix-bugs/SKILL.md, skills/fix-bugs/steps/03-reproduce.md, skills/fix-bugs/steps/08-browser-verify.md, skills/onboard/SKILL.md.
2 tasks
- fix-bugs/SKILL.md: fix the TRACKER_TYPE awk extractor (`awk -F'| '` treats the
separator as an ERE alternation, yielding a literal `|`); use `awk '{print $4}'`
so the CLAUDE.local.md Type precedence actually works
- config-reader Step 0: define empty-value override (clears base), whole-unit
replacement for multi-value/map keys, and the Step-0-before-Step-4 ordering note
- docs: add a copy-paste `.gitignore` block + a security note (local overrides can
change webhook/remote/base-branch; by design machine-local)
- browser-agent: annotate the verify-phase "Read context" as override-resolved
- add examples/CLAUDE.local.example.md (docs referenced it as a tracked template)
Full local harness: 230 pass / 0 fail / 1 skip.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
filip-ceos
added a commit
that referenced
this pull request
Jun 17, 2026
…language) and #9 (CLAUDE.local.md) + awk fix Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
filip-ceos
added a commit
that referenced
this pull request
Jun 17, 2026
CLAUDE.local.md local-override layer pulled from the v1.1.0 release pending a redesign — it introduces config layering (a second, gitignored source of truth) and an LLM-performed markdown merge in the safety-critical config-reader layer, for a benefit largely achievable with existing levers (Pipeline Profiles, leaving a section unconfigured). #7 and #8 ship as v1.1.0; #9 returns to its own PR. CHANGELOG [1.1.0] now covers #7 (Title format, publisher 6a/6b) + #8 (meaningful- test gate, code-language convention) only. Full local harness: 230/0/1. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Collaborator
|
Heads up: this PR's content was squash-merged into the |
filip-ceos
added a commit
that referenced
this pull request
Jun 17, 2026
* feat(publisher): PR-ownership defenses (6a/6b) + Title format key + release-process docs (#7) * publisher: add PR ownership defenses (Steps 6a/6b) Previous incident: a publish attempt parsed a None PR number out of a malformed create-response, guessed pr_number = previous_max + 1, then PATCHed the title and DELETE'd labels on a stranger's open PR. Adds two defensive steps to agents/publisher.md: - Step 6a: PR number MUST be read from the create-response payload of the same call. No "previous + 1" guessing — Block if response is malformed. - Step 6b: ANY subsequent mutation (PATCH/DELETE/comment) on a PR id MUST first verify the PR's head.ref == current_branch and base.ref == configured base. Mismatch -> Pipeline Block, no further mutation. Constraints list updated with two matching NEVER rules. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * publisher: PR title/branch naming — no brackets/colons, English-only, no diacritics PR title format changed from `[PROJ-123] Fix: {desc}` to a single hyphen-delimited token `{ISSUE-ID}-{Mode}-{english-summary}`: - drop square brackets and colons; keep Fix/Feat/Scaffold mode keyword - spaces become hyphens - title MUST be English ASCII; translate non-English summaries and transliterate diacritics (é->e, č->c, ...) Step 3 branch naming gains the same English-only / no-diacritics rule for the short-description part. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * publisher: move PR/branch naming rules into Automation Config (PR Rules) The PR title format and branch naming normalization are project-specific config, not agent logic. Move them out of agents/publisher.md and into the Automation Config contract so consuming projects own them. - agents/publisher.md: Step 6 builds the title per the `Title format` rule from PR Rules (fallback = issue ID + summary); Step 3 derives the branch short-description per Branch naming rules; Step 1 reads `Title format`. - docs/reference/automation-config.md: add `Title format` key to PR Rules (both the reference section and the example config), documenting placeholders ({issue-id}/{mode}/{summary}) and normalization rules (no spaces/brackets/colons, English-only, no diacritics). Branch naming description gains the same English/ASCII rule. - CLAUDE.md: PR Rules keys updated to `Labels, Title format`. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix(publisher): review fixes for 6a/6b PR-ownership defenses + Title format key Multi-perspective review follow-up for PR #7. publisher.md: - 6b: fail-closed on missing head.ref/base.ref; clarify it guards post-create / hook-injected mutations (the happy path has none); soften "impossible" to fail-closed/detectable; name 6a's create-returned id as the authoritative ownership signal - 6a: drop ambiguous "same call/turn" wording -> "use the id the create response returned" - fallback title now preserves the mode keyword: {issue-id} {Mode}: {summary} - scope the commit-message [ISSUE-ID] convention as independent of the PR title - trim the two new NEVER constraints core/config-reader.md: map pr_rules.title_format so the publisher can source it. docs/reference/automation-config.md: generic example (PROJ-123 + fully-Czech input that obeys the English-only rule); note {mode} is a fixed keyword; sync the fallback wording. Discoverability: surface the optional Title format key in onboard, check-setup, scaffolder, README and all 8 example configs; mark it optional in CLAUDE.md's required-sections table. Release: bump 1.0.3 -> 1.1.0 (new optional key = MINOR) + CHANGELOG [1.1.0]. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(claude): add Release Process — single & bundled multi-PR releases + versioning Documents in CLAUDE.md (under Versioning Policy) how releases are cut: - PR-only; never bump/tag/CHANGELOG directly on main - version bump spans plugin.json + both marketplace.json fields + CHANGELOG - single-PR flow: bump rides in the PR; after merge, gh release create on main - multi-PR flow: release/vX.Y.Z integration branch off main, squash each source PR in, resolve conflicts there, single bump + combined CHANGELOG, one PR to main, close sources as rolled-in, then release on main - bundled version = max of the individual MAJOR/MINOR/PATCH classifications Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(claude): correct multi-PR Release Process to re-target/merge flow Source PRs are re-pointed onto the release/vX.Y.Z integration branch and squash- merged via GitHub (so each shows "merged", keeping its review/commit record), instead of folding content locally and closing them. Notes the integration branch is unprotected so the main status-check gate applies once at the final release PR. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: msnajdr <martin.snajdr@ceosdata.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Filip Šabacký <filip.sabacky@ceosdata.com> * fix(agents): useless-test gate + code-language convention (#8) * obecna oprava cestiny v kodu; pridani kontroly smysluplnosti generovanych testu * fix(agents): apply review fixes to useless-test gate + code-language convention Addresses the multi-perspective review of PR #8: - test-engineer: MEANINGFUL-TEST GATE explicitly overrides the "Required: one test" floor when no testable seam exists (no hollow test to satisfy Required) - docs: drop the orphan `## Coding Conventions` section reference (free-form CLAUDE.md prose instead) and remove read-only `architect` from the code-generating-agents list - test-checklist: qualify Coverage/Completeness items with "(or documented untestable-seam gap)" - acceptance-gate: a documented untestable-seam + manual/E2E verification counts as PARTIALLY (not NOT ADDRESSED); judge test validity by static inspection only - reviewer: judge test meaningfulness by static inspection (no execution); reword the useless-test constraint to start with NEVER - scaffolder: add the code-language constraint (architect omitted — it is read-only) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: msnajdr <martin.snajdr@ceosdata.com> Co-authored-by: Filip Šabacký <filip.sabacky@ceosdata.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(reviewer): reword useless-test constraint so it doesn't shadow the Verdict MUST rule The #8 reword contained both "MUST" and "approve"; the ac5-fixer-reviewer-token-constraints scenario selects the Verdict line via `grep MUST | grep -i 'verdict|APPROVE' | head -1`, which then matched this constraint (ahead of the real Verdict line) and failed the APPROVE/REQUEST_CHANGES/BLOCK assertions. Reworded to avoid "approve"/"MUST" in that line while keeping the NEVER prefix. Full local harness: 230 pass / 0 fail / 1 skip. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(release): drop #9 (CLAUDE.local.md) from v1.1.0; bundle = #7 + #8 CLAUDE.local.md local-override layer pulled from the v1.1.0 release pending a redesign — it introduces config layering (a second, gitignored source of truth) and an LLM-performed markdown merge in the safety-critical config-reader layer, for a benefit largely achievable with existing levers (Pipeline Profiles, leaving a section unconfigured). #7 and #8 ship as v1.1.0; #9 returns to its own PR. CHANGELOG [1.1.0] now covers #7 (Title format, publisher 6a/6b) + #8 (meaningful- test gate, code-language convention) only. Full local harness: 230/0/1. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Vetinari90 <42376114+Vetinari90@users.noreply.github.com> Co-authored-by: msnajdr <martin.snajdr@ceosdata.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Introduce a local override mechanism where an optional, gitignored CLAUDE.local.md is merged over CLAUDE.md (local wins) before parsing Automation Config (core/config-reader.md Step 0). Add claude_local_md_content input and merge rules, document the feature in CLAUDE.md and docs/reference/automation-config.md, and show example usage in onboard docs.
Linked issue
Fixes #
Type of change
Acceptance criteria fulfilled
Test plan
bash tests/harness/run-tests.shpasses (230 scenarios)Documentation updated
Backward compatibility
Evaluation
Tested on real bug fix scenario.
Human review