Quickstart — Operator Runbook

Mission: investigate-canary-followups-1142-1141-01KS02TV Audience: Operator picking up the two investigations from spec.md / plan.md Time budget: ≤ 1 operator-day if H1 confirms on #1142 and H4/H3 explains #1141

Step 0 — Pre-flight (FR-008)

Verify the repo state matches the handoff snapshot:

cd /Users/robert/spec-kitty-dev/1122-1123-1124-43/spec-kitty   # or wherever your checkout lives

git status                                                      # expect: clean tree
git rev-list --left-right --count main...origin/main            # expect: 0 0  (after our two new commits land on origin, expect this to be 2 0 or 0 0)
git log --oneline -1                                            # expect HEAD to include this mission's spec/plan commits
git branch --list 'kitty/pr/unblock-sync-identity-boundary-canary-01KRZJ07-to-main'   # expect: present
gh pr list --repo Priivacy-ai/spec-kitty --state open --search "1143 OR 1154"          # expect: #1143 and #1154 still open (or document if either merged)

If gh returns "Missing required token scopes":

unset GITHUB_TOKEN && gh auth status   # fall back to keyring token (CLAUDE.md guidance)

Step 1 — #1142 H1 (clean-venv repro, 10–15 min)

# 1. Snapshot the canonical issue body so you can compare hypotheses later
mkdir -p kitty-specs/investigate-canary-followups-1142-1141-01KS02TV/research
gh issue view 1142 --repo Priivacy-ai/spec-kitty --json title,body,labels,state \
  > kitty-specs/investigate-canary-followups-1142-1141-01KS02TV/research/issue-1142-snapshot.json

# 2. Fresh canary venv in a scratch dir
cd /tmp && rm -rf canary-clean && mkdir canary-clean && cd canary-clean
git clone https://github.com/Priivacy-ai/spec-kitty-end-to-end-testing.git
cd spec-kitty-end-to-end-testing
python3 -m venv .venv && source .venv/bin/activate
pip install -e . 2>&1 | tee /tmp/h1-pip-canary.log

# 3. Install spec-kitty from THIS checkout (non-editable, no --force-reinstall)
pip install /Users/robert/spec-kitty-dev/1122-1123-1124-43/spec-kitty 2>&1 | tee /tmp/h1-pip-spec-kitty.log
spec-kitty --version

# 4. Re-run scenarios 1+2 only
pytest tests/identity_boundary/test_scenario_1_*.py tests/identity_boundary/test_scenario_2_*.py \
  -v --capture=no 2>&1 | tee /tmp/h1-run.log

Interpretation:

  • Green twice in a row → H1 confirmed. Move to Step 2 (comment + close + follow-up update).
  • Red → H1 ruled out. Move to Step 3 (#1142 H2 emitter walk).

Step 2 — Post #1142 comment + close (FR-002, FR-003)

Author the comment per contracts/issue-comment-shape.md. Save it to research/comment-1142.md first so you have an audit trail:

# Edit research/comment-1142.md filling in Hypothesis / Commands / Evidence / Conclusion / Fix-pattern
gh issue comment 1142 --repo Priivacy-ai/spec-kitty --body-file kitty-specs/investigate-canary-followups-1142-1141-01KS02TV/research/comment-1142.md

# If H1 CONFIRMED + closing:
gh issue close 1142 --repo Priivacy-ai/spec-kitty --reason completed

Capture the resulting comment URL — it goes in the follow-up row (Step 6).

Step 3 — #1142 H2 (emitter walk, ~30–60 min, only if H1 red)

Open each emitter file and verify every aggregate_type=... call satisfies the WP01 predicate (aggregate_type == "Mission" AND event_type non-empty):

src/specify_cli/status/lifecycle_events.py          (lines 410, 459, 521 already audited in research.md R3)
src/specify_cli/invocation/propagator.py
src/specify_cli/dossier/                            (whole package)
src/specify_cli/next/_internal_runtime/engine.py
src/specify_cli/retrospective/events.py

If any emitter produces a row that does NOT match the predicate, open a 1-WP follow-up mission (don't fix in this mission — C-003). Set follow_up_mission_slug in the outcome record.

If all emitters match, advance to H3 per the issue body.

Step 4 — #1141 hypothesis sweep (H4 → H3 → H2 → H1, in order)

# Snapshot the issue body
gh issue view 1141 --repo Priivacy-ai/spec-kitty --json title,body,labels,state \
  > kitty-specs/investigate-canary-followups-1142-1141-01KS02TV/research/issue-1141-snapshot.json

# Inspect the scenario file end-to-end
cd /tmp/canary-clean/spec-kitty-end-to-end-testing
$EDITOR tests/identity_boundary/test_scenario_4_review_rejection_contract.py

Walk hypotheses cheapest-first:

#CheckWhere
H4Does the fixture actually reach in_review?the fixture function near top of test_scenario_4_review_rejection_contract.py
H3Is the peek-the-queue assertion racing the move-task write?canary line 543
H2Does WPStatusChanged payload shape match current spec-kitty emission?compare against src/specify_cli/status/lifecycle_events.py + src/specify_cli/status/store.py
H1Recent backward-transition emission changes?git log --oneline -- src/specify_cli/status/store.py src/specify_cli/cli/commands/agent/tasks.py

Stop at the first hypothesis that explains the failure.

Step 5 — Post #1141 comment (FR-006)

Same structure as Step 2, but the comment MUST include an ### Recommendation heading with A / B / C per contracts/issue-comment-shape.md. #1141 is NOT closed by this mission unless the recommendation is C and the issue body already shows the small fix landed.

Step 6 — Update mission-exception.md ## Follow-up (FR-007)

Per contracts/follow-up-update-shape.md. The default branch is the focused-PR branch:

# From repo root
git fetch origin
git checkout kitty/pr/unblock-sync-identity-boundary-canary-01KRZJ07-to-main
git pull --ff-only

# Edit kitty-specs/unblock-sync-identity-boundary-canary-01KRZJ07/mission-exception.md
# Update the ## Follow-up section per the contract

git add kitty-specs/unblock-sync-identity-boundary-canary-01KRZJ07/mission-exception.md
git commit -m "$(cat <<'EOF'
Record outcome of #1142 / #1141 follow-up commitments

Investigation: investigate-canary-followups-1142-1141-01KS02TV
Result: <one-line summary>
EOF
)"
git push origin kitty/pr/unblock-sync-identity-boundary-canary-01KRZJ07-to-main

# Return to mission branch
git checkout main

If PR #1143 has merged (branch deleted from origin), use the fallback path:

git checkout main
git pull --ff-only
git checkout -b chore/record-canary-followup-outcome
# Edit the file on main; commit; push; open PR

Step 7 — Window-deadline reporting (NFR-001 / NFR-002)

Even if investigation continues past one hypothesis, you MUST post a substantive comment inside each issue's window:

  • #1142 substantive comment by 2026-05-26 (UTC end-of-day)
  • #1141 substantive comment by 2026-06-02 (UTC end-of-day)

When conclusion == INCONCLUSIVE_IN_WINDOW, use the inconclusive-in-window row shape from contracts/follow-up-update-shape.md.

Step 8 — Done

This mission's acceptance checklist (NFR-001/002/003 + FR-002/003/006/007) is satisfied. Run the standard spec-kitty acceptance flow when ready to move toward merge.