Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
bump: patch
---

### Changed

- The babysit merge gate and post-merge check read the work-item tracker binding through one reader, `babysit_tracker_binding.py`: the `tracker` mapping of `docs/conventions/work-items.yaml` (on the default branch, or at the base branch for the admission label), else the legacy root JSON binding when that file is absent or sets no `tracker` key. The human-gated, standards-sync and admission role labels come from it, and the skip-unchanged key covers the YAML file too.
1 change: 1 addition & 0 deletions .github/scripts/pr-merge/merge-holds.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,7 @@ export const HOLD_PATH_CLASSES = Object.freeze([
["plugins/source-control/skills/babysit-prs/scripts/babysit_review_trigger.py", "enforcement"],
["plugins/source-control/skills/babysit-prs/scripts/babysit_run_cache.py", "enforcement"],
["plugins/source-control/skills/babysit-prs/scripts/babysit_state.py", "enforcement"],
["plugins/source-control/skills/babysit-prs/scripts/babysit_tracker_binding.py", "enforcement"],
["plugins/source-control/skills/babysit-prs/scripts/babysit_util.py", "enforcement"],
["plugins/source-control/skills/babysit-prs/scripts/babysit_verify_evidence.py", "enforcement"],
["plugins/source-control/skills/babysit-prs/scripts/babysit_whole_review.py", "enforcement"],
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pr-require-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6717,7 +6717,7 @@ jobs:
held_paths() {
# The trust-gate paths, as bash patterns (`*` crosses `/`).
# BEGIN hold-floor hold_patterns: generated by scripts/sync-hold-floor.py
hold_patterns=('.github/standards/trusted-actors/*' 'CODEOWNERS' '*/CODEOWNERS' 'docs/conventions/pr-pipeline.yaml' '.gitmodules' '*/.gitmodules' 'plugins/source-control/skills/babysit-prs/scripts/babysit_risk.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_check_inputs.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_checks.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_classify.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_dependabot.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_feedback.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_gh.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_merge.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_merge_policy.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_postmerge.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_repo_config.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_review_evidence.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_review_trigger.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_run_cache.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_state.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_util.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_verify_evidence.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_whole_review.py' '.claude/*' '*/.claude/*' '.claude-lane/*' '*/.claude-lane/*' '.mcp.json' '*/.mcp.json' 'CLAUDE.md' '*/CLAUDE.md' 'CLAUDE.local.md' '*/CLAUDE.local.md' 'AGENTS.md' '*/AGENTS.md' 'REVIEW.md' '.github/actions/check-trusted-trigger/*' '.github/actions/resolve-config/*' '.github/actions/check-kill-switch/*' '.github/actions/request-lane-token/*' '.github/actions/log-api-budget/rate-guard.mjs' '.github/actions/log-api-budget/rate-limits.json' '.github/scripts/pr-merge/merge-holds.mjs' '.github/scripts/pr-merge/enable-auto-merge.mjs' '.github/scripts/pr-merge/superseded.mjs' '.github/scripts/pr-merge/clear-escalations.mjs' '.github/scripts/pr-merge/carry-run-cache.mjs' '.github/scripts/pr-merge/gate-check.mjs' '.github/scripts/pr-merge/head-ref-map.mjs' '.github/scripts/pr-merge/lane-records.mjs' '.github/scripts/pr-merge/last-report.mjs' '.github/scripts/pr-merge/rate-stop.bash' '.github/scripts/pr-merge/retry-call.bash' '.github/scripts/pr-merge/refire-refused.mjs' '.github/scripts/pr-merge/rotation.mjs' '.github/scripts/pr-merge/sweep-summary.mjs' '.github/scripts/pr-merge/who.mjs' '.github/scripts/pr-merge/post-unarmed-status.mjs' '.github/scripts/pr-merge/verify-answers.mjs' '.github/scripts/pr-merge/listing-carry.mjs' '.github/actions/report-check-run/posting-run.mjs' 'scripts/sync-hold-floor.py' '.github/scripts/pr-unblock/address-feedback.mjs' '.github/scripts/pr-unblock/escalation-routes.mjs' '.github/scripts/pr-unblock/escalation-routes.json' '.github/scripts/pr-unblock/gate-source.mjs' '.github/scripts/pr-unblock/thread-scope.mjs' '.github/scripts/pr-unblock/retry-fetch.mjs' '.github/scripts/work-resolve-issue/report-outcome.mjs' '.github/scripts/work-resolve-issue/limits.mjs' '.github/scripts/work-resolve-issue/retry-fetch.mjs' '.github/scripts/pr-unblock/report-escalation.sh' '.github/scripts/pr-unblock/adjudicate-feedback.mjs' '.github/scripts/pr-unblock/publish-feedback.mjs' '.github/scripts/pr-unblock/request-budget.mjs' '.github/scripts/pr-verify/resolve-pr.mjs' '.github/scripts/pr-verify/write-verdict.mjs' '.github/scripts/intake-triage/admit.mjs' '.github/actions/select-trusted-text/select-trusted-text.mjs' 'lib/publish-gate.mjs' '.github/recurring-schedule.json' 'plugins/work-items/scripts/charge-words.json' '.github/scripts/pr-unblock/dependency-classify.mjs' '.github/scripts/apply-patch/apply-patch.mjs' '.github/scripts/apply-patch/predicates.mjs' '.github/scripts/apply-patch/protected-paths.mjs' '.github/scripts/apply-patch/retry-fetch.mjs' '.github/scripts/pr-unblock/fix-ci-context.mjs' '.github/scripts/pr-unblock/feedback-dispatch.mjs' '.github/scripts/pr-unblock/verify-notes.mjs' '.github/scripts/pr-unblock/limit-stop.mjs' '.github/scripts/pr-unblock/dispatch-record.mjs' '.github/scripts/pr-unblock/verify-cap.mjs' '.github/scripts/maintenance-reconcile-lost-runs/infra-failure.mjs' '.github/scripts/work-resolve-issue/stop-routes.json' '.github/scripts/work-resolve-issue/stop-routes.mjs' '.github/scripts/lib/stop-reason.mjs' '.github/scripts/lib/admission-comment.mjs' '.github/scripts/lib/done-evidence.mjs' '.github/scripts/pr-review-main/*' 'docs/conventions/instruction-exception-register/*' 'docs/conventions/untrusted-content/*' 'docs/standards/*' '.github/workflows/dependabot-fragments.yml' '.github/workflows/eval-browser-dispatch.yml' '.github/workflows/intake-reenter.yml' '.github/workflows/intake-triage.yml' '.github/workflows/maintenance-audit-lane-runs.yml' '.github/workflows/maintenance-reconcile-lost-runs.yml' '.github/workflows/post-merge-demotion-alert.yml' '.github/workflows/post-merge-test-mutation.yml' '.github/workflows/pr-feedback-dispatch.yml' '.github/workflows/pr-merge.yml' '.github/workflows/pr-refine.yml' '.github/workflows/pr-require-checks.yml' '.github/workflows/pr-review-approved.yml' '.github/workflows/pr-review-hosted.yml' '.github/workflows/pr-review-main.yml' '.github/workflows/pr-review-security-hosted.yml' '.github/workflows/pr-run-activity-read.yml' '.github/workflows/pr-run-activity-write.yml' '.github/workflows/pr-unblock-dispatch.yml' '.github/workflows/pr-unblock.yml' '.github/workflows/pr-verify.yml' '.github/workflows/release-publish-plugins.yml' '.github/workflows/work-resolve-issue.yml' '.github/workflows/work-unblock.yml')
hold_patterns=('.github/standards/trusted-actors/*' 'CODEOWNERS' '*/CODEOWNERS' 'docs/conventions/pr-pipeline.yaml' '.gitmodules' '*/.gitmodules' 'plugins/source-control/skills/babysit-prs/scripts/babysit_risk.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_check_inputs.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_checks.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_classify.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_dependabot.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_feedback.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_gh.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_merge.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_merge_policy.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_postmerge.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_repo_config.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_review_evidence.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_review_trigger.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_run_cache.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_state.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_tracker_binding.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_util.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_verify_evidence.py' 'plugins/source-control/skills/babysit-prs/scripts/babysit_whole_review.py' '.claude/*' '*/.claude/*' '.claude-lane/*' '*/.claude-lane/*' '.mcp.json' '*/.mcp.json' 'CLAUDE.md' '*/CLAUDE.md' 'CLAUDE.local.md' '*/CLAUDE.local.md' 'AGENTS.md' '*/AGENTS.md' 'REVIEW.md' '.github/actions/check-trusted-trigger/*' '.github/actions/resolve-config/*' '.github/actions/check-kill-switch/*' '.github/actions/request-lane-token/*' '.github/actions/log-api-budget/rate-guard.mjs' '.github/actions/log-api-budget/rate-limits.json' '.github/scripts/pr-merge/merge-holds.mjs' '.github/scripts/pr-merge/enable-auto-merge.mjs' '.github/scripts/pr-merge/superseded.mjs' '.github/scripts/pr-merge/clear-escalations.mjs' '.github/scripts/pr-merge/carry-run-cache.mjs' '.github/scripts/pr-merge/gate-check.mjs' '.github/scripts/pr-merge/head-ref-map.mjs' '.github/scripts/pr-merge/lane-records.mjs' '.github/scripts/pr-merge/last-report.mjs' '.github/scripts/pr-merge/rate-stop.bash' '.github/scripts/pr-merge/retry-call.bash' '.github/scripts/pr-merge/refire-refused.mjs' '.github/scripts/pr-merge/rotation.mjs' '.github/scripts/pr-merge/sweep-summary.mjs' '.github/scripts/pr-merge/who.mjs' '.github/scripts/pr-merge/post-unarmed-status.mjs' '.github/scripts/pr-merge/verify-answers.mjs' '.github/scripts/pr-merge/listing-carry.mjs' '.github/actions/report-check-run/posting-run.mjs' 'scripts/sync-hold-floor.py' '.github/scripts/pr-unblock/address-feedback.mjs' '.github/scripts/pr-unblock/escalation-routes.mjs' '.github/scripts/pr-unblock/escalation-routes.json' '.github/scripts/pr-unblock/gate-source.mjs' '.github/scripts/pr-unblock/thread-scope.mjs' '.github/scripts/pr-unblock/retry-fetch.mjs' '.github/scripts/work-resolve-issue/report-outcome.mjs' '.github/scripts/work-resolve-issue/limits.mjs' '.github/scripts/work-resolve-issue/retry-fetch.mjs' '.github/scripts/pr-unblock/report-escalation.sh' '.github/scripts/pr-unblock/adjudicate-feedback.mjs' '.github/scripts/pr-unblock/publish-feedback.mjs' '.github/scripts/pr-unblock/request-budget.mjs' '.github/scripts/pr-verify/resolve-pr.mjs' '.github/scripts/pr-verify/write-verdict.mjs' '.github/scripts/intake-triage/admit.mjs' '.github/actions/select-trusted-text/select-trusted-text.mjs' 'lib/publish-gate.mjs' '.github/recurring-schedule.json' 'plugins/work-items/scripts/charge-words.json' '.github/scripts/pr-unblock/dependency-classify.mjs' '.github/scripts/apply-patch/apply-patch.mjs' '.github/scripts/apply-patch/predicates.mjs' '.github/scripts/apply-patch/protected-paths.mjs' '.github/scripts/apply-patch/retry-fetch.mjs' '.github/scripts/pr-unblock/fix-ci-context.mjs' '.github/scripts/pr-unblock/feedback-dispatch.mjs' '.github/scripts/pr-unblock/verify-notes.mjs' '.github/scripts/pr-unblock/limit-stop.mjs' '.github/scripts/pr-unblock/dispatch-record.mjs' '.github/scripts/pr-unblock/verify-cap.mjs' '.github/scripts/maintenance-reconcile-lost-runs/infra-failure.mjs' '.github/scripts/work-resolve-issue/stop-routes.json' '.github/scripts/work-resolve-issue/stop-routes.mjs' '.github/scripts/lib/stop-reason.mjs' '.github/scripts/lib/admission-comment.mjs' '.github/scripts/lib/done-evidence.mjs' '.github/scripts/pr-review-main/*' 'docs/conventions/instruction-exception-register/*' 'docs/conventions/untrusted-content/*' 'docs/standards/*' '.github/workflows/dependabot-fragments.yml' '.github/workflows/eval-browser-dispatch.yml' '.github/workflows/intake-reenter.yml' '.github/workflows/intake-triage.yml' '.github/workflows/maintenance-audit-lane-runs.yml' '.github/workflows/maintenance-reconcile-lost-runs.yml' '.github/workflows/post-merge-demotion-alert.yml' '.github/workflows/post-merge-test-mutation.yml' '.github/workflows/pr-feedback-dispatch.yml' '.github/workflows/pr-merge.yml' '.github/workflows/pr-refine.yml' '.github/workflows/pr-require-checks.yml' '.github/workflows/pr-review-approved.yml' '.github/workflows/pr-review-hosted.yml' '.github/workflows/pr-review-main.yml' '.github/workflows/pr-review-security-hosted.yml' '.github/workflows/pr-run-activity-read.yml' '.github/workflows/pr-run-activity-write.yml' '.github/workflows/pr-unblock-dispatch.yml' '.github/workflows/pr-unblock.yml' '.github/workflows/pr-verify.yml' '.github/workflows/release-publish-plugins.yml' '.github/workflows/work-resolve-issue.yml' '.github/workflows/work-unblock.yml')
# merge.diff-check.path-holds is false: only Dependabot stays held.
[ "$AUTHOR_ID" = 49699333 ] || hold_patterns=()
# END hold-floor hold_patterns
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/pr-review-hosted.yml
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,7 @@ jobs:
plugins/source-control/skills/babysit-prs/scripts/babysit_review_trigger.py
plugins/source-control/skills/babysit-prs/scripts/babysit_run_cache.py
plugins/source-control/skills/babysit-prs/scripts/babysit_state.py
plugins/source-control/skills/babysit-prs/scripts/babysit_tracker_binding.py
plugins/source-control/skills/babysit-prs/scripts/babysit_util.py
plugins/source-control/skills/babysit-prs/scripts/babysit_verify_evidence.py
plugins/source-control/skills/babysit-prs/scripts/babysit_whole_review.py
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/pr-review-security-hosted.yml
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,7 @@ jobs:
plugins/source-control/skills/babysit-prs/scripts/babysit_review_trigger.py
plugins/source-control/skills/babysit-prs/scripts/babysit_run_cache.py
plugins/source-control/skills/babysit-prs/scripts/babysit_state.py
plugins/source-control/skills/babysit-prs/scripts/babysit_tracker_binding.py
plugins/source-control/skills/babysit-prs/scripts/babysit_util.py
plugins/source-control/skills/babysit-prs/scripts/babysit_verify_evidence.py
plugins/source-control/skills/babysit-prs/scripts/babysit_whole_review.py
Expand Down
7 changes: 4 additions & 3 deletions plugins/source-control/skills/babysit-loop/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -224,9 +224,10 @@ Stripping it happens only behind the explicit `--strip-do-not-merge` invocation
Escalation is the convention's contract
([`docs/contracts/loop-lane/README.md`](https://raw.githubusercontent.com/melodic-software/claude-code-plugins/main/docs/contracts/loop-lane/README.md)
§2), held by
citation: a tracker item carrying the human-gated role label, resolved from the consumer's
`.work-item-tracker.json` `config.role_labels` map, never compared as a literal (when that file is
absent, the canonical `needs-human` default applies with a loud notice), plus a machine-marked
citation: a tracker item carrying the human-gated role label, resolved from the `config.role_labels`
map of the consumer's tracker binding (the `tracker` mapping of `docs/conventions/work-items.yaml`,
else the legacy JSON binding), never compared as a literal (when no binding is
present, the canonical `needs-human` default applies with a loud notice), plus a machine-marked
escalation comment whose first line is
`<!-- work-items:escalation lane=babysit-loop kind=escalated -->`. That marker grammar is the
attended queue's escalated-view data contract; the sentinel names the contract owner, not the writer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
"id": 3,
"name": "babysit-loop-drain-exit-terminal-state-and-pacing",
"prompt": "/source-control:babysit-loop melodic-software/example-repo worker --drain\n\nCycle end. The cycle-start snapshot shows 0 open PRs and three open issues: 'Lane telemetry: babysit-loop', 'Lane telemetry: work-loop', and one issue carrying the human-gated role label with a machine-marked escalation comment and no PR in flight. Durable state shows cycle=17, backoff_level=3.",
"expected_output": "The drain evaluation runs against the cycle-start snapshot. Both telemetry tracking issues match the Lane telemetry: <lane> title contract and are excluded from the 0-open-issues evaluation as lane infrastructure. The one remaining open issue is human-gated/escalated with no PR in flight, which is the drain-terminal state per the loop-lane convention: the lane writes its final report, updates the durable state block on the telemetry comment, and stops cleanly instead of idling forever or chasing the escalation. Escalation state is read from the role label resolved via the consumer's .work-item-tracker.json config.role_labels (never a literal comparison) plus the machine-marked comment. Had the loop continued, the next cycle would be scheduled with ScheduleWakeup inside the [60, 3600] second clamp, mapped from the engine's recommended_cadence per the babysit-prs loop reference; a cycle-budget or seven-day-expiry hit would write a restart-request into the state block and stop cleanly rather than attempting a self-relaunch.",
"expected_output": "The drain evaluation runs against the cycle-start snapshot. Both telemetry tracking issues match the Lane telemetry: <lane> title contract and are excluded from the 0-open-issues evaluation as lane infrastructure. The one remaining open issue is human-gated/escalated with no PR in flight, which is the drain-terminal state per the loop-lane convention: the lane writes its final report, updates the durable state block on the telemetry comment, and stops cleanly instead of idling forever or chasing the escalation. Escalation state is read from the role label resolved via the config.role_labels of the consumer's tracker binding (docs/conventions/work-items.yaml, else the legacy JSON binding; never a literal comparison) plus the machine-marked comment. Had the loop continued, the next cycle would be scheduled with ScheduleWakeup inside the [60, 3600] second clamp, mapped from the engine's recommended_cadence per the babysit-prs loop reference; a cycle-budget or seven-day-expiry hit would write a restart-request into the state block and stop cleanly rather than attempting a self-relaunch.",
"files": [],
"expectations": [
"Evaluates the drain exit against the cycle-start snapshot, reporting rather than chasing mid-cycle intake",
Expand Down
Loading
Loading