ワンクリックで
cassandra
Pre-mortem a dependency-bump set before merging — predict what breaks, prove how, and record the prophecy for later calibration
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Pre-mortem a dependency-bump set before merging — predict what breaks, prove how, and record the prophecy for later calibration
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Start work in an ISOLATED git worktree (the exception path — use only when two envs must be live at once, the work is multi-day and main must stay shippable meanwhile, or it's a throwaway spike). Creates the branch + worktree + venv + frontend build + smoke test + BRANCHES.md entry. For ordinary work, use /new-feature (trunk) instead. Any Kind — captured in Step 3.5. The `--from-cloud` flag instead ADOPTS an existing `origin/claude/*` cloud branch (built on phone/cloud, never compiled): fetch → build the Mac env → run the tests the cloud couldn't → preview the merge against main.
End-of-session ritual — verify, document for humans and robots, commit, close out
Ship a release — bump version, finalise changelog/readme, tag, push, and verify PyPI. The ONLY workflow command that touches public distribution (PyPI, Homebrew, the public changelog, the tag). Evening window on weekdays. Supports --dry-run.
Finish a piece of trunk work on main — runs tests + lint, surfaces human-QA checks, trues docs, adds a changelog line, marks the 100days item done, and commits. No merge (you're already on main). If you're on a branch, it offers to close the branch properly instead.
Archive a merged feature branch — stale marker, detach worktree, update BRANCHES.md (preserves local directory)
Start a piece of work on main (trunk — the DEFAULT path). Loads the plan / 100days item, checks recent history, agrees a plan, and records the task. No branch, no worktree, no env setup. For work that needs an isolated live environment, use /new-branch instead.
| name | cassandra |
| description | Pre-mortem a dependency-bump set before merging — predict what breaks, prove how, and record the prophecy for later calibration |
| user-invocable | true |
| allowed-tools | Bash, Read, Glob, Grep, Agent, WebSearch, WebFetch, Write, Edit |
Run a dependency-bump pre-mortem: before applying a batch of
Dependabot PRs or a quarterly dependency wave, predict the blast radius
of each bump, write the prophecy to the calibration ledger, and present
a ranked report the user triages. Later, after the bumps are applied,
re-run in --score mode to record what actually happened and tune the
oracle.
This skill is the calling mechanism for the cassandra agent. The
agent holds the method and the coupling map; the skill gathers the
candidate set, runs the agent, and owns the ledger.
docs/design-platform-policy.md)
is firing.--score: a previously-prophesied bump set has been applied; record
outcomes and score the prediction.--watch: re-examine the Held register — re-evaluate each held bump's
release-predicate against fresh ecosystem metadata, and surface any
coupling cluster that has become safe to take "as a wave."This is a local, on-demand skill, not a CI bot. The trigger is a
human (or Claude) at review time — deliberately, to keep this a
bandwidth-reducing one-shot, not an ambient signal stream on every PR.
See docs/design-dependency-premortem.md § Why a skill, not a CI bot.
If the user named a specific set ("bump anthropic and openai"), use that. Otherwise discover it:
# Python — outdated + the open Dependabot PRs
.venv/bin/pip list --outdated 2>/dev/null
gh pr list --label dependencies --state open --json number,title 2>/dev/null
# Frontend + e2e
( cd frontend && npm outdated ) 2>/dev/null
( cd e2e && npm outdated ) 2>/dev/null
outdated is reconnaissance, not the candidate set — it over-reports
(headline gaps ignore pins). Note that the agent will re-ground against
installed metadata; don't pre-filter here, just collect.
Guard: an empty result is a tool failure, not an all-clear. Every command above ends in
2>/dev/null, so a wrong venv path (.venv/bin/pipdoesn't exist in this worktree — common; some worktrees and cloud envs have no.venv), an unauthenticatedgh, or annpmerror each yields silent emptiness that looks identical to "nothing to bump." Before running Cassandra, confirm the tools actually ran: check.venv/bin/pipexists (else find the right interpreter),gh auth statusis clean, and at least one source returned rows. If discovery comes back wholly empty, stop and report "couldn't enumerate candidates" — do not hand Cassandra an empty set and present her clean report as an all-clear. A pre-mortem over nothing is the silent failure this whole subsystem exists to prevent.
Read before prophesying so the agent is calibrated:
docs/design-platform-policy.md — the pinning register (what's held,
why, re-check dates)..github/dependabot.yml — the ignore rules.docs/dependency-premortem-log.md — the prophecy ledger (past
predictions + outcomes). If absent, this is the first prophecy; note
it.Spawn the cassandra agent via Agent with subagent_type: "cassandra".
Pass it: the candidate set, the venv path, and the three files from
Step 2 (or their salient contents).
For a large batch (≥ ~6 risky bumps), have Cassandra fan the gossip
research out across parallel sub-agents by cluster (spaCy ecosystem,
numpy ABI, LLM SDKs, web stack, HF stack, Node-gated tooling) — one
general-purpose agent per cluster, launched in a single message — then
synthesise. This is the pattern that produced the inaugural ledger
entry; it keeps each research thread focused and the main context clean.
Before showing the report, append a new entry to
docs/dependency-premortem-log.md (create it from the schema below if
absent). The entry captures every verdict with its receipt and an
OUTCOME: open block to be filled in --score mode. Number entries
sequentially; never renumber.
Show Cassandra's report: the blast-radius ranking table, the guaranteed breakages first, the non-events, the safe wave, and the recommendations. End with the triage prompt — the user decides what to merge, group, ignore, or hold. Apply any dependabot.yml / register changes the user approves in the same turn.
/cassandra --score [entry N])A previously-prophesied bump set has been applied (merged, or applied locally and tested). Close the loop:
git log, the lockfile diff, the merged PR.)gh run list, the PR checks.)untested is the default;
a verdict only earns hit/miss/false-alarm once you can point to
what actually happened (a CI run, a lockfile diff showing the bump
landed, a passing/failing test, the user's report). A SAFE prophecy
that was never applied is untested, never a free hit — letting
untested decay into hit silently inflates the tally and corrupts the
one number the whole ledger exists to keep honest. ❔ UNKNOWN verdicts
are unscoreable by construction (there was no prediction to test) —
record them untested until the bump is actually attempted.untested..claude/agents/cassandra.md or the
coupling catalog in docs/design-dependency-premortem.md.The score pass is where the curse lifts: accuracy accrues in public, and the agent's own past errors become its next prophecy's calibration.
/cassandra --watch)Re-examine the Held register — the standing list of bumps held with a reason and a release-predicate (see schema below). This is what turns an ignore from a tombstone into a deferred obligation: instead of pinning to an old version forever, each hold is re-evaluated against the evolving ecosystem until the day a coupling cluster becomes safe to take as a wave.
docs/dependency-premortem-log.md.https://api.deps.dev/v3/...) — GetVersion for
publishedAt / deprecation / OpenSSF scorecard, GetRequirements
for the unresolved upstream caps (has the spaCy pins thinc<8.4
edge floated yet?). Plain JSON, WebFetch-able.https://api.osv.dev/v1/query) — advisories that force or
forbid a move.en_core_web_lg hasn't
re-published"), or ready — move as a wave (met for every cluster
member).On-demand only. The watch pass is run when the human sits down to clear
deps, never on a cron — an ambient drift-checker would add to the signal
stream the maintainer must process, which is exactly the bandwidth cost
this subsystem is shaped to avoid (docs/design-dependency-premortem.md
§ Why a skill, not a CI bot).
docs/dependency-premortem-log.md:
# Dependency pre-mortem ledger
Cassandra's prophecies and their outcomes. One entry per pre-mortem pass.
Append-only; never renumber. The running tally lets us see, over time,
how well the oracle calls it.
**Tally:** <N> prophecies scored — <M> hits, <K> misses, <J> false-alarms.
## Held register
<!-- The standing watch list. Each held bump is a (reason, release-predicate)
obligation, re-examined by /cassandra --watch — never a bare pin. -->
| Held bump | Cluster | Reason (blocks now) | Release-predicate (lifts it) | Last watched | Status |
|-----------|---------|---------------------|------------------------------|--------------|--------|
| … | … | … | … | <date> | held / wave-forming / ready |
---
## Entry <N> — <date> — <candidate set / version line>
- **Grounded against:** <venv> installed metadata + register + ignore list
- **Prior calibration applied:** <which past lessons fed this prophecy>
### Prophecy
| Bump (from→to) | Verdict | Surface | Receipt |
|----------------|---------|---------|---------|
| … | 🔴/🟡/🟢/❔/⚠️ | resolver/runtime/— | <pin / issue / changelog> |
<!-- Verdict legend: 🔴 WILL-BREAK · 🟡 RESOLVER-NON-EVENT · 🟢 SAFE ·
❔ UNKNOWN (couldn't look — not a soft SAFE) · ⚠️ LATENT (orthogonal). -->
### OUTCOME — open
<!-- filled in by /cassandra --score after the bumps are applied -->
### SCORE — pending
<!-- hit / miss / false-alarm / untested per verdict, with evidence and the
lesson. untested is the default; a hit costs proof (CI run, lockfile
diff, test result). A SAFE never applied is untested, never a hit. -->
outdated; the
agent re-grounds against installed metadata. Never present the
outdated table as the prophecy.--score observes the result.
Write/Edit are in allowed-tools for one purpose only — writing
the ledger (docs/dependency-premortem-log.md). Never edit
dependabot.yml, pyproject.toml, a lockfile, or any dependency file;
proposing those edits is the report's job, applying them is the human's.PackageNotFoundError), or failed gossip is ❔ UNKNOWN — never folded
into the greens. The skill's Step 1 guard enforces this at the input
boundary; the agent enforces it per-verdict.(reason, release-predicate, cluster)
row in the Held register, not a bare pin. --watch is what later
collects on that obligation.docs/ so contributors can see the calibration. Nothing
sensitive goes in it.