Skip to content

feat(sweep): add loom:operator-only label + pre-flight skip#3362

Merged
rjwalters merged 1 commit into
mainfrom
feature/issue-3360
May 29, 2026
Merged

feat(sweep): add loom:operator-only label + pre-flight skip#3362
rjwalters merged 1 commit into
mainfrom
feature/issue-3360

Conversation

@rjwalters
Copy link
Copy Markdown
Owner

Summary

  • Adds loom:operator-only label to .github/labels.yml (orange-500, groups with loom:abort).
  • Sweep pre-flight (Wave Lifecycle step 1) now skips operator-only issues with a logged reason; Constraints prose now references the mechanism instead of an unenforced promise.
  • Champion --merge-mode guard added so loom:curated + loom:operator-only issues are never silently auto-promoted into the build queue (the critical safety guard — without it the sweep skip is bypassed under --merge).
  • loom.md labels table documents the new label between loom:blocked and loom:urgent.
  • Defensive operator-only check added to /shepherd Step 3 so direct shepherd invocations exit cleanly instead of stalling.
  • Curator intentionally unchanged — /curator N on an operator-only issue should still enrich the body; the constraint is "no builder claims it", not "no curation happens".

Note: .claude/commands/loom/*.md is hardlinked to defaults/.claude/commands/loom/*.md (same inodes), so a single edit updates both trees. Verified with stat -f "%i %N".

Closes #3360

Test plan

  • /sweep N where #N has loom:operator-only → builder NOT dispatched; log shows skip with reason "operator-only".
  • /sweep N where #N lacks the label → unchanged behavior.
  • /curator N on a loom:operator-only issue still enriches the body (does not skip).
  • Champion in --merge mode does NOT auto-promote loom:curated + loom:operator-only issues.
  • /shepherd N on a loom:operator-only issue exits with the new message instead of writing a spawn signal.
  • After ./scripts/install/sync-labels.sh ., gh label list | grep loom:operator-only returns the new label (deferred to operator; not run as part of this PR).

@rjwalters rjwalters added the loom:review-requested PR ready for Judge to review label May 29, 2026
@rjwalters
Copy link
Copy Markdown
Owner Author

LGTM. Approved.

Verified:

  • .github/labels.yml: New loom:operator-only entry in Status Labels group adjacent to loom:abort (same color F97316), kebab-case naming, description includes Applied by: clause. YAML parses to 26 valid label entries.
  • sweep.md Wave Lifecycle step 1: pre-flight skip correctly placed after loom:blocked with explicit reason logging "operator-only". The pre-flight jq query was updated from statestate,labels to support the new check.
  • sweep.md Constraints: the previously unenforced "Skip operator-only issues" promise now references "see Wave Lifecycle step 1" — promise → mechanism.
  • sweep.md Limitations table: loom:operator-only enforcement marked Implemented (/sweep: add loom:operator-only label so pre-flight can actually skip operator-only issues (constraint exists but is unenforceable) #3360) with accurate scope note covering the Champion --merge guard too.
  • loom.md labels table: loom:operator-only row placed between loom:blocked and loom:urgent per curator's spec, Set by = Human.
  • champion-issue-promo.md (critical guard): loom:operator-only added to "When NOT to Auto-Promote (Even in Force Mode)" — without this, --merge mode would silently auto-promote loom:curated + loom:operator-only issues, completely bypassing the sweep pre-flight skip. Reasoning prose explains why promotion would stall the queue.
  • shepherd.md Step 3: defensive skip added with clean exit message, "regardless of --merge" caveat is correct, jq query updated to fetch labels alongside state.
  • curator.md: unchanged, as the curator notes explicitly directed (/curator N on operator-only issues should still enrich the body).

Scope discipline:

  • Exactly 5 files modified (+27/-4) — matches PR description with no scope creep.
  • No code files touched (no Rust/TS/Python edits); pre-existing local pnpm check:ci clippy failures in loom-daemon/src/init/ are not caused by this PR and the GitHub Rust jobs are appropriately skipped via path filter.
  • No gh label sync invoked from any script — operator gets to choose when to sync to the live repo. PR body explicitly defers that step. Good.
  • Hardlink claim in PR body verified: defaults/.claude/commands/loom/sweep.md and .claude/commands/loom/sweep.md share inode 684242883, so the single edit propagates to both trees.
  • CI status: CLEAN merge state, all required GitHub checks pass (Installer Integration Tests, Detect Changes), Rust jobs correctly skipped.

The critical design insight is preserved: the constraint is "no builder claims it", not "no curation happens". Curator stays enabled, sweep/shepherd/champion-force-mode all skip. The defense-in-depth across three skip points (sweep pre-flight, shepherd direct invocation, champion force-mode promotion) is exactly right.

@rjwalters rjwalters added loom:pr PR approved by Judge, ready for human to merge loom:changes-requested PR requires changes before re-review (Judge requested modifications) and removed loom:review-requested PR ready for Judge to review loom:pr PR approved by Judge, ready for human to merge labels May 29, 2026
The /sweep skill's Constraints section already promised to skip
"operator-only" issues (releases, credential changes, infra
rotations, hardware access) but had no detection mechanism, so the
rule was unenforceable. Anything passed to /sweep would get curated,
promoted to loom:issue, and handed to a builder — wasting a session
on a task that fundamentally requires a human step.

Changes:
- Add loom:operator-only label to .github/labels.yml (orange-500,
  groups with loom:abort as "stop the automation, human needed"
  signals, distinct from red loom:blocked).
- Extend /sweep Wave Lifecycle pre-flight (step 1) to skip issues
  with loom:operator-only, ordered after loom:blocked.
- Update /sweep Constraints line to reference the new mechanism
  instead of an unenforced promise.
- Add a Limitations table row marking the enforcement as Implemented.
- Document loom:operator-only in /loom labels sub-topic.
- Add CRITICAL safety guard to champion-issue-promo "When NOT to
  Auto-Promote" — without it, --merge mode would silently bypass
  sweep's skip by auto-promoting loom:curated operator-only issues
  into the build queue.
- Add a defensive operator-only check to /shepherd Step 3 so direct
  shepherd invocations also exit cleanly instead of stalling.

Curator note (intentional): curator.md is NOT changed. /curator N on
an operator-only issue should still enrich the body — the constraint
is "no builder claims it", not "no curation happens".

The .claude/commands/loom/*.md tree is hardlinked to
defaults/.claude/commands/loom/*.md (same inodes), so a single edit
to defaults/ updates both copies.

Closes #3360

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@rjwalters rjwalters force-pushed the feature/issue-3360 branch from 479c1c9 to bcaba80 Compare May 29, 2026 08:37
@rjwalters rjwalters added loom:review-requested PR ready for Judge to review and removed loom:changes-requested PR requires changes before re-review (Judge requested modifications) labels May 29, 2026
@rjwalters
Copy link
Copy Markdown
Owner Author

Rebased onto main (#3361 merged). Resolved conflicts in sweep.md pre-flight + Limitations table. Both skip checks now compose — operator-only first, then existing-PR probe.

@rjwalters
Copy link
Copy Markdown
Owner Author

Re-approved after rebase. Both skip checks compose correctly.

Verified post-rebase:

@rjwalters rjwalters added loom:pr PR approved by Judge, ready for human to merge and removed loom:review-requested PR ready for Judge to review labels May 29, 2026
@rjwalters rjwalters merged commit 722b7c9 into main May 29, 2026
5 checks passed
@rjwalters rjwalters deleted the feature/issue-3360 branch May 29, 2026 08:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

loom:pr PR approved by Judge, ready for human to merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

/sweep: add loom:operator-only label so pre-flight can actually skip operator-only issues (constraint exists but is unenforceable)

1 participant