Skip to content

Add CLAUDE.local.md per-developer overrides#9

Merged
filip-ceos merged 3 commits into
asysta-act:release/v1.1.0from
jakubsenk:local-claudemd-config
Jun 17, 2026
Merged

Add CLAUDE.local.md per-developer overrides#9
filip-ceos merged 3 commits into
asysta-act:release/v1.1.0from
jakubsenk:local-claudemd-config

Conversation

@jakubsenk

Copy link
Copy Markdown
Contributor

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

  • Bug fix
  • New feature / enhancement
  • Documentation
  • Refactor / cleanup
  • CI / tooling

Acceptance criteria fulfilled

  • AC 1:
  • AC 2:

Test plan

  • bash tests/harness/run-tests.sh passes (230 scenarios)
  • New/modified scenario added for this change:
  • No {{VARIABLE}} placeholders left unfilled in skills or agents

Documentation updated

  • CLAUDE.md counts updated if skills/agents/config sections added or removed
  • docs/ updated if behaviour changed
  • README.md updated if install or usage changed

Backward compatibility

  • Automation Config schema unchanged (no new required keys)
  • If schema changed: migration documented in PR description

Evaluation

Tested on real bug fix scenario.

Human review

  • I have read CONTRIBUTING.md
  • A human has reviewed the complete diff before submission
  • No secrets, internal URLs, or personal paths committed

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.
@filip-ceos filip-ceos mentioned this pull request Jun 17, 2026
2 tasks
filip-ceos and others added 2 commits June 17, 2026 09:16
- 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
filip-ceos changed the base branch from main to release/v1.1.0 June 17, 2026 07:20
@filip-ceos
filip-ceos merged commit 839657f into asysta-act:release/v1.1.0 Jun 17, 2026
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>
@filip-ceos

Copy link
Copy Markdown
Collaborator

Heads up: this PR's content was squash-merged into the release/v1.1.0 integration branch, but CLAUDE.local.md was then pulled from the v1.1.0 release pending a redesign (architectural concerns: config layering / dual source of truth + an LLM-performed markdown merge in the safety-critical config-reader layer, for a benefit largely achievable with existing levers). The work continues — with the rationale and concrete redesign asks — in #11. v1.1.0 ships #7 + #8 only.

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>
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.

2 participants