Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions docs/adr/0041-place-the-machine-profile-as-a-claude-ops-skill.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Place the machine profile as a claude-ops skill

- Status: accepted for the placement only
- Status: accepted
- Date: 2026-09-29

## Context
Expand Down Expand Up @@ -38,12 +38,11 @@ Place the profile as a skill in `claude-ops`, not as a new plugin.

## Status scope

Accepted for the placement only. The invocation-mode change (class (ii) and the hidden `setup`
skills) and any change to the setup contract stay deferred to the owner's later decision on the
design document. This record does not authorize the skill, its scripts, or a version bump.
Accepted. The skill, its scripts, its tests and the `claude-ops` version bump are authorized. The
invocation-mode change (class (ii) and the hidden `setup` skills) and any change to the setup
contract are not part of this decision.

## Consequences

The skill's directory is under `plugins/claude-ops/skills/`. Whether its scope is too broad for
`claude-ops` is the owner's call on the design document; if the owner chooses a new plugin, this
record is superseded.
The skill's directory is under `plugins/claude-ops/skills/`. A move to a new plugin would
supersede this record.
2 changes: 1 addition & 1 deletion docs/catalog.md

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/out-of-scope/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ One file per rejection, matched and appended to as the `/work-items:triage` "Rej
ledger" step defines. The ledger records rejections only, never built features or deferred work: a
deferral, a park, or an open question is an open tracker item.

Two entries are agent proposals the owner has not ruled on, not settled rejections:
`machine-profile.md` (#4666) and `shared-surface-instruction-governance.md` (#3568). Each says so in
its own text, and the owner's ruling on that issue confirms, reverses, or removes the entry.
One entry is an agent proposal the owner has not ruled on, not a settled rejection:
`shared-surface-instruction-governance.md` (#3568). It says so in its own text, and the owner's
ruling on that issue confirms, reverses, or removes the entry.
81 changes: 18 additions & 63 deletions docs/out-of-scope/machine-profile.md
Original file line number Diff line number Diff line change
@@ -1,79 +1,34 @@
# Re-runnable machine profile for setup skills

Record for
[#4666](https://github.com/melodic-software/claude-code-plugins/issues/4666),
a proposed host-fact store that would drive every plugin `setup` skill.

Status: unratified agent proposal. The placement is accepted under
[ADR 0041](../adr/0041-place-the-machine-profile-as-a-claude-ops-skill.md); the owner has not ruled
on whether to build it or on any setup-contract change, and #4666 is open for that decision. Until
then it is not a settled rejection.
[#4666](https://github.com/melodic-software/claude-code-plugins/issues/4666).

## Decision

**Superseded in part.** The design is now
[machine-profile-design](../specs/machine-profile-design.md) and the placement is
[ADR 0041](../adr/0041-place-the-machine-profile-as-a-claude-ops-skill.md): a skill in
`claude-ops`. Building the skill and any setup-contract or invocation-mode change stay
undecided until the owner rules on that design. Until then, no `machine-profile` skill
exists, no new plugin is added, and the rest of this record stands.

- **Option 1 (declined):** orchestrate by instruction. The profile would emit
`/<plugin>:setup check` lines for the operator to type. That respects class
(ii) and is unpaid operator cost, not a skill to ship.
- **Option 2 (declined):** split `check` from `apply` so `check` is
model-invocable. The per-plugin form shipped in `actionlint`, `biome-format`,
`context7`, `go-format` and `markdown-format` (a separate model-invocable `check`
skill beside the manual `setup`) with no invocation-mode amendment; the class list in
`docs/conventions/invocation-mode/README.md` is still three. Whether to keep that
per-plugin split is an open owner question,
[#4240](https://github.com/melodic-software/claude-code-plugins/issues/4240) question 2.
- **Option 3 (declined):** relax `disable-model-invocation` on `check` only.
Same effect as option 2 with less structure.
The profile is built as the `claude-ops` `machine-profile` skill:
[machine-profile-design](../specs/machine-profile-design.md), placed by
[ADR 0041](../adr/0041-place-the-machine-profile-as-a-claude-ops-skill.md). Two options for it are
declined:

**Claim (original park, before the design document):** a re-runnable machine profile that discovers host facts once and
drives the fleet's setup skills has no model-invocable path to them: all 58
plugin `setup` skills are `disable-model-invocation: true`, which
`scripts/validate-plugin-contracts.mjs` requires. The model-invocable host
checks are `actionlint:check`, `biome-format:check`, `context7:check`,
`go-format:check` and `markdown-format:check` (one per plugin) and
`claude-ops:prerequisites`, a read-only report over the `prerequisites.json`
that 7 plugins declare. Host discovery stays inside each plugin's `setup`. If the idea returns, it is a `claude-ops` skill that feeds
`machine-health`'s declared-configuration drift check, never a second
host-fact store.
**Basis:** origin/main: 58 plugin-level `plugins/*/skills/setup/SKILL.md`
files, all `disable-model-invocation: true`, required at
`scripts/validate-plugin-contracts.mjs:189-190`. The `check` skill of each of
those five plugins and `plugins/claude-ops/skills/prerequisites/SKILL.md`
set `disable-model-invocation: false`. `docs/conventions/invocation-mode/README.md`
still lists three classes, class (ii) among them, and the invocation-reach
invariant (a `true` skill cannot be invoked by any other skill). No
`machine-profile` skill or plugin under `plugins/`. `machine-health` already
owns a `config` category for declared-configuration drift.
**As of:** 2026-09-29.
**Recheck:** a setup skill drops `disable-model-invocation: true`
(`git grep -L 'disable-model-invocation: true' -- 'plugins/*/skills/setup/SKILL.md'`
lists a file; it lists none today), or a maintainer funds a `claude-ops` skill
whose only job is a read-only host-fact document that `machine-health`
consumes.
- **Orchestration by instruction (declined):** the profile does not orchestrate the whole fleet by
instruction, as a driver that has the operator type a command per plugin. Where it cannot safely
reproduce a setup's `check` probes it relays that one `/<plugin>:setup check` line, the fallback
the design describes.
- **Setup contract change (declined):** no setup skill is changed and
`validate-plugin-contracts.mjs` is untouched.

## Rationale

- Naive orchestration is impossible today: every setup skill is model-hidden.
- Option 3 changes the contract `validate-plugin-contracts.mjs` enforces on all
58 setup skills. Option 2 adds a `check` skill to each setup plugin that
lacks one. Neither is a claude-ops slice.
- A parallel host-fact document would compete with `machine-health` instead of
feeding it.
- Per-plugin setup already owns prerequisite logic and versions with the
plugin. Absorbing that into one driver is the gotcha the issue named.
- Every setup skill is model-hidden, so the profile cannot drive them directly.
- Changing the setup contract or the invocation-mode class is a fleet change across every `setup`
skill, not a `claude-ops` slice.
- Per-plugin setup owns prerequisite logic and versions with the plugin; the profile reads host
facts and does not absorb that logic.

## Revisit when

- a `setup` skill becomes model-invocable (the Recheck condition above), or
- the owner rules on the check/setup split in #4240 (question 2), or
- an operator go names a read-only host-fact document with no setup-skill
orchestration.
The built profile shows a check that the existing wrappers and reproduction cannot cover. The
setup-contract question is tracked with #4240.

## Prior requests

Expand Down
1 change: 1 addition & 0 deletions docs/skill-cheat-sheet.md
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,7 @@ owned by [docs/catalog-taxonomy.md](catalog-taxonomy.md).
| [`/claude-ops:audit-skill-visibility`](../plugins/claude-ops/skills/audit-skill-visibility/SKILL.md) | `claude-ops` | weekly | Which skills the model can actually see, which are starved, and which are unobservable |
| [`/claude-ops:inventory`](../plugins/claude-ops/skills/inventory/SKILL.md) | `claude-ops` | weekly | Enumerate every command, skill, agent, and plugin component this machine can invoke |
| [`/claude-ops:lanes`](../plugins/claude-ops/skills/lanes/SKILL.md) | `claude-ops` | daily | Start, restart, stop, and check loop lanes as named background sessions |
| [`/claude-ops:machine-profile`](../plugins/claude-ops/skills/machine-profile/SKILL.md) | `claude-ops` | weekly | Discover, store and diff machine facts and per-tree identity domains. Read-only by default. |
| [`/claude-ops:morning-brief`](../plugins/claude-ops/skills/morning-brief/SKILL.md) | `claude-ops` | daily | Print the operator's read-only morning view. Queues, merge-ready PRs, parked decisions |
| [`/claude-ops:observability`](../plugins/claude-ops/skills/observability/SKILL.md) | `claude-ops` | weekly | Report on locally captured telemetry. Token burn, cost, hook latency, per-session activity |
| [`/claude-ops:plugins`](../plugins/claude-ops/skills/plugins/SKILL.md) | `claude-ops` | weekly | Bring the machine's plugin fleet current. Refresh, update, install per policy |
Expand Down
43 changes: 19 additions & 24 deletions docs/specs/machine-profile-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
Design for a re-runnable machine profile that discovers host facts once, stores them, and hands
each plugin's `setup` the answers. Tracked by
[#4666](https://github.com/melodic-software/claude-code-plugins/issues/4666). This document
records design only: it changes no setup contract, no invocation-mode class, and no plugin.
records the design and its rulings. The build adds a `claude-ops` skill and changes no setup
contract and no invocation-mode class.

## Contents

Expand All @@ -15,9 +16,9 @@ records design only: it changes no setup contract, no invocation-mode class, and
- [Manual-change policy](#manual-change-policy)
- [Reuse and machine-health](#reuse-and-machine-health)
- [Placement](#placement)
- [Out of scope until the later decision](#out-of-scope-until-the-later-decision)
- [Out of scope](#out-of-scope)
- [Acceptance criteria left for the build](#acceptance-criteria-left-for-the-build)
- [Open questions](#open-questions)
- [Rulings](#rulings)
- [Verification record](#verification-record)

## Problem
Expand Down Expand Up @@ -236,20 +237,18 @@ profile's `diff` is the only consumer.
**Recommendation: a skill in `claude-ops`, not a new plugin.**
**Basis:** `claude-ops` already owns fleet state and ships `prerequisites` and `inventory`, the two
skills the profile reads; a new plugin would add a third owner of host facts beside
`machine-health`. Judgment on the remaining half: whether the skill's scope is too broad for
`claude-ops` stays with the owner when ruling on this document. The decision is recorded in
`machine-health`. The owner ratified the placement. The decision is recorded in
[ADR 0041](../adr/0041-place-the-machine-profile-as-a-claude-ops-skill.md).

## Out of scope until the later decision
## Out of scope

Held for the owner's later ruling on this document:
Not part of the build:

- Any change to the setup contract, and any change to `validate-plugin-contracts.mjs`.
- Amending invocation-mode class (ii) or adding a class, and any change to a `setup` skill's
`disable-model-invocation` value.
- Adding a model-invocable `check` skill for a plugin that lacks one.
- Version bumps and CHANGELOG entries for any touched plugin.
- The skill itself, its scripts, and its tests.
- Version bumps and CHANGELOG entries for any plugin other than `claude-ops`.

## Acceptance criteria left for the build

Expand All @@ -268,21 +267,17 @@ tree under a scratch `HOME` and no real-host specifics:
`npm view ctx7 version` writes `.npm/_logs` and an update-notifier marker under `HOME`. Test:
hash both trees before and after. `apply` writes nothing without an explicit confirm.

## Open questions

Each is for the later decision on this document. Placement is settled by
[ADR 0041](../adr/0041-place-the-machine-profile-as-a-claude-ops-skill.md) and is not open here.

1. **Class (ii).** Amend class (ii), add a class, or leave the setup skills hidden and rely on
reproduction. Recommendation: leave them hidden until the profile is built and shows a check the
wrappers and reproduction cannot cover. Unblocks: whether the fleet contract change happens at
all.
2. **Keying deviation.** Ratify a non-project-keyed machine section under plugin-data-report-keying.
Recommendation: ratify, with per-domain sections keyed by tree. Unblocks: the store's path scheme.
3. **The machine-health feed.** Whether machine-health ships a `config` check that reads the
profile, or the profile's `diff` stays the only consumer. Recommendation: ship the check only
once the profile exists and runs on an OS whose machine-health checks are implemented. Unblocks: the handoff
contract.
## Rulings

Placement is settled by
[ADR 0041](../adr/0041-place-the-machine-profile-as-a-claude-ops-skill.md).

1. **Class (ii).** The setup skills stay hidden and class (ii) is unchanged. The profile relies on
reproduction and relay.
2. **Keying deviation.** A non-project-keyed machine section is ratified under
plugin-data-report-keying, with per-domain sections keyed by tree.
3. **The machine-health feed.** The machine-health `config` check is deferred until the profile
exists and runs on an OS whose machine-health checks are implemented.

## Verification record

Expand Down
Loading
Loading