Skip to content

feat: implement issue #398 — Compliance: secret_scanning_ai_detection - #482

Merged
don-petry merged 12 commits into
mainfrom
dev-lead/issue-398-20260608-0049
Jun 8, 2026
Merged

don-petry merged 12 commits into
mainfrom
dev-lead/issue-398-20260608-0049

Conversation

@don-petry

@don-petry don-petry commented Jun 8, 2026 •

Copy link
Copy Markdown
Collaborator

Closes #398

Implemented by dev-lead agent. Please review.

Summary by CodeRabbit

  • Tests

    • Extended continuous integration coverage for push-protection validation
    • Added comprehensive test suite for security settings enforcement
  • Documentation

    • Documented security settings enforcement scenarios, including resilience when individual settings are unavailable

Copilot AI review requested due to automatic review settings June 8, 2026 00:55
@don-petry
don-petry requested a review from a team as a code owner June 8, 2026 00:55
@coderabbitai

coderabbitai Bot commented Jun 8, 2026 •

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@don-petry, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 33 minutes and 17 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 24df0c2f-bfaa-434d-960f-e8a4142ba869

📥 Commits

Reviewing files that changed from the base of the PR and between a4322d1 and 6ef9088.

📒 Files selected for processing (4)
  • AGENTS.md
  • scripts/aw-standards-sync.sh
  • scripts/lib/push-protection.sh
  • tests/test_push_protection.bats
📝 Walkthrough

Walkthrough

This PR adds a bash library (scripts/lib/push-protection.sh) that enforces repository push-protection security settings via the GitHub API, integrates it into the standards-sync workflow, and includes comprehensive test coverage and behavioral scenarios documenting partial failure resilience.

Changes

Push-protection enforcement

Layer / File(s) Summary
Push-protection library and API
scripts/lib/push-protection.sh
Defines PP_REQUIRED_SA_SETTINGS as a list of required security_and_analysis keys and implements pp_apply_security_and_analysis function that iterates through each key, builds a JSON PATCH payload with jq, and applies it via gh api. Supports DEV_LEAD_DRY_RUN dry-run mode and continues attempting remaining settings even when individual PATCH calls fail.
Library test coverage
tests/test_push_protection.bats
Comprehensive test suite that validates PP_REQUIRED_SA_SETTINGS membership, exercises dry-run mode confirming no API calls occur, verifies live-mode PATCH requests and REPO validation, confirms the function continues applying remaining settings after one PATCH failure, and ensures exit status 0 even with partial failures.
Standards-sync integration
scripts/aw-standards-sync.sh
Script sources the new push-protection library and replaces static REQUIRED_SECURITY_SETTINGS definition with dynamic generation from PP_REQUIRED_SA_SETTINGS, building per-setting jq paths and PATCH payloads.
Behavioral scenarios and CI setup
tests/aw/standards-sync/scenarios.md, .github/workflows/lint.yml
Scenario 10 documents enforcement of all PP_REQUIRED_SA_SETTINGS with independent patching and summary tracking of enabled vs errored settings. Scenario 11 covers the case where secret_scanning_ai_detection is unavailable, showing remaining four settings still patch successfully and the workflow exits 0 despite the individual failure. CI is updated to run the new test suite.

Sequence Diagram

sequenceDiagram
  participant Script as Standards-sync Script
  participant ppLib as pp_apply_security_and_analysis
  participant jq as jq (payload builder)
  participant ghAPI as gh api PATCH
  
  Script->>ppLib: call with REPO set
  ppLib->>ppLib: check DEV_LEAD_DRY_RUN mode
  loop for each PP_REQUIRED_SA_SETTINGS key
    ppLib->>jq: build JSON patch payload
    jq-->>ppLib: return payload
    ppLib->>ghAPI: PATCH repos/REPO/security-and-analysis
    alt success
      ghAPI-->>ppLib: 200 OK
    else failure (422, 403, etc)
      ghAPI-->>ppLib: error response
      ppLib->>ppLib: warn to stderr, continue
    end
  end
  ppLib-->>Script: return 0 (always success)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested labels

needs-human-review

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title references issue #398 and describes implementing compliance for secret_scanning_ai_detection, which directly relates to the core feature changes across multiple files in the changeset.
Linked Issues check ✅ Passed The PR implements push-protection infrastructure to enable secret_scanning_ai_detection and other security settings per standards, fulfilling issue #398 requirements through new library, updated scripts, tests, and documentation.
Out of Scope Changes check ✅ Passed All changes directly support issue #398 compliance: new push-protection library, updated sync script, test suite for new library, scenario documentation, and CI workflow extension for testing.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev-lead/issue-398-20260608-0049

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a helper script scripts/lib/push-protection.sh to enforce GitHub security and analysis settings on repositories, along with a comprehensive suite of unit tests in tests/test_push_protection.bats. The review feedback suggests a robust improvement to simplify the JSON payload generation in the script by passing the bash array directly to jq using --args, which avoids a subshell and handles empty arrays more gracefully.

Comment thread scripts/lib/push-protection.sh Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 233e48af7d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread scripts/lib/push-protection.sh Outdated
Comment thread scripts/lib/push-protection.sh

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@don-petry

Copy link
Copy Markdown
Collaborator Author

Dev-Lead — rate-limited (intent: review-changes)

PR: #482
The retry cron will re-attempt automatically.

@don-petry

Copy link
Copy Markdown
Collaborator Author

Note

@don-petry I received your request but all AI engines are currently rate-limited. I'll retry automatically once the rate limit clears.
Rate limit resets at: unknown

@don-petry
don-petry enabled auto-merge (squash) June 8, 2026 01:29
@don-petry
don-petry disabled auto-merge June 8, 2026 05:00
@don-petry

Copy link
Copy Markdown
Collaborator Author

Dev-Lead — review-changes (applied)

Changes committed and pushed.

@don-petry
don-petry enabled auto-merge (squash) June 8, 2026 05:07
@don-petry
don-petry disabled auto-merge June 8, 2026 05:08

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a3f9a00cc6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/lint.yml Outdated
@don-petry
don-petry enabled auto-merge (squash) June 8, 2026 05:15
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jun 8, 2026
@don-petry
don-petry disabled auto-merge June 8, 2026 05:16
@don-petry

Copy link
Copy Markdown
Collaborator Author

Dev-Lead — fix-reviews (applied)

Changes committed and pushed.

@don-petry

Copy link
Copy Markdown
Collaborator Author

Dev-Lead — waiting on PR blockers (intent: review-changes)

PR: #482
No changes were committed, but the PR still has blocking checks or reviews (failing or cancelled checks, or changes-requested reviews). The retry cron will re-attempt automatically. Next attempt after: 2026-06-08T05:52:48Z

@don-petry

Copy link
Copy Markdown
Collaborator Author

Note

@don-petry I reviewed this PR and no code changes were needed, but it still has blocking checks or reviews (failing or cancelled checks, or changes-requested reviews), so I cannot mark it done yet. I'll re-check automatically.
Next attempt after: 2026-06-08T05:52:48Z

@don-petry
don-petry enabled auto-merge (squash) June 8, 2026 05:22
@don-petry

Copy link
Copy Markdown
Collaborator Author

Auto-rebase failed — merge conflict — this branch has conflicts with main that must be resolved.

Claude will attempt to resolve this automatically. If it cannot, a follow-up comment will explain what needs manual attention.

To resolve manually instead:

git fetch origin
git merge origin/main
# resolve conflicts, then:
git add .
git commit
git push

@don-petry
don-petry disabled auto-merge June 8, 2026 05:26
don-petry added a commit that referenced this pull request Jul 3, 2026
…repo (#482) agents: uses local 'git tag -f', not host gh-api (companion to #1049) (#1055)

* feat: implement issue #1054 — canary-rollout PROMOTE fails for cross-repo (#482) agents: uses local 'git tag -f', not host gh-api (companion to #1049)

* fix(bot): address bot feedback [skip ci-relay]

* chore: dev-lead update (review-changes) [skip ci-relay]

---------

Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Jul 3, 2026
…b) + host-aware cross-repo tag moves (#1054)

Implements #1045 part b — the timer advances the fleet, no manual step.

Automation:
- promote-all subcommand (cmd_promote_all): iterates every registry agent
  and forwards to cmd_promote, so each PROMOTE-ready agent advances exactly
  one ring per run while BLOCKED/REGRESSION agents are left untouched by the
  gate. A per-agent failure is logged and skipped so one agent cannot halt
  the fleet sweep. Human approval stays OVERRIDE-ONLY, never a required gate.
- workflow: schedule now runs the gated auto-promote when the org variable
  CANARY_AUTO_PROMOTE == 'true' (promote-all, real move), else read-only
  evaluate-all. The arm variable is the single kill-switch. dispatch gains
  evaluate-all/promote-all options (promote-all defaults to --dry-run).

Cross-repo fix (#1054):
- _gh_move_tag: force-move/create a channel tag on a cross-repo agent's HOST
  via gh api (PATCH then POST), the counterpart of `git tag -f` + push.
- cmd_promote / cmd_rollback are now host-aware: an agent hosted in THIS repo
  moves its tag via local git; a cross-repo agent (the 6 #482 reusables on
  petry-projects/.github) moves it on its host via gh api — local `git tag -f`
  failed with "nonexistent object" for a host commit absent from this checkout.

Tests: +3 bats (promote-all fleet iteration; cross-repo promote dry-run takes
the host gh-api path not local git; real cross-repo promote moves the host tag
via gh api PATCH + records the GITHUB_OUTPUT). 55/55 passing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
don-petry added a commit that referenced this pull request Jul 3, 2026
…b) + host-aware cross-repo tag moves (#1054) (#1056)

* feat(canary-rollout): gated scheduled fleet auto-promote (#1045 part b) + host-aware cross-repo tag moves (#1054)

Implements #1045 part b — the timer advances the fleet, no manual step.

Automation:
- promote-all subcommand (cmd_promote_all): iterates every registry agent
  and forwards to cmd_promote, so each PROMOTE-ready agent advances exactly
  one ring per run while BLOCKED/REGRESSION agents are left untouched by the
  gate. A per-agent failure is logged and skipped so one agent cannot halt
  the fleet sweep. Human approval stays OVERRIDE-ONLY, never a required gate.
- workflow: schedule now runs the gated auto-promote when the org variable
  CANARY_AUTO_PROMOTE == 'true' (promote-all, real move), else read-only
  evaluate-all. The arm variable is the single kill-switch. dispatch gains
  evaluate-all/promote-all options (promote-all defaults to --dry-run).

Cross-repo fix (#1054):
- _gh_move_tag: force-move/create a channel tag on a cross-repo agent's HOST
  via gh api (PATCH then POST), the counterpart of `git tag -f` + push.
- cmd_promote / cmd_rollback are now host-aware: an agent hosted in THIS repo
  moves its tag via local git; a cross-repo agent (the 6 #482 reusables on
  petry-projects/.github) moves it on its host via gh api — local `git tag -f`
  failed with "nonexistent object" for a host commit absent from this checkout.

Tests: +3 bats (promote-all fleet iteration; cross-repo promote dry-run takes
the host gh-api path not local git; real cross-repo promote moves the host tag
via gh api PATCH + records the GITHUB_OUTPUT). 55/55 passing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Jul 11, 2026
… agent) (#1165)

PR-1 of versioning ci-failure-analyst (#1159, Option A). Currently `valid_agent`
recognizes only pr-review/dev-lead (this-repo) + feature-ideation + the six #482
reusables (cross-repo), so `cut-release.sh ci-failure-analyst …` is rejected — you
can't cut its first release.

ci-failure-analyst's reusable is hosted in THIS repo (petry-projects/.github-private),
so add it to the this-repo `valid_agent` case (→ `agent_host_repo` resolves to
.github-private). Dry-run now resolves `ci-failure-analyst/v1.0.0` + `ci-failure-analyst/
stable` correctly.

Tests: +valid_agent accepts ci-failure-analyst, +agent_host_repo resolves this-repo;
updated the "unknown agent is rejected" fixture (it used ci-failure-analyst as its
negative example, now valid) to a genuinely-unknown name. test_cut_release.bats 45/45.

Next (this issue): cut v1.0.0 + channels → register in canary-rings.json → repin the
4 consumers. Refs #1159.

Co-authored-by: donpetry-bot <{}+donpetry-bot@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
don-petry added a commit that referenced this pull request Aug 2, 2026
…der the canary-ring model (extend cut-release.sh; coordinate with #866) (#915)

* feat: implement issue #870 — Bring #482's .github-hosted reusables under the canary-ring model (extend cut-release.sh; coordinate with #866)

* chore: apply manual instructions [skip ci-relay]

---------

Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 2, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 2, 2026
…1036) (#1044)

canary-rings.json contained only dev-lead, so the fleet-wide `evaluate-all`
covered nothing else and the #482 rollout couldn't be completed by the
automation. Add the six .github-hosted reusables (agent-shield, auto-rebase,
dependency-audit, dependabot-automerge, dependabot-rebase, pr-review-mention).

Ring assignment is EXPLICIT (not host-relative): host is petry-projects/.github
but next=.github-private, ring0=.github, ring1=TalkTerm+bmad, stable="*" (the
org-owner decision from #870 — inverted from the $host/$org_infra default).
dependabot-rebase has no .github-private caller → soak_start_ring: ring0.
Gate = the #548 defaults (copied from dev-lead); benign list empty (these have
been clean). run_workflow = each caller's workflow display name.

dev-lead stalled on #1036; added per the monitor unblock mandate. Config only —
no channel tags moved, no releases cut.

Refs #1036, #1025, #548.

Co-authored-by: Claude Code Bot <bot@petry-projects>
don-petry added a commit that referenced this pull request Aug 2, 2026
…1045 part a) (#1047)

The agent workflow_dispatch choice was hardcoded to [dev-lead], so manual
evaluate/promote/rollback couldn't target the 6 #482 reusables now in the
registry. List all 7 so they can be evaluated + promoted. (The gated
SCHEDULED auto-promote — #1045 part b, decision A — remains for dev-lead.)

Refs #1045, #1044.

Co-authored-by: Claude Code Bot <bot@petry-projects>
don-petry added a commit that referenced this pull request Aug 2, 2026
… 6 cross-repo (#482) reusables as 'fully rolled out' — reads local tags, not .github (#1050)

* feat: implement issue #1049 — canary-rollout evaluate mis-reports all 6 cross-repo (#482) reusables as 'fully rolled out' — reads local tags, not .github

* fix(reviews): address review comments [skip ci-relay]

* chore: dev-lead update (review-changes) [skip ci-relay]

---------

Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 2, 2026
…repo (#482) agents: uses local 'git tag -f', not host gh-api (companion to #1049) (#1055)

* feat: implement issue #1054 — canary-rollout PROMOTE fails for cross-repo (#482) agents: uses local 'git tag -f', not host gh-api (companion to #1049)

* fix(bot): address bot feedback [skip ci-relay]

* chore: dev-lead update (review-changes) [skip ci-relay]

---------

Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 2, 2026
…b) + host-aware cross-repo tag moves (#1054) (#1056)

* feat(canary-rollout): gated scheduled fleet auto-promote (#1045 part b) + host-aware cross-repo tag moves (#1054)

Implements #1045 part b — the timer advances the fleet, no manual step.

Automation:
- promote-all subcommand (cmd_promote_all): iterates every registry agent
  and forwards to cmd_promote, so each PROMOTE-ready agent advances exactly
  one ring per run while BLOCKED/REGRESSION agents are left untouched by the
  gate. A per-agent failure is logged and skipped so one agent cannot halt
  the fleet sweep. Human approval stays OVERRIDE-ONLY, never a required gate.
- workflow: schedule now runs the gated auto-promote when the org variable
  CANARY_AUTO_PROMOTE == 'true' (promote-all, real move), else read-only
  evaluate-all. The arm variable is the single kill-switch. dispatch gains
  evaluate-all/promote-all options (promote-all defaults to --dry-run).

Cross-repo fix (#1054):
- _gh_move_tag: force-move/create a channel tag on a cross-repo agent's HOST
  via gh api (PATCH then POST), the counterpart of `git tag -f` + push.
- cmd_promote / cmd_rollback are now host-aware: an agent hosted in THIS repo
  moves its tag via local git; a cross-repo agent (the 6 #482 reusables on
  petry-projects/.github) moves it on its host via gh api — local `git tag -f`
  failed with "nonexistent object" for a host commit absent from this checkout.

Tests: +3 bats (promote-all fleet iteration; cross-repo promote dry-run takes
the host gh-api path not local git; real cross-repo promote moves the host tag
via gh api PATCH + records the GITHUB_OUTPUT). 55/55 passing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 3, 2026
* feat: wire cut-release.sh cross-repo publish via gh api (#872)

The six #482 reusables + feature-ideation are hosted in petry-projects/.github,
so their release/channel tags belong on THAT repo. cut-release.sh previously
resolved refs against local git and refused live cross-repo cuts (the push
target was an open question). This wires it:

- For cross_repo_agents, resolve the ref against petry-projects/.github via
  `gh api repos/.../commits/<ref>` (an `origin/` prefix is stripped → its main),
  and publish with `--push`: create the annotated `<name>/vX.Y.Z` release object
  + force-move the `<name>/<channel>` tag via `gh api git/tags` + `git/refs`.
- This-repo agents (pr-review, dev-lead) keep the existing local-git path
  unchanged. Immutability is preserved cross-repo: an existing release tag is
  never overwritten.
- `--push` for a cross-repo agent needs GH_TOKEN with contents:write on .github.

New helpers (strip_origin pure; gh_resolve_sha / gh_tag_exists /
gh_create_annotated_tag / gh_move_tag wrappers). Tests: +4 strip_origin pure
cases and a new gh-mocked integration suite (dry-run / print-only / --push
create+move / immutability refusal / native path untouched) — 46 pass,
shellcheck clean. Docs (versioning.md, runbook.md) updated: cross-repo path is
now wired, not "dry-run only".

Refs #872, #870.

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Code Bot <bot@petry-projects>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 3, 2026
…1036) (#1044)

canary-rings.json contained only dev-lead, so the fleet-wide `evaluate-all`
covered nothing else and the #482 rollout couldn't be completed by the
automation. Add the six .github-hosted reusables (agent-shield, auto-rebase,
dependency-audit, dependabot-automerge, dependabot-rebase, pr-review-mention).

Ring assignment is EXPLICIT (not host-relative): host is petry-projects/.github
but next=.github-private, ring0=.github, ring1=TalkTerm+bmad, stable="*" (the
org-owner decision from #870 — inverted from the $host/$org_infra default).
dependabot-rebase has no .github-private caller → soak_start_ring: ring0.
Gate = the #548 defaults (copied from dev-lead); benign list empty (these have
been clean). run_workflow = each caller's workflow display name.

dev-lead stalled on #1036; added per the monitor unblock mandate. Config only —
no channel tags moved, no releases cut.

Refs #1036, #1025, #548.

Co-authored-by: Claude Code Bot <bot@petry-projects>
don-petry added a commit that referenced this pull request Aug 3, 2026
…1045 part a) (#1047)

The agent workflow_dispatch choice was hardcoded to [dev-lead], so manual
evaluate/promote/rollback couldn't target the 6 #482 reusables now in the
registry. List all 7 so they can be evaluated + promoted. (The gated
SCHEDULED auto-promote — #1045 part b, decision A — remains for dev-lead.)

Refs #1045, #1044.

Co-authored-by: Claude Code Bot <bot@petry-projects>
don-petry added a commit that referenced this pull request Aug 3, 2026
… 6 cross-repo (#482) reusables as 'fully rolled out' — reads local tags, not .github (#1050)

* feat: implement issue #1049 — canary-rollout evaluate mis-reports all 6 cross-repo (#482) reusables as 'fully rolled out' — reads local tags, not .github

* fix(reviews): address review comments [skip ci-relay]

* chore: dev-lead update (review-changes) [skip ci-relay]

---------

Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 3, 2026
…repo (#482) agents: uses local 'git tag -f', not host gh-api (companion to #1049) (#1055)

* feat: implement issue #1054 — canary-rollout PROMOTE fails for cross-repo (#482) agents: uses local 'git tag -f', not host gh-api (companion to #1049)

* fix(bot): address bot feedback [skip ci-relay]

* chore: dev-lead update (review-changes) [skip ci-relay]

---------

Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 3, 2026
…b) + host-aware cross-repo tag moves (#1054) (#1056)

* feat(canary-rollout): gated scheduled fleet auto-promote (#1045 part b) + host-aware cross-repo tag moves (#1054)

Implements #1045 part b — the timer advances the fleet, no manual step.

Automation:
- promote-all subcommand (cmd_promote_all): iterates every registry agent
  and forwards to cmd_promote, so each PROMOTE-ready agent advances exactly
  one ring per run while BLOCKED/REGRESSION agents are left untouched by the
  gate. A per-agent failure is logged and skipped so one agent cannot halt
  the fleet sweep. Human approval stays OVERRIDE-ONLY, never a required gate.
- workflow: schedule now runs the gated auto-promote when the org variable
  CANARY_AUTO_PROMOTE == 'true' (promote-all, real move), else read-only
  evaluate-all. The arm variable is the single kill-switch. dispatch gains
  evaluate-all/promote-all options (promote-all defaults to --dry-run).

Cross-repo fix (#1054):
- _gh_move_tag: force-move/create a channel tag on a cross-repo agent's HOST
  via gh api (PATCH then POST), the counterpart of `git tag -f` + push.
- cmd_promote / cmd_rollback are now host-aware: an agent hosted in THIS repo
  moves its tag via local git; a cross-repo agent (the 6 #482 reusables on
  petry-projects/.github) moves it on its host via gh api — local `git tag -f`
  failed with "nonexistent object" for a host commit absent from this checkout.

Tests: +3 bats (promote-all fleet iteration; cross-repo promote dry-run takes
the host gh-api path not local git; real cross-repo promote moves the host tag
via gh api PATCH + records the GITHUB_OUTPUT). 55/55 passing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
don-petry added a commit that referenced this pull request Aug 3, 2026
…der the canary-ring model (extend cut-release.sh; coordinate with #866) (#915)

* feat: implement issue #870 — Bring #482's .github-hosted reusables under the canary-ring model (extend cut-release.sh; coordinate with #866)

* chore: apply manual instructions [skip ci-relay]

---------

Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Compliance: secret_scanning_ai_detection

3 participants