원클릭으로
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.