carson 2.13.2 → 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8d19271a17424021f6b4ef1ceabe73275feb47c54965175fbd5fbd1a2b6f869b
4
- data.tar.gz: 8011d1e680ba9331e99bd8254b0b07605f64ed1856baa6a62b53ec1f6eb98c7c
3
+ metadata.gz: e3ffc3d262a100056bf88d5d6ecd8f08b1698eab461451510f36e3213f1843f9
4
+ data.tar.gz: 4afaf01a5a27919d8e14de1d1685ae8c1af58e9aee93cfdc2ce8a01fe8acf4a8
5
5
  SHA512:
6
- metadata.gz: 51be2370d394a2b83169b5ca543339a8949ec0a8cb969430e934d7a22977e3e085997c7d6f89006a7d128abb9a8f426c5f22327555a6d26f85c89c186eb25dc9
7
- data.tar.gz: 9bc89f7a0f84f70d21c0a38ec5cca6b84d961ebab815bfb826f86a1316139915093f378fbbf8d52f9696d9445bacbe3d5677b3c78e14e6a9542b334128adfbb3
6
+ metadata.gz: 204a4d7f91d94d687b2bc083fee2a988663670195f6835f8717d13607668295f6ce4e2e6bd278599e700208da60fbcdda8809fba298206ea5fc5909accc61dda
7
+ data.tar.gz: '09cfed5c094db7d7b24b4eb17673bcb226efa21b3615145eac4c6acc396b3ea1b95efcd4e92e6c017274474c5ebe8cd0c9e851af57389e96ea734bd8e72a5db0'
@@ -1 +1 @@
1
- Read `.github/carson-instructions.md` for repository governance rules enforced by Carson.
1
+ Read `.github/AGENTS.md` for repository governance rules enforced by Carson.
data/API.md CHANGED
@@ -73,7 +73,7 @@ Blocked Carson artefacts in host repositories:
73
73
  - `.tools/carson/*`
74
74
 
75
75
  Allowed Carson-managed persistence in host repositories:
76
- - `.github/carson-instructions.md` — governance baseline (source of truth)
76
+ - `.github/carson.md` — governance baseline (source of truth)
77
77
  - `.github/copilot-instructions.md` — agent discovery pointer for Copilot
78
78
  - `.github/CLAUDE.md` — agent discovery pointer for Claude Code
79
79
  - `.github/AGENTS.md` — agent discovery pointer for Codex
data/MANUAL.md CHANGED
@@ -8,7 +8,7 @@ For the mental model and command overview, see `README.md`. For formal interface
8
8
  Prerequisites: Ruby `>= 3.4`, `gem` and `git` in `PATH`. `gh` (GitHub CLI) recommended for full review governance.
9
9
 
10
10
  ```bash
11
- gem install --user-install carson
11
+ gem install carson
12
12
  ```
13
13
 
14
14
  If `carson` is not found after installation:
@@ -202,7 +202,7 @@ These define what Carson *is*. They are not configurable.
202
202
  - **Outsider boundary** — Carson never places its own artefacts inside a governed repository.
203
203
  - **Centralised lint** — one policy source distributed into each repo's `.github/linters/`, zero per-repo drift. MegaLinter enforces it in CI.
204
204
  - **Active review** — undisposed reviewer findings block merge; feedback must be acknowledged.
205
- - **Self-diagnosing output** — every message names the cause and the fix.
205
+ - **Self-diagnosing output** — every warning and error names what went wrong, why, and what to do next.
206
206
  - **Transparent governance** — Carson prepares everything for merge but never makes decisions without telling you.
207
207
 
208
208
  ### Configurable defaults
@@ -299,10 +299,9 @@ Carson writes managed files that help interactive agents (Claude Code, Codex, Co
299
299
 
300
300
  **How it works:**
301
301
 
302
- - `.github/carson-instructions.md` — the single source of truth containing the full governance baseline. This file tells agents what Carson is, what commands to run, and what rules to follow.
303
- - `.github/CLAUDE.md` — read by Claude Code at session start. Points to `carson-instructions.md`.
304
- - `.github/AGENTS.md` — read by Codex at session start. Points to `carson-instructions.md`.
305
- - `.github/copilot-instructions.md` — read by GitHub Copilot. Points to `carson-instructions.md`.
302
+ - `.github/AGENTS.md` — full governance baseline; read by Codex and other agents. Points to `carson.md`.
303
+ - `.github/CLAUDE.md` — read by Claude Code at session start. Points to `AGENTS.md`.
304
+ - `.github/copilot-instructions.md` — read by GitHub Copilot. Points to `AGENTS.md`.
306
305
 
307
306
  Each agent reads its own expected filename and follows the reference to the shared baseline. One file to maintain, zero drift across agents.
308
307
 
data/README.md CHANGED
@@ -21,24 +21,11 @@ Carson is an autonomous governance runtime that lives on your workstation and in
21
21
  **Portfolio-level autonomy** — `carson govern` is a triage loop that scans your registered repositories, classifies every open PR, and acts: merge what's ready, dispatch coding agents (Codex or Claude) to fix what's failing, and escalate what needs human judgement. One command, all your projects, unmanned.
22
22
 
23
23
  ```
24
- ┌──────────────────────────────────────────────┐
25
- Your workstation │
26
- │ │
27
- ~/.carson/ Carson config │
28
- ~/.carson/hooks/ Git hooks │
29
- │ ~/.carson/cache/ Reports │
30
- │ ~/.carson/govern/ Dispatch state │
31
- │ │
32
- │ carson govern ──► for each repo: │
33
- │ 1. List open PRs (gh) │
34
- │ 2. Classify: CI / review / audit status │
35
- │ 3. Act: merge | dispatch agent | escalate │
36
- │ 4. Housekeep: sync + prune │
37
- │ │
38
- │ Governed repos: repo-A/ repo-B/ repo-C/ │
39
- │ .github/* templates (committed) │
40
- │ core.hooksPath → ~/.carson/hooks │
41
- └──────────────────────────────────────────────┘
24
+ ~/.carson/ ← Carson lives here, never inside your repos
25
+
26
+ ├─ hooks ──────────────► commit gates (every governed repo)
27
+ ├─ lint configs ───────► .github/linters/ (MegaLinter auto-discovers)
28
+ └─ govern ─────────────► PR triage → merge | dispatch agent | escalate
42
29
  ```
43
30
 
44
31
  This separation is Carson's defining trait — the **outsider boundary**: no Carson scripts, config files, or governance payloads are ever placed inside a governed repository.
@@ -60,25 +47,17 @@ Carson is opinionated about governance. These are non-negotiable principles, not
60
47
  - **Outsider boundary** — Carson lives outside your repo, never inside. No Carson-owned artefacts in your repository. Offboarding leaves no trace.
61
48
  - **Centralised lint** — lint policy distributed from a central source into each repo's `.github/linters/`. One source of truth, zero drift. MegaLinter enforces it in CI.
62
49
  - **Active review** — undisposed reviewer findings block merge. Feedback must be acknowledged, not buried.
63
- - **Self-diagnosing output** — every message names the cause and the fix. If you need to debug Carson's output, the output failed.
50
+ - **Self-diagnosing output** — every warning and error names what went wrong, why, and what to do next. If you have to read source code to understand a message, that message is a bug.
64
51
  - **Transparent governance** — Carson prepares everything for merge but never oversteps. It does not make decisions for you without telling you.
65
52
 
66
53
  Everything else bends to your preference. Which branch is main, how PRs are merged, which repositories to govern, which coding agent to dispatch, where your lint policy lives — Carson asks during setup and remembers. Sensible defaults are provided; you only change what matters to you. See `MANUAL.md` for the full list.
67
54
 
68
55
  ## Quickstart
69
56
 
70
- Prerequisites: Ruby `>= 3.4`, `git`, and `gem` in your PATH.
71
- `gh` (GitHub CLI) is recommended for full review governance features.
57
+ Prerequisites: Ruby `>= 3.4`, `git`, and `gem` in your PATH. `gh` (GitHub CLI) is recommended for full review governance features.
72
58
 
73
59
  ```bash
74
- gem install --user-install carson
75
- carson version
76
- ```
77
-
78
- **Prepare your lint policy.** A policy source is any directory (or git URL) containing your lint configuration files (`.rubocop.yml`, `biome.json`, `ruff.toml`, etc.). Carson copies these into the governed repo's `.github/linters/` where MegaLinter auto-discovers them:
79
-
80
- ```bash
81
- carson lint policy --source /path/to/your-policy-repo
60
+ gem install carson
82
61
  ```
83
62
 
84
63
  **Onboard a repository:**
@@ -87,6 +66,8 @@ carson lint policy --source /path/to/your-policy-repo
87
66
  carson onboard /path/to/your-repo
88
67
  ```
89
68
 
69
+ On first run, Carson walks you through setup — remote, main branch, workflow style, merge method — then installs hooks, syncs templates, and runs an initial audit.
70
+
90
71
  After `carson onboard`, your repository has:
91
72
  - Git hooks that run `carson audit` on every commit.
92
73
  - Managed `.github/*` templates synchronised from Carson.
@@ -94,10 +75,20 @@ After `carson onboard`, your repository has:
94
75
 
95
76
  Commit the generated `.github/*` changes, and the repository is governed.
96
77
 
97
- **Run governance across your portfolio:**
78
+ **Set up lint policy** (optional). If you have a central directory or repository of lint configs, point Carson at it — configs are copied into `.github/linters/` where MegaLinter auto-discovers them:
79
+
80
+ ```bash
81
+ # local directory
82
+ carson lint policy --source /path/to/your-policy-dir
83
+
84
+ # remote repository
85
+ carson lint policy --source https://github.com/you/lint-policy.git
86
+ ```
87
+
88
+ **Govern your portfolio.** Once repositories are onboarded, `carson govern` is your recurring command. Run it whenever you want Carson to triage open PRs, enforce review policy, dispatch coding agents, and housekeep across all governed repos:
98
89
 
99
90
  ```bash
100
- carson govern --dry-run # see what Carson would do across all repos
91
+ carson govern --dry-run # preview what Carson would do, change nothing
101
92
  carson govern # triage PRs, merge ready ones, dispatch agents, housekeep
102
93
  carson govern --loop 300 # run continuously, cycling every 5 minutes
103
94
  ```
@@ -106,10 +97,6 @@ carson govern --loop 300 # run continuously, cycling every 5 minutes
106
97
 
107
98
  - **MANUAL.md** — installation, first-time setup, CI configuration, daily operations, full command reference, troubleshooting.
108
99
  - **API.md** — formal interface contract: commands, exit codes, configuration schema.
109
- - **RELEASE.md** — version history and upgrade actions.
110
- - **docs/define.md** — product definition and scope.
111
- - **docs/design.md** — experience and brand design.
112
- - **docs/develop.md** — contributor guide: architecture, development workflow.
113
100
 
114
101
  ## Support
115
102
 
data/RELEASE.md CHANGED
@@ -5,6 +5,38 @@ Release-note scope rule:
5
5
  - `RELEASE.md` records only version deltas, breaking changes, and migration actions.
6
6
  - Operational usage guides live in `MANUAL.md` and `API.md`.
7
7
 
8
+ ## 2.14.0 — Superseded File Cleanup on Template Apply
9
+
10
+ ### What changed
11
+
12
+ - `carson template apply` now automatically removes files that Carson previously managed but has since renamed or replaced. Running `carson template apply` in a governed repo after upgrading to 2.14.0 will delete `.github/carson-instructions.md` without any manual intervention.
13
+ - `carson template check` reports superseded files present in the repo as stale, listed with a `— superseded` annotation. Exit code `2` (BLOCK) if any stale files are detected.
14
+ - `offboard` also removes superseded files as part of full Carson cleanup.
15
+ - `carson.md` updated to reflect the new `template apply` behaviour.
16
+
17
+ ### No migration required
18
+
19
+ No manual steps needed. Run `carson template apply` — Carson handles the rest.
20
+
21
+ ## 2.13.3 — Rename carson-instructions.md to carson.md
22
+
23
+ ### What changed
24
+
25
+ - Renamed `.github/carson-instructions.md` → `.github/carson.md` in both the template set and the Carson repo itself. Shorter name, consistent with Carson's naming conventions.
26
+ - Enriched `carson.md` content: added Commands section (before committing, before merge, housekeeping), exit codes table, and clearer headings. Governance rules are unchanged.
27
+ - Updated agent pointer files: `CLAUDE.md` and `copilot-instructions.md` now point to `AGENTS.md`; `AGENTS.md` points to `carson.md`. One extra level of indirection, zero new files to maintain.
28
+
29
+ ### Migration
30
+
31
+ In each governed repository, run:
32
+
33
+ ```bash
34
+ git rm .github/carson-instructions.md
35
+ carson template apply
36
+ ```
37
+
38
+ `carson template apply` writes the new `carson.md` and updates the pointer files. The old `carson-instructions.md` must be removed manually — Carson will not delete it automatically.
39
+
8
40
  ## 2.13.2 — Docs Refresh
9
41
 
10
42
  ### What changed
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.13.2
1
+ 2.14.0
data/lib/carson/config.rb CHANGED
@@ -8,7 +8,7 @@ module Carson
8
8
  class Config
9
9
  attr_accessor :git_remote
10
10
  attr_reader :main_branch, :protected_branches, :hooks_base_path, :required_hooks,
11
- :path_groups, :template_managed_files,
11
+ :path_groups, :template_managed_files, :template_superseded_files,
12
12
  :lint_policy_source,
13
13
  :review_wait_seconds, :review_poll_seconds, :review_max_polls, :review_sweep_window_days,
14
14
  :review_sweep_states, :review_disposition_prefix, :review_risk_keywords,
@@ -48,7 +48,8 @@ module Carson
48
48
  }
49
49
  },
50
50
  "template" => {
51
- "managed_files" => [ ".github/carson-instructions.md", ".github/copilot-instructions.md", ".github/CLAUDE.md", ".github/AGENTS.md", ".github/pull_request_template.md", ".github/workflows/carson-lint.yml" ]
51
+ "managed_files" => [ ".github/carson.md", ".github/copilot-instructions.md", ".github/CLAUDE.md", ".github/AGENTS.md", ".github/pull_request_template.md", ".github/workflows/carson-lint.yml" ],
52
+ "superseded_files" => [ ".github/carson-instructions.md" ]
52
53
  },
53
54
  "lint" => {
54
55
  "policy_source" => "wanghailei/lint.git"
@@ -216,6 +217,7 @@ module Carson
216
217
  @path_groups = fetch_hash( hash: fetch_hash( hash: data, key: "scope" ), key: "path_groups" ).transform_values { |value| normalize_patterns( value: value ) }
217
218
 
218
219
  @template_managed_files = fetch_string_array( hash: fetch_hash( hash: data, key: "template" ), key: "managed_files" )
220
+ @template_superseded_files = fetch_optional_string_array( hash: fetch_hash( hash: data, key: "template" ), key: "superseded_files" )
219
221
  lint_hash = fetch_hash( hash: data, key: "lint" )
220
222
  @lint_policy_source = lint_hash.fetch( "policy_source", "" ).to_s.strip
221
223
 
@@ -339,27 +339,34 @@ module Carson
339
339
  puts_verbose ""
340
340
  puts_verbose "[Template Sync Check]"
341
341
  results = template_results
342
+ stale = template_superseded_present
342
343
  drift_count = results.count { |entry| entry.fetch( :status ) == "drift" }
343
344
  error_count = results.count { |entry| entry.fetch( :status ) == "error" }
345
+ stale_count = stale.count
344
346
  results.each do |entry|
345
347
  puts_verbose "template_file: #{entry.fetch( :file )} status=#{entry.fetch( :status )} reason=#{entry.fetch( :reason )}"
346
348
  end
347
- puts_verbose "template_summary: total=#{results.count} drift=#{drift_count} error=#{error_count}"
349
+ stale.each { |file| puts_verbose "template_file: #{file} status=stale reason=superseded" }
350
+ puts_verbose "template_summary: total=#{results.count} drift=#{drift_count} stale=#{stale_count} error=#{error_count}"
348
351
  unless verbose?
349
- if drift_count.positive?
350
- drift_files = results.select { |entry| entry.fetch( :status ) == "drift" }.map { |entry| entry.fetch( :file ) }
351
- puts_line "Templates: #{drift_count} of #{results.count} drifted"
352
- drift_files.each { |file| puts_line " #{file}" }
352
+ if ( drift_count + stale_count ).positive?
353
+ summary_parts = []
354
+ summary_parts << "#{drift_count} of #{results.count} drifted" if drift_count.positive?
355
+ summary_parts << "#{stale_count} stale" if stale_count.positive?
356
+ puts_line "Templates: #{summary_parts.join( ", " )}"
357
+ results.select { |entry| entry.fetch( :status ) == "drift" }.each { |entry| puts_line " #{entry.fetch( :file )}" }
358
+ stale.each { |file| puts_line " #{file} — superseded" }
353
359
  else
354
360
  puts_line "Templates: #{results.count} files in sync"
355
361
  end
356
362
  end
357
363
  return EXIT_ERROR if error_count.positive?
358
364
 
359
- drift_count.positive? ? EXIT_BLOCK : EXIT_OK
365
+ ( drift_count + stale_count ).positive? ? EXIT_BLOCK : EXIT_OK
360
366
  end
361
367
 
362
368
  # Applies managed template files as full-file writes from Carson sources.
369
+ # Also removes superseded files that are no longer part of the managed set.
363
370
  def template_apply!
364
371
  fingerprint_status = block_if_outsider_fingerprints!
365
372
  return fingerprint_status unless fingerprint_status.nil?
@@ -367,6 +374,7 @@ module Carson
367
374
  puts_verbose ""
368
375
  puts_verbose "[Template Sync Apply]"
369
376
  results = template_results
377
+ stale = template_superseded_present
370
378
  applied = 0
371
379
  results.each do |entry|
372
380
  if entry.fetch( :status ) == "error"
@@ -386,11 +394,22 @@ module Carson
386
394
  applied += 1
387
395
  end
388
396
 
397
+ removed = 0
398
+ stale.each do |file|
399
+ file_path = resolve_repo_path!( relative_path: file, label: "template.superseded_files entry #{file}" )
400
+ File.delete( file_path )
401
+ puts_verbose "template_file: #{file} status=removed reason=superseded"
402
+ removed += 1
403
+ end
404
+
389
405
  error_count = results.count { |entry| entry.fetch( :status ) == "error" }
390
- puts_verbose "template_apply_summary: updated=#{applied} error=#{error_count}"
406
+ puts_verbose "template_apply_summary: updated=#{applied} removed=#{removed} error=#{error_count}"
391
407
  unless verbose?
392
- if applied.positive?
393
- puts_line "Templates applied (#{applied} updated)."
408
+ if applied.positive? || removed.positive?
409
+ summary_parts = []
410
+ summary_parts << "#{applied} updated" if applied.positive?
411
+ summary_parts << "#{removed} removed" if removed.positive?
412
+ puts_line "Templates applied (#{summary_parts.join( ", " )})."
394
413
  else
395
414
  puts_line "Templates in sync."
396
415
  end
@@ -428,6 +447,13 @@ module Carson
428
447
  config.template_managed_files.map { |managed_file| template_result_for_file( managed_file: managed_file ) }
429
448
  end
430
449
 
450
+ def template_superseded_present
451
+ config.template_superseded_files.select do |file|
452
+ file_path = resolve_repo_path!( relative_path: file, label: "template.superseded_files entry #{file}" )
453
+ File.file?( file_path )
454
+ end
455
+ end
456
+
431
457
  # Calculates whole-file expected content and returns sync status plus apply payload.
432
458
  def template_result_for_file( managed_file: )
433
459
  # Try subdirectory-aware path first (e.g. .github/workflows/carson-lint.yml),
@@ -764,7 +790,7 @@ module Carson
764
790
  end
765
791
 
766
792
  def offboard_cleanup_targets
767
- ( config.template_managed_files + [
793
+ ( config.template_managed_files + config.template_superseded_files + [
768
794
  ".github/workflows/carson-governance.yml",
769
795
  ".github/workflows/carson_policy.yml",
770
796
  ".carson.yml",
@@ -1 +1 @@
1
- Read `.github/carson-instructions.md` for repository governance rules enforced by Carson.
1
+ Read `.github/carson.md` for repository governance rules enforced by Carson.
@@ -1 +1 @@
1
- Read `.github/carson-instructions.md` for repository governance rules enforced by Carson.
1
+ Read `.github/AGENTS.md` for repository governance rules enforced by Carson.
@@ -0,0 +1,45 @@
1
+ # Carson Governance
2
+
3
+ This repository is governed by [Carson](https://github.com/wanghailei/carson), an autonomous governance runtime. Carson lives on the maintainer's workstation, not inside this repository.
4
+
5
+ ## What Carson Does Not Do
6
+
7
+ Carson has no `commit`, `push`, or `pr` commands. Use `git` and `gh` for those. Carson audits and governs; you execute.
8
+
9
+ ## Commands
10
+
11
+ **Before committing:**
12
+ ```bash
13
+ carson audit # full governance check — run before every commit
14
+ carson template check # detect drift in .github/* managed files, including stale superseded files
15
+ carson template apply # fix drift and remove superseded files
16
+ ```
17
+
18
+ **Before recommending merge:**
19
+ ```bash
20
+ carson review gate # block until actionable review findings are resolved
21
+ ```
22
+
23
+ **Branch housekeeping:**
24
+ ```bash
25
+ carson sync # fast-forward local main from remote
26
+ carson prune # remove stale branches (safer than git branch -d on squash repos)
27
+ carson housekeep # sync + prune together
28
+ ```
29
+
30
+ ## Exit Codes
31
+
32
+ - `0` — success
33
+ - `1` — runtime or configuration error
34
+ - `2` — policy blocked (hard stop; treat as expected failure in CI)
35
+
36
+ ## Governance Rules
37
+
38
+ - Before commit and before push, run `carson audit`.
39
+ - At session start and again immediately before merge recommendation, run `gh pr list --state open --limit 50` and re-confirm active PR priorities.
40
+ - Before merge recommendation, run `carson review gate`; it enforces warm-up wait, unresolved-thread convergence, and `Disposition:` acknowledgements for actionable top-level findings.
41
+ - Actionable findings are unresolved review threads, any non-author `CHANGES_REQUESTED` review, or non-author comments/reviews with risk keywords (`bug`, `security`, `incorrect`, `block`, `fail`, `regression`).
42
+ - `Disposition:` responses must include one token (`accepted`, `rejected`, `deferred`) and the target review URL.
43
+ - Scheduled governance runs `carson review sweep` every 8 hours to track late actionable review activity.
44
+ - Do not treat green checks or `mergeStateStatus: CLEAN` as sufficient if unresolved review threads remain.
45
+ - Never suggest destructive operations on protected refs (`main`/`master`, local or remote).
@@ -1 +1 @@
1
- Read `.github/carson-instructions.md` for repository governance rules enforced by Carson.
1
+ Read `.github/AGENTS.md` for repository governance rules enforced by Carson.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: carson
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.13.2
4
+ version: 2.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hailei Wang
@@ -63,7 +63,7 @@ files:
63
63
  - lib/carson/version.rb
64
64
  - templates/.github/AGENTS.md
65
65
  - templates/.github/CLAUDE.md
66
- - templates/.github/carson-instructions.md
66
+ - templates/.github/carson.md
67
67
  - templates/.github/copilot-instructions.md
68
68
  - templates/.github/pull_request_template.md
69
69
  - templates/.github/workflows/carson-lint.yml
@@ -1,12 +0,0 @@
1
- ## Shared Governance Baseline
2
-
3
- - GitHub rulesets and required checks are merge authority.
4
- - Carson runs as an outsider runtime for hook health, main sync, scope integrity, and gh visibility.
5
- - Before commit and before push, run `carson audit`.
6
- - At session start and again immediately before merge recommendation, run `gh pr list --state open --limit 50` and re-confirm active PR priorities.
7
- - Before merge recommendation, run `carson review gate`; it enforces warm-up wait, unresolved-thread convergence, and `Disposition:` dispositions for actionable top-level findings.
8
- - Actionable findings are unresolved review threads, any non-author `CHANGES_REQUESTED` review, or non-author comments/reviews with risk keywords (`bug`, `security`, `incorrect`, `block`, `fail`, `regression`).
9
- - `Disposition:` dispositions must include one token (`accepted`, `rejected`, `deferred`) and the target review URL.
10
- - Scheduled governance runs `carson review sweep` every 8 hours to track late actionable review activity on recent open/closed PRs.
11
- - Do not treat green checks or `mergeStateStatus: CLEAN` as sufficient if unresolved review threads remain.
12
- - Never suggest destructive operations on protected refs (`main`/`master`, local or remote).