Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
41c0ee8
chore: adopt develop integration branch with release-time version bum…
vircung Jul 24, 2026
a583d55
docs(working-process): spec, plan, and glossary for review-contract s…
vircung Jul 25, 2026
3a10027
feat(working-process): declared-instruction signal with materializati…
vircung Jul 25, 2026
74d6d2a
feat(working-process): finding unit, citation rules, and background d…
vircung Jul 25, 2026
a7c1c90
feat(python-standards): plugin-level rule-none, justify clause, and f…
vircung Jul 25, 2026
bd350ca
feat(python-standards): python-review dispatches the reviewer in the …
vircung Jul 25, 2026
8b02438
feat(salesforce-standards): plugin-level rule-none, justify clause, a…
vircung Jul 25, 2026
64d9943
feat(salesforce-standards): salesforce-review dispatches the reviewer…
vircung Jul 25, 2026
123b675
feat(project-memory): declared-instruction signal in the docs/memory …
vircung Jul 25, 2026
bc19051
chore: mint -dev.10 prerelease versions for contract-sharpening dogfo…
vircung Jul 25, 2026
8f41c7d
docs: align contract-probe and candidate-gap terms and ownership exce…
vircung Jul 25, 2026
e2d1da8
fix(standards): harden review skills and commands after dogfooding ga…
vircung Jul 27, 2026
bdc8838
fix(standards): close the rerun loophole of inheriting a prior report…
vircung Jul 27, 2026
19d2e0e
docs: record dogfooding gate rounds 2-3 and PASSED verdict in the plan
vircung Jul 27, 2026
3b14252
docs: mark contract-sharpening spec and plan as implemented
vircung Jul 27, 2026
99adc88
docs: mark contract-sharpening plan as implemented
vircung Jul 27, 2026
b4d13d9
chore: enable elements-of-style plugin from superpowers-marketplace
vircung Aug 4, 2026
f4e884f
docs: add design-personas spec, plan, glossary entries, and persona-i…
vircung Jul 30, 2026
f688207
feat(working-process): add shared persona file with consultation cont…
vircung Jul 30, 2026
fe84d30
docs(rules): widen the non-English trigger-phrase exception to agent …
vircung Jul 30, 2026
42ea383
feat(working-process): add architect-consult and system-designer-cons…
vircung Jul 30, 2026
cfc2d19
feat(working-process): add system-designer-session skill
vircung Jul 30, 2026
21d3585
feat(working-process): tighten architect surfaces for consultation ar…
vircung Jul 30, 2026
c576dc1
feat(working-process): source plan-adversary standing duties from the…
vircung Jul 30, 2026
2ff3c2f
feat(working-process): add consultation consent offer to the workflow…
vircung Jul 30, 2026
81ecb22
docs(rules): add *-consult naming category and widen the dev prerelea…
vircung Jul 31, 2026
772b0e3
feat(working-process): sync plugin identity and set dogfooding versio…
vircung Jul 31, 2026
b6953b3
style(working-process): fix list punctuation and rewrap persona prose
vircung Jul 31, 2026
5b5d0f3
fix(working-process): resolve domain artifacts from the repo root acr…
vircung Aug 4, 2026
745d0e1
fix(working-process): re-ask consultation consent when compaction obs…
vircung Aug 4, 2026
26a61be
docs: record the repo-root resolution amendment in the design-persona…
vircung Aug 4, 2026
ecee60f
chore(working-process): bump dogfooding discriminator after post-cons…
vircung Aug 4, 2026
6657da2
refactor(working-process): trim consult descriptions and move dispatc…
vircung Aug 4, 2026
8f33d3e
docs: record the dispatcher-duties amendment and bump the dogfooding …
vircung Aug 4, 2026
667d6f6
refactor(working-process): drop Polish trigger phrases across all sur…
vircung Aug 4, 2026
c7cb020
docs(rules): repoint the non-English trigger precedent at project-memory
vircung Aug 4, 2026
aabc503
docs: record the English-only trigger amendment and bump the dogfoodi…
vircung Aug 4, 2026
92315b4
chore: drop the skill-creator plugin from project settings
vircung Aug 5, 2026
dfe69a8
docs: mark the design-personas spec and plan implemented
vircung Aug 5, 2026
66a319a
chore: mint release versions - working-process 0.12.0, standards 0.3.…
vircung Aug 5, 2026
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
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
{
"name": "working-process",
"source": "./plugins/working-process",
"description": "Spec-driven working process on top of superpowers: grilling-session, architect-session and sync-rules skills, architect and plan-adversary review agents, plus distributed process rules"
"description": "Spec-driven working process on top of superpowers: grilling-session, architect-session, system-designer-session and sync-rules skills, architect and plan-adversary review agents, architect-consult and system-designer-consult consultation agents, plus distributed process rules"
},
{
"name": "python-standards",
Expand Down
4 changes: 3 additions & 1 deletion .claude/rules/plugin-authoring.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ paths:
`claude plugin validate plugins/<name>` must both pass.
- Names are kebab-case. Skills whose content is an open-ended
conversation are named `*-session`; formal reviews that end in a verdict
are agents. Operational skills may prompt for decisions without being
are agents; verdict-free consultation agents — one briefing in, one
contribution out, from a fresh isolated context — are named `*-consult`.
Operational skills may prompt for decisions without being
sessions — they are named for what they do (e.g. `sync-rules`).
- Author skills with the `skill-creator` skill when it is available —
scaffolding, `description:` tuning, and evals; it complements
Expand Down
42 changes: 36 additions & 6 deletions .claude/rules/plugin-versioning.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,47 @@ paths:

- Every plugin follows semver in its `.claude-plugin/plugin.json`
`version` field.
- A commit/PR that changes ANY file under `plugins/<name>/` bumps that
plugin's version IN THE SAME commit/PR. The `version` field is the
update-delivery mechanism, not hygiene: pushing new commits without
changing that string delivers nothing to existing users.
- `develop` is the integration branch: topic branches merge into it
WITHOUT version bumps — unfinished plugin updates accumulate there
unreleased. `master` holds released state only; the marketplace
serves it.
- The bump happens exactly once, in the release PR from `develop` to
`master`: one commit bumps every plugin changed since the last
release, sized by the total accumulated change per plugin. The
`version` field is the update-delivery mechanism, not hygiene:
merging to master without changing that string delivers nothing to
existing users, so a release PR with no bumps for its changed
plugins is invalid.
- Dogfooding unreleased content needs a changed version string — the
plugin cache keys content by version. A topic branch that dogfoods a
plugin sets `X.Y.Z-dev.<discriminator>` on it — the issue number the
branch name carries, or the branch short-name when the topic has no
issue (e.g. `-dev.design-personas`). Widening the discriminator
instead of minting another channel keeps one channel for one purpose;
the discriminator only needs to be unique among parallel topics. The
suffix flows into develop as-is. A topic that
does not dogfood never touches the version. On a version-line merge
conflict between parallel topics, the merging topic's own
`-dev.<discriminator>` wins — both strings are provisional. The release PR
strips every `-dev` suffix while minting the final numbers; the
`release-guard` workflow fails any PR to master that carries a
prerelease version or a changed plugin without a bump.
- Prerelease grammar: `-<channel>.<discriminator>`. Defined channels:
`dev.<discriminator>` (topic-branch dogfooding, above) and `rc.<n>` (release
candidate — a freeze of develop dogfooded as one bundle when a
release warrants whole-unit validation; minted by a release-prep
commit and stripped by the release PR like any prerelease). Future
channels extend this list by editing this rule only — the
release-guard workflow rejects every prerelease on master
(`*-*`), so new channels never need a CI change.
- **patch** — wording or docs fixes, no behavior change;
- **minor** — a new component or section, backward-compatible behavior
additions;
- **major** — rename or removal of a component, or a breaking change to
a convention others rely on (the frontmatter process fields, the
`*-plan-review` discovery convention, the plugin-root persona path —
`ARCHITECT_PERSONA.md`).
`*-plan-review` discovery convention, the plugin-root persona paths —
`ARCHITECT_PERSONA.md`, `SYSTEM_DESIGNER_PERSONA.md`,
`PERSONA_COMMON.md`).
- Before 1.0.0, breaking changes ride a **minor** bump (semver's 0.x
rule); major is reserved for the promotion to 1.0.0 and for breaking
changes after it.
Expand Down
11 changes: 6 additions & 5 deletions .claude/rules/repo-hygiene.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ docs, README — and in commit messages:
placeholders;
- no company or client names;
- all committed text is in English. One narrow exception: quoted example
trigger phrases inside a skill's `description:`, and the `query` values of
its trigger-eval files (`evals/trigger-evals.json`), may be non-English —
both mirror how a developer actually asks, and the evals exercise exactly
those phrases (precedent: grilling-session's "przemagluj"). The
surrounding prose stays English.
trigger phrases inside a component's `description:` (skill or agent),
the README trigger lines that mirror them, and the `query` values of
trigger-eval files (`evals/trigger-evals.json`), may be non-English —
all mirror how a developer actually asks, and the evals exercise
exactly those phrases (precedent: project-memory's "przejrzyjmy
memory"). The surrounding prose stays English.
8 changes: 7 additions & 1 deletion .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,20 @@
},
"enabledPlugins": {
"superpowers@claude-plugins-official": true,
"skill-creator@claude-plugins-official": true
"elements-of-style@superpowers-marketplace": true
},
"extraKnownMarketplaces": {
"claude-plugins-official": {
"source": {
"source": "github",
"repo": "anthropics/claude-plugins-official"
}
},
"superpowers-marketplace": {
"source": {
"source": "github",
"repo": "obra/superpowers-marketplace"
}
}
}
}
49 changes: 49 additions & 0 deletions .github/workflows/release-guard.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Release guard — runs on PRs targeting master (release PRs from develop).
# Enforces the plugin-versioning rule's release-time invariants:
# 1. no prerelease (-dev.*) version string reaches master;
# 2. every plugin changed since master carries a version bump.
name: release-guard

on:
pull_request:
branches: [master]

jobs:
release-guard:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: No prerelease versions reach master
run: |
fail=0
for m in plugins/*/.claude-plugin/plugin.json; do
v=$(jq -r .version "$m")
case "$v" in
*-*)
echo "::error file=$m::prerelease version '$v' must not reach master — strip the -dev suffix and size the final bump"
fail=1
;;
esac
done
exit $fail

- name: Changed plugins carry a bump
run: |
base="origin/${{ github.base_ref }}"
fail=0
for d in plugins/*/; do
name=$(basename "$d")
manifest="${d}.claude-plugin/plugin.json"
if ! git diff --quiet "$base"...HEAD -- "$d"; then
base_v=$(git show "$base:$manifest" 2>/dev/null | jq -r .version || echo "<absent>")
head_v=$(jq -r .version "$manifest")
if [ "$base_v" = "$head_v" ]; then
echo "::error file=$manifest::plugin '$name' changed since master but version stayed '$head_v' — the release PR must bump it"
fail=1
fi
fi
done
exit $fail
9 changes: 6 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,12 @@ override defaults; follow them.
## Worktrees and topic branches

Feature work happens on a topic branch named `feature/<issue>-<short-name>`
(e.g. `feature/6-salesforce-standards`), branched off `master`. When an
isolated workspace is used, its git worktree lives at
`.claude/worktrees/<short-name>/` — one per topic branch, git-ignored.
(e.g. `feature/6-salesforce-standards`), branched off `develop` — the
integration branch topic PRs target. `master` holds released state
only; releases are PRs from `develop` to `master`, where version bumps
happen (see the plugin-versioning rule). When an isolated workspace is
used, its git worktree lives at `.claude/worktrees/<short-name>/` —
one per topic branch, git-ignored.

## Authoring skills

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Marketplace of [Claude Code](https://code.claude.com) plugins by Missing Bits.

| Plugin | Description |
|--------|-------------|
| `working-process` | Spec-driven working process: grilling-session, architect-session and sync-rules skills, architect and plan-adversary review agents, distributed process rules |
| `working-process` | Spec-driven working process: grilling-session, architect-session, system-designer-session and sync-rules skills, architect and plan-adversary review agents, two verdict-free consultation agents, distributed process rules |
| `python-standards` | Python coding standards for uv + ruff + pytest + pyright: area skills, code-review stack, plan-review checklist, distributed toolchain rule |
| `salesforce-standards` | Salesforce coding standards for the sf CLI toolchain: area skills (Apex, LWC, Flow, data/security model, legacy UI), code-review stack, plan-review checklist, distributed toolchain rule |
| `project-memory` | In-repo project memory: committed Team memory (`docs/memory/`) and per-user Private memory (`.claude/memory/`), with `memory-review-session` and `migrate-memory` skills, distributed as a Rules payload |
Expand Down
16 changes: 16 additions & 0 deletions docs/domain/adr/0001-persona-independence.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
ticket: none
---

# Personas never consult each other

The working process fields two design personas — architect and system
designer, split by dimension rather than by stance — and a developer
dispatches them to get two independent readings of one subject. Both
consult agents therefore ship with `SendMessage` removed via
`disallowedTools`, plus a standing instruction never to spawn another
persona: two personas that reconcile before answering hand back one
opinion where the developer asked for two, and the reconciling happens
where nobody can inspect it. The main thread is left as the only place
the two readings meet, which is also the only place the developer can
weigh them against each other.
84 changes: 76 additions & 8 deletions docs/domain/glossary.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,14 @@ _Avoid_: artifact folder

**First-create question**:
The question — ignored mode or tracked mode — asked when a process
directory is created for the first time, or exists with no observable
prior decision (neither a `.gitignore` containing exactly `*` nor a
git-tracked file). Never asked when either signal is present.
directory is created for the first time, or exists with no prior
decision: neither an observable signal (a `.gitignore` containing
exactly `*`, a git-tracked file) nor an explicit project instruction
declaring the mode (e.g. a CLAUDE.md note). Never asked when any of
these signals is present. A declared ignored mode is materialized by
whoever first acts on it — writing the `*` `.gitignore` — making the
decision observable; a declared tracked mode becomes observable with
the first committed file.
_Avoid_: self-ignore

**Ignored mode**:
Expand All @@ -32,7 +37,8 @@ A process directory whose files are committed; detected by any git-tracked
file under it.

**Contract probe**:
The ordered path check a domain review skill runs to find the installed
The ordered path check a domain review skill — or a dispatching
review command, pre-dispatch — runs to find the installed
report contract: `<project>/.claude/rules/working-process/review-reports.md`,
then `$HOME/.claude/rules/working-process/review-reports.md` — first hit
wins, mirroring the Rules engine's project-over-user conflict rule. Part
Expand All @@ -47,6 +53,21 @@ contract; a domain plugin's inline fallback is a strict subset of it,
never a different shape.
_Avoid_: review output, report file

**Finding**:
One graded problem a review round reports, cited with evidence — in a
design review (`architect`, `plan-adversary`) that is all it is. In a
Review report it additionally takes the counted shape the review-reports
contract defines: one violation class in one file, or at project level
when no existing file carries the violation — for tagged rules the rule
id names the class; for a Candidate gap the class is the one its offer
names. Its body enumerates every violating site — line numbers, or the
domain's stable key where lines do not apply. Cites exactly one rule id
(or `rule: none`); its severity is the cited rule's (a Candidate gap's
comes from the Authoring rubric). A finding with any site unfixed counts
as remaining in a rerun. Never what a Consultation returns — that is a
Contribution.
_Avoid_: issue, violation (as a name for the unit)

**Standards plugin**:
A domain plugin of this marketplace encoding coding standards for one
technology: area skills, a review stack that writes Review reports,
Expand Down Expand Up @@ -130,10 +151,15 @@ _Avoid_: severity definitions, step-3 definition

**Candidate gap**:
A review finding that violates no defined rule: reported and counted
normally, cited `rule: none`, graded by the Authoring rubric, and
surfaced in the run's reply as a candidate for a new rule — with offers
to park it in Project memory (when a store exists) or report it
upstream, generalized. Never cited with an invented rule id.
normally, cited `rule: none` (against the loaded domain skill lacking
the rule, or the standards plugin itself when no skill of the plugin
covers the concern — never asserted against a skill the run did not
read), graded by the Authoring rubric, and surfaced in the run's
reply as a candidate for a new rule — or, at a plugin-level citation, a
new skill — with offers to park it in Project memory (when a store
exists) or report it upstream, generalized. Never cited with an
invented rule id; the `rule: none` citation is the report's only
candidate-gap marker.
_Avoid_: uncited observation, unmatched finding

**Sub-rule**:
Expand Down Expand Up @@ -198,6 +224,48 @@ implementation for a plan. Where re-review offers on fallback-recorded
verdicts fire.
_Avoid_: usage point

**Persona**:
A role plus its duties, single-sourced in one `*_PERSONA.md` file at the
working-process plugin root and adopted by one or more persona surfaces;
two exist — architect and system designer — their shared duties and mutual
boundary held once in `PERSONA_COMMON.md`. `plan-adversary` carries its
role inline and is a reviewer, not a persona; the org user roles the
salesforce-security-model skill calls personas are a different domain
entirely.
_Avoid_: role, hat

**Persona surface**:
A component that adopts a persona and puts it to work: a verdict-bearing
agent (`architect`), a consult agent (`*-consult`), or a session skill
(`*-session`) — the architect has three, the system designer two. Short
form "surface" inside working-process material; unqualified "surface" in
the repo's own rules means something else, a document location where a
statement lives.
_Avoid_: mode, channel, entrypoint

**Session skill**:
A skill whose content is an open-ended conversation, named `*-session` —
`architect-session`, `grilling-session`, `memory-review-session` among
them. Some are persona surfaces, some adopt no persona at all
(`grilling-session`). Unqualified "session" always means the Claude Code
conversation instead: what a session-scoped consent decision lasts for,
and what a consult agent is isolated from.
_Avoid_: session (for the skill), conversational skill

**Consultation**:
A verdict-free exchange with a persona, returning a contribution and
stamping nothing. Verdict absence is the discriminator, not the absence of
stamping — an `architect` dispatch on a bare question also stamps nothing
(no document to stamp) yet still grades, so it stays a review round.
_Avoid_: informal review, advisory review

**Contribution**:
What a consultation returns: reasoning, options, and the questions the
persona would need answered next, relayed to the developer attributed and
substantially verbatim. Never graded and never counted — the graded,
counted unit is a Finding, which belongs to verdict-bearing reviews.
_Avoid_: consultation finding, recommendation

**Project memory**:
The in-repo, rule-loaded memory store the project-memory plugin defines, in
two parts — Team memory and Private memory — mirroring Home-dir memory's
Expand Down
Loading
Loading