Skip to content

Commit 8b55ebc

Browse files
committed
Merge origin/main into the docs-hygiene sweep branch
main landed a repo-wide behavior-preserving simplification sweep (#3379) across 203 files, which collided with this branch on 43 of them: one plugin.json and one CHANGELOG.md for each of 23 plugins. This conflict is why CI went quiet rather than red. GitHub schedules pull_request workflows against the computed merge commit, and it could not compute one, so ci, pr-title, claude-review and claude-security-review stopped being created for the last two heads while the pull_request_target workflows (do-not-merge, pr-issue-linkage) kept firing normally against the base. A missing run reads exactly like a slow one, which is what made it worth chasing. Every collision is the same shape. main took the next patch after the base version for its sweep entry, and this branch had already used that same number for a different change. Resolution rule: main's entry is released and keeps its number; this branch's entries are unreleased and renumber above it, with the manifest ending at the highest. So docs-hygiene's 0.21.12 through 0.21.16 become 0.21.13 through 0.21.17, main's 0.21.12 stays, and the manifest reads 0.21.17. Resolved by script rather than by hand across 43 files, and the script refuses rather than guesses: it requires main's new entries to be contiguous patches sitting directly on the base version, and reports anything else for a human. It refused three plugins on the first pass, correctly, because ai-briefing, repo-fleet-hygiene and testing had both sides land on the same version number, so their manifests never conflicted and the slice boundary cut inside our own block. Anchoring that boundary on the base entry rather than on main's newest fixed it, and all 23 then resolved. Verified: no conflict markers anywhere in the tree, every one of the 23 manifests agrees with its changelog's top entry, both changelog gates pass including the duplicate-version check that this collision would have tripped, markdownlint clean at 1358 files, typos, editorconfig, the plugin-options gate, plugin contracts across 3018 files, and the contract-slice prune gate. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FTVH5ZRVph75kvxzUAnb6q
2 parents 803551a + 3813cde commit 8b55ebc

200 files changed

Lines changed: 1913 additions & 1591 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

plugins/ai-briefing/CHANGELOG.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
All notable changes to the `ai-briefing` plugin are documented here. Format follows
44
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning.
55

6-
## [0.7.9]
6+
## [0.7.10]
77

88
### Changed
99

@@ -25,6 +25,20 @@ All notable changes to the `ai-briefing` plugin are documented here. Format foll
2525
those were folded into `SKILL.md` before the file went, and the rest was already stated there.
2626
The `context/` directory held nothing else and was removed with it.
2727

28+
## [0.7.9]
29+
30+
### Changed
31+
32+
- **Behavior-preserving simplification pass (repo-wide batch-simplify).** Removed the dead
33+
`collectLinks()` helper from `output/build/lib/parse-briefing.js` (defined, never called);
34+
removed a false sentence from `output/build/lib/emit-slides.js`'s `balanceTiers` doc comment
35+
that described a nonexistent explicit-tier-marker override; deduplicated `output/build/validate.js`'s
36+
twice-inlined render-settle and section-overflow-scan snippets into shared `settleRender` and
37+
`collectSectionOverflows` helpers passed to `page.evaluate`, and corrected its stale
38+
`Screenshots:` summary line to name the `section-*.png` / `responsive-*.png` files it actually
39+
writes. No artifact bytes, exit codes, or contracts changed; suite 35/35 green, plus an
40+
independent refutation pass with a live Playwright smoke of the serialized helpers.
41+
2842
## [0.7.8]
2943

3044
### Changed

plugins/ai-briefing/skills/generate/output/build/lib/emit-slides.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,7 @@ function sortTiersByDate(normalized) {
272272

273273
/** Mutate `normalized` to apply tier auto-balance:
274274
* - HIGH > 7 → demote weakest (last) item to MED until HIGH ≤ 7
275-
* - MED ≥ 5 AND HIGH < 3 → promote first MED item to HIGH until balance
276-
* Authoring intent always wins for explicit tier markers in headlines (e.g. "[STATE: GA]"). */
275+
* - MED ≥ 5 AND HIGH < 3 → promote first MED item to HIGH until balance */
277276
function balanceTiers(normalized) {
278277
for (const bucket of Object.keys(normalized)) {
279278
const data = normalized[bucket];

plugins/ai-briefing/skills/generate/output/build/lib/parse-briefing.js

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,6 @@ function flattenInline(nodes) {
3939
return out;
4040
}
4141

42-
/** Collect all link nodes inside a subtree. */
43-
function collectLinks(node) {
44-
const urls = [];
45-
visit(node, "link", (n) => urls.push(n.url));
46-
return urls;
47-
}
48-
4942
function stripMetadataLabel(text, label) {
5043
return text.replace(new RegExp(`^${label}:\\s*`, "i"), "").trim();
5144
}

plugins/ai-briefing/skills/generate/output/build/validate.js

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,24 @@ await fs.mkdir(SHOTS_DIR, { recursive: true });
5050

5151
const issues = { blocking: [], warnings: [] };
5252

53+
// Runs inside the page: settle web fonts + two rAFs so layout is stable.
54+
const settleRender = async () => {
55+
await document.fonts.ready;
56+
await new Promise((resolve) =>
57+
requestAnimationFrame(() => requestAnimationFrame(resolve)),
58+
);
59+
};
60+
61+
// Runs inside the page: sections with horizontal overflow.
62+
// Skips decorative orb-overflow sections (open, qa) — orb gradients are intentionally
63+
// transform-translated past edges; overflow:hidden clips them visually but scrollWidth
64+
// still reports the layout extent. Pure cosmetic, no scrollbar appears.
65+
const collectSectionOverflows = () =>
66+
[...document.querySelectorAll("main#deck > section.section")]
67+
.filter((s) => !["open", "qa"].includes(s.id))
68+
.filter((s) => s.scrollWidth > s.clientWidth + 4)
69+
.map((s) => ({ id: s.id, sw: s.scrollWidth, cw: s.clientWidth }));
70+
5371
// ────────────────────────────────────────────────────────────────────
5472
// Gate 1: Zod schema
5573
// ────────────────────────────────────────────────────────────────────
@@ -81,12 +99,7 @@ await page.route(/^https?:\/\//, (route) => {
8199

82100
await page.goto(pathToFileURL(HTML).href, { waitUntil: "load" });
83101
await page.waitForSelector("main#deck");
84-
await page.evaluate(async () => {
85-
await document.fonts.ready;
86-
await new Promise((resolve) =>
87-
requestAnimationFrame(() => requestAnimationFrame(resolve)),
88-
);
89-
});
102+
await page.evaluate(settleRender);
90103

91104
// Section-based audit (sectioned-scroll deck). One screenshot per <section>.
92105
// Page-wide URL/headline coverage check (vs old per-slide approach).
@@ -113,15 +126,9 @@ const pageData = await page.evaluate(() => {
113126
return {
114127
urls: Array.from(document.querySelectorAll(".news-url")).map((a) => a.href),
115128
headlines: Array.from(document.querySelectorAll(".news-headline, .flair-headline, .pattern-headline")).map((s) => s.innerText.trim()),
116-
// Skip decorative orb-overflow sections (open, qa) — orb gradients are intentionally
117-
// transform-translated past edges; overflow:hidden clips them visually but scrollWidth
118-
// still reports the layout extent. Pure cosmetic, no scrollbar appears.
119-
sectionOverflows: [...document.querySelectorAll("main#deck > section.section")]
120-
.filter((s) => !["open", "qa"].includes(s.id))
121-
.filter((s) => s.scrollWidth > s.clientWidth + 4)
122-
.map((s) => ({ id: s.id, sw: s.scrollWidth, cw: s.clientWidth })),
123129
};
124130
});
131+
pageData.sectionOverflows = await page.evaluate(collectSectionOverflows);
125132

126133
await browser.close();
127134

@@ -263,20 +270,10 @@ try {
263270
await p2.goto(pathToFileURL(HTML).href, { waitUntil: "load" });
264271
await p2.waitForSelector("main#deck");
265272
await p2.evaluate((z) => { document.documentElement.style.zoom = String(z); }, m.zoom);
266-
await p2.evaluate(async () => {
267-
await document.fonts.ready;
268-
await new Promise((resolve) =>
269-
requestAnimationFrame(() => requestAnimationFrame(resolve)),
270-
);
271-
});
273+
await p2.evaluate(settleRender);
272274

273275
// Per-section overflow check
274-
const overflows = await p2.evaluate(() => {
275-
return [...document.querySelectorAll("main#deck > section.section")]
276-
.filter((s) => !["open", "qa"].includes(s.id))
277-
.filter((s) => s.scrollWidth > s.clientWidth + 4)
278-
.map((s) => ({ id: s.id, sw: s.scrollWidth, cw: s.clientWidth }));
279-
});
276+
const overflows = await p2.evaluate(collectSectionOverflows);
280277

281278
// Single full-page screenshot per matrix combo (decks can be long; cap height)
282279
const shotPath = path.join(SHOTS_DIR, `responsive-${m.name}.png`);
@@ -328,7 +325,7 @@ issues.blocking.forEach((m) => console.log(` ✗ ${m}`));
328325
console.log(` Warnings: ${issues.warnings.length}`);
329326
issues.warnings.forEach((m) => console.log(` ⚠ ${m}`));
330327
console.log(` Audit JSON: ${path.join(SHOTS_DIR, "audit.json")}`);
331-
console.log(` Screenshots: ${SHOTS_DIR}/slide-*.png`);
328+
console.log(` Screenshots: ${SHOTS_DIR}/section-*.png + responsive-*.png`);
332329

333330
if (issues.blocking.length) {
334331
console.log(`\n✗ VALIDATION FAILED — blocking issues present.`);

plugins/autonomy/.claude-plugin/plugin.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
33
"name": "autonomy",
4-
"version": "0.22.11",
4+
"version": "0.22.12",
55
"description": "Governed autonomous agent operation: role-topology, binding-seam, wiring-vs-advisor, telemetry, return-accounting, trigger-dispatch, per-work-class guardrail-matrix, standing-routine-catalog, and design-only runner-charter contracts for climbing the AI-adoption ladder, plus a guided-setup skill that discovers an adopting org's state, writes its schema-versioned binding, wires standards-pinned OTLP emission with a zero-cost file-artifact default, wires human-attested return capture at the task boundary, wires signal adapters with one governed dispatch entrypoint, binds the five-class guardrail matrix to an org's isolation substrates with an in-boundary live-validation probe before recording each fail-closed binding, and stands up standing-routine-catalog classes as scheduled temporal signal adapters behind the one governed queue with free scheduling defaults wired as reviewable changes and each routine's work-class mapping homed on the security surface.",
66
"author": {
77
"name": "Melodic Software",
@@ -25,7 +25,7 @@
2525
"lane_stop_gate_enabled": {
2626
"type": "boolean",
2727
"title": "lane-stop gate",
28-
"description": "Opt an autonomous lane into the deterministic Stop-hook completion gate. Default OFF a Stop-blocking hook must never engage for an interactive session. Honored from user or managed settings only (the gate reads those files itself); per-session lanes are armed by the claude-ops lane launcher instead. The env mirror is never authority (#1784).",
28+
"description": "Opt an autonomous lane into the deterministic Stop-hook completion gate. Default OFF \u2014 a Stop-blocking hook must never engage for an interactive session. Honored from user or managed settings only (the gate reads those files itself); per-session lanes are armed by the claude-ops lane launcher instead. The env mirror is never authority (#1784).",
2929
"default": false
3030
},
3131
"lane_stop_gate_sentinel": {
@@ -43,7 +43,7 @@
4343
"lane_stop_gate_arm_id": {
4444
"type": "string",
4545
"title": "lane-stop gate arm id (launcher-managed)",
46-
"description": "Written by the lane launcher at launch: names this session's arm record in the plugin's own data directory (hooks/lane-stop-gate-arm.sh). A capability pointer, never authority by itself the gate validates it, honors only a record in its install-derived store, and binds it to the first presenting session. Not set by hand.",
46+
"description": "Written by the lane launcher at launch: names this session's arm record in the plugin's own data directory (hooks/lane-stop-gate-arm.sh). A capability pointer, never authority by itself \u2014 the gate validates it, honors only a record in its install-derived store, and binds it to the first presenting session. Not set by hand.",
4747
"default": ""
4848
},
4949
"lane_notify_enabled": {
@@ -67,13 +67,13 @@
6767
"verification_lens_pool": {
6868
"type": "string",
6969
"title": "verification lens pool",
70-
"description": "Ordered, comma-separated pool of verification lenses the model-adjudicated checker slots draw from one distinct lens per slot, in pool order. Tokens come from the closed vocabulary in the verification-topology contract leaf; an unrecognized token is recorded as unresolved and draws no lens, and a pool shorter than a class's model-adjudicated slot count leaves the remaining slots unlensed rather than repeating a lens. The pool contributes to no count: how many checkers a class runs, how they must differ, and whether one must be cross-vendor are floors on the org's security binding, outside this setting's reach.",
70+
"description": "Ordered, comma-separated pool of verification lenses the model-adjudicated checker slots draw from \u2014 one distinct lens per slot, in pool order. Tokens come from the closed vocabulary in the verification-topology contract leaf; an unrecognized token is recorded as unresolved and draws no lens, and a pool shorter than a class's model-adjudicated slot count leaves the remaining slots unlensed rather than repeating a lens. The pool contributes to no count: how many checkers a class runs, how they must differ, and whether one must be cross-vendor are floors on the org's security binding, outside this setting's reach.",
7171
"default": "specification,adversarial,contract,regression,evidence"
7272
},
7373
"visual_narration_enabled": {
7474
"type": "boolean",
7575
"title": "advisory visual narration lane",
76-
"description": "Run the advisory visual narration lane: strictly downstream of deterministic detection, it writes a plain-language account of a difference the deterministic layer already found and attaches it to the run record for the human gate. Advisory only it emits no verdict, fills no checker slot, is counted by no floor, and never gates a transition; no cell anywhere names it as authority. Default OFF: it is inert without an upstream deterministic comparator, and each narrated artifact is a metered vision-model call.",
76+
"description": "Run the advisory visual narration lane: strictly downstream of deterministic detection, it writes a plain-language account of a difference the deterministic layer already found and attaches it to the run record for the human gate. Advisory only \u2014 it emits no verdict, fills no checker slot, is counted by no floor, and never gates a transition; no cell anywhere names it as authority. Default OFF: it is inert without an upstream deterministic comparator, and each narrated artifact is a metered vision-model call.",
7777
"default": false
7878
}
7979
}

plugins/autonomy/CHANGELOG.md

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
All notable changes to the `autonomy` plugin are documented here. Format follows
44
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning.
55

6-
## [0.22.11]
6+
## [0.22.12]
77

88
### Changed
99

@@ -14,7 +14,7 @@ All notable changes to the `autonomy` plugin are documented here. Format follows
1414
in-page anchors re-based for the extra directory level. Docs-hygiene sweep,
1515
L2-progressive-disclosure.
1616

17-
## [0.22.10]
17+
## [0.22.11]
1818

1919
### Changed
2020

@@ -24,7 +24,7 @@ All notable changes to the `autonomy` plugin are documented here. Format follows
2424
entry in this file already carries, and names the positive path instead: arm a lane through the
2525
launcher. Docs-hygiene sweep, L8-write-for-humans.
2626

27-
## [0.22.9]
27+
## [0.22.10]
2828

2929
### Changed
3030

@@ -33,6 +33,20 @@ All notable changes to the `autonomy` plugin are documented here. Format follows
3333
write-for-humans style rule that the phrase is just `to`. The generated options
3434
block in `README.md` regenerated with the shorter wording; no other change.
3535

36+
## [0.22.9]
37+
38+
### Changed
39+
40+
- **Behavior-preserving simplification pass (repo-wide batch-simplify).** In
41+
`skills/setup/scripts/resolve-prerequisites.mjs`, collapsed `probeMcp`'s presence ternary
42+
(two object literals differing only in `result`) into one literal and removed the dead
43+
`ran` key from `resolveNeed`'s return (its sole consumer projects fields explicitly, so
44+
the key never reached output); in `apply-prerequisite-resolution.mjs`, hoisted the
45+
twice-computed non-interactive check into one const; removed a stale comment in
46+
`check-prerequisite-resolution-slice.test.sh`. Emitted JSON is byte-identical (56
47+
old-vs-new differential runs across fixtures, surfaces, and synthetic `.mcp.json` repos);
48+
suites green (22 + 4).
49+
3650
## [0.22.8]
3751

3852
### Changed

plugins/autonomy/skills/setup/scripts/apply-prerequisite-resolution.mjs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -255,22 +255,22 @@ function main() {
255255
const proposals = proseProposals(args.repo);
256256
const orgStops = orgRungStops(check);
257257
const enablement = narrowingAdvice(check);
258+
const nonInteractive = args.nonInteractive || !process.stdin.isTTY;
258259

259260
const report = {
260261
schema_version: 1,
261262
action: "apply-propose",
262-
non_interactive: args.nonInteractive || !process.stdin.isTTY,
263+
non_interactive: nonInteractive,
263264
reconcile_findings: findings,
264265
prose_proposals: proposals,
265266
org_rung_stops: orgStops,
266267
enablement_advice: enablement,
267268
security_binding_writes: false,
268-
assumptions:
269-
args.nonInteractive || !process.stdin.isTTY
270-
? [
271-
"non-interactive context: skipped ask-and-persist rungs; proposals reported as assumptions",
272-
]
273-
: [],
269+
assumptions: nonInteractive
270+
? [
271+
"non-interactive context: skipped ask-and-persist rungs; proposals reported as assumptions",
272+
]
273+
: [],
274274
note: "Human must ratify via --ratify --proposal; slice never auto-writes org-rung or security axes",
275275
check,
276276
};

plugins/autonomy/skills/setup/scripts/check-prerequisite-resolution-slice.test.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,6 @@ fs.writeFileSync(p, JSON.stringify(b, null, 2) + "\n");
159159
if node "$ENVELOPE" "$tmp/envelope.md" --binding "$tmp/repo/.claude/autonomy/binding.json" >/dev/null 2>"$tmp/env.err"; then
160160
ok "envelope: binding with prerequisite_resolution section passes"
161161
else
162-
# Print for diagnosis but still allow known work_class-related failures?
163162
fail "envelope: $(cat "$tmp/env.err")"
164163
fi
165164

plugins/autonomy/skills/setup/scripts/resolve-prerequisites.mjs

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -578,25 +578,15 @@ function probeMcp(repoRoot) {
578578
}
579579
}
580580
return {
581-
presence: presence
582-
? {
583-
result: "present",
584-
ran: true,
585-
provenance: {
586-
kind: "probe",
587-
probe_class: "harness-context",
588-
path: ".mcp.json",
589-
},
590-
}
591-
: {
592-
result: "absent",
593-
ran: true,
594-
provenance: {
595-
kind: "probe",
596-
probe_class: "harness-context",
597-
path: ".mcp.json",
598-
},
599-
},
581+
presence: {
582+
result: presence ? "present" : "absent",
583+
ran: true,
584+
provenance: {
585+
kind: "probe",
586+
probe_class: "harness-context",
587+
path: ".mcp.json",
588+
},
589+
},
600590
enablement: {
601591
result: enablement.result,
602592
ran: enablement.ran,
@@ -817,7 +807,6 @@ function resolveNeed(need, identity, ctx) {
817807
need: need.id,
818808
probe_class: need.probe_class,
819809
result: effective,
820-
ran: probe.ran,
821810
provenance,
822811
findings,
823812
};

plugins/claude-config/.claude-plugin/plugin.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
33
"name": "claude-config",
4-
"version": "0.40.5",
5-
"description": "Nine configuration-health skills (plus setup) for a repo's Claude Code configuration: audit (settings.json / .mcp.json / hooks / plugins / permissions drift), audit-automation-gaps (evidence-gated verdicts on automation gaps), audit-permission-grants (allow-rule / allowed-tools grants for auto-mode durability and portability), audit-permission-state (the permission rules actually in effect — every settings scope merged with per-rule provenance, what auto mode drops on entry, config written where nothing reads it, and which managed intents are enforced versus loosenable), draft-auto-mode-rules (interview and draft a paste-ready autoMode classifier block; prints only, never writes), audit-instructions (locally-owned instruction surfaces vs current model capability — proposes removals/rewrites of instructions the model no longer needs, and detects cross-surface instruction conflicts), audit-prompting-postures (the additive lane — posture guidance the prompting guide says a component's purpose needs but the component does not carry), audit-pass (one coordinated, ordered, resumable pass over a named target — three-scope inventory, run-time-derived exclusion set, stable finding identity, suppression memory, resume, one human gate — delegating every check to the plugin that owns it), and unhobble (the empirical bare-baseline experiment: reversibly strip a repo's standing instructions, log real stumbles against the current model, re-add only what evidence earns).",
4+
"version": "0.40.6",
5+
"description": "Nine configuration-health skills (plus setup) for a repo's Claude Code configuration: audit (settings.json / .mcp.json / hooks / plugins / permissions drift), audit-automation-gaps (evidence-gated verdicts on automation gaps), audit-permission-grants (allow-rule / allowed-tools grants for auto-mode durability and portability), audit-permission-state (the permission rules actually in effect \u2014 every settings scope merged with per-rule provenance, what auto mode drops on entry, config written where nothing reads it, and which managed intents are enforced versus loosenable), draft-auto-mode-rules (interview and draft a paste-ready autoMode classifier block; prints only, never writes), audit-instructions (locally-owned instruction surfaces vs current model capability \u2014 proposes removals/rewrites of instructions the model no longer needs, and detects cross-surface instruction conflicts), audit-prompting-postures (the additive lane \u2014 posture guidance the prompting guide says a component's purpose needs but the component does not carry), audit-pass (one coordinated, ordered, resumable pass over a named target \u2014 three-scope inventory, run-time-derived exclusion set, stable finding identity, suppression memory, resume, one human gate \u2014 delegating every check to the plugin that owns it), and unhobble (the empirical bare-baseline experiment: reversibly strip a repo's standing instructions, log real stumbles against the current model, re-add only what evidence earns).",
66
"author": {
77
"name": "Melodic Software",
88
"email": "info@melodicsoftware.com"

0 commit comments

Comments
 (0)