Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
e85edad
chore: align autofix source pins
github-actions[bot] Aug 22, 2026
6393963
feat(sync): onboard iamkayleb/bukay and repoint consumer templates at…
claude Aug 22, 2026
e0c0aa0
fix(reusables): vendor the helper layer from this fork, not upstream
claude Aug 23, 2026
7d6a785
Merge pull request #80 from iamkayleb/claude/repo-changes-review-jgvimg
iamkayleb Aug 23, 2026
565d6f9
corpus: grow verifier eval corpus from realized PR outcomes (#82)
iamkayleb Aug 24, 2026
1cca24f
maint: prune closed-issue agent stubs [skip ci]
github-actions[bot] Aug 24, 2026
833be49
Support non-default base branches for agent PRs (evaluation lanes)
claude Aug 25, 2026
16dc53b
Merge pull request #83 from iamkayleb/eval/autonomous-agent-pipeline
iamkayleb Aug 25, 2026
6d15c0a
Wire Cursor into the consolidated keepalive/autofix loop
claude Aug 27, 2026
a0327a4
Merge pull request #84 from iamkayleb/feat/cursor-agent-in-consolidat…
iamkayleb Aug 27, 2026
d1ca332
Close two agent allowlists that silently excluded Cursor
claude Sep 3, 2026
623b48e
Merge pull request #85 from iamkayleb/feat/cursor-agent-in-consolidat…
iamkayleb Sep 3, 2026
58e28fd
Limit the canary list to repos this fork can write to
claude Sep 4, 2026
11201bd
Merge pull request #86 from iamkayleb/fix/fork-local-canary-list
iamkayleb Sep 4, 2026
e3550ec
Optimizer recursion guard: stop counting no-op runs
claude Sep 6, 2026
051b5de
Merge pull request #87 from iamkayleb/fix/optimizer-recursion-guard-c…
iamkayleb Sep 6, 2026
8bf0b11
Restore the full canary registry
claude Sep 6, 2026
7a75f6b
corpus: grow verifier eval corpus from realized PR outcomes (#89)
iamkayleb Sep 7, 2026
0149820
Merge pull request #90 from iamkayleb/revert/restore-canary-registry
iamkayleb Sep 7, 2026
5d4930a
Put the issue number in the auto-pilot run title
claude Sep 7, 2026
446e70e
Belt dispatcher: give each dispatched issue its own concurrency lane
claude Sep 7, 2026
082c07c
Merge pull request #91 from iamkayleb/fix/auto-pilot-run-name
iamkayleb Sep 7, 2026
9fa7dac
Merge pull request #92 from iamkayleb/fix/belt-dispatcher-per-issue-c…
iamkayleb Sep 7, 2026
77ae451
Belt dispatcher: honour the base-branch marker
claude Sep 7, 2026
041f5f7
Merge pull request #93 from iamkayleb/fix/belt-dispatcher-honours-bas…
iamkayleb Sep 7, 2026
6adf8d4
Ship the Codex auth expiry check to consumer repos
claude Sep 10, 2026
6ee6bf6
Merge pull request #94 from iamkayleb/feat/ship-auth-check-to-consumers
iamkayleb Sep 10, 2026
cb15ccf
Auto-pilot: honour the base-branch marker when opening the pull request
claude Sep 10, 2026
97d6242
Merge pull request #95 from iamkayleb/fix/auto-pilot-honours-base-marker
iamkayleb Sep 11, 2026
43cbb88
Give Codex a usable sandbox in the consolidated loop
claude Sep 11, 2026
9be71e7
Merge pull request #96 from iamkayleb/fix/codex-sandbox-in-consolidat…
iamkayleb Sep 11, 2026
c2d3578
Follow-up creator: prefer a GitHub App token
claude Sep 14, 2026
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
12 changes: 6 additions & 6 deletions .github/agents/registry.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ model_profile_trial_contract:
artifact_schema: workflows.model-profile-trial-result/v2
identity_authority: workflows-read-only-trial-artifact/v2
collector_identity_authority: github-actions-api/workflows-read-only-trial-artifact/v2
runner_ref: stranske/Workflows/.github/workflows/reusable-model-profile-trial.yml@822e323eefba3edb640e0bd9c922caec6fffee65
runner_ref: iamkayleb/Workflows/.github/workflows/reusable-model-profile-trial.yml@e85edadb246e41d172a0c79fad147752d1df9ea9
cli_version: 0.144.1
runtime_fallback_allowed: false
auxiliary_evaluator_allowed: false
Expand Down Expand Up @@ -52,7 +52,7 @@ execution_profiles:
model: gpt-5.6-sol
fallback_model: gpt-5.5
runner: reusable-model-profile-trial
runner_ref: stranske/Workflows/.github/workflows/reusable-model-profile-trial.yml@822e323eefba3edb640e0bd9c922caec6fffee65
runner_ref: iamkayleb/Workflows/.github/workflows/reusable-model-profile-trial.yml@e85edadb246e41d172a0c79fad147752d1df9ea9
capacity_pool: codex-standard
safety: read-only
lifecycle: trial
Expand All @@ -63,7 +63,7 @@ execution_profiles:
model: gpt-5.6-terra
fallback_model: gpt-5.5
runner: reusable-model-profile-trial
runner_ref: stranske/Workflows/.github/workflows/reusable-model-profile-trial.yml@822e323eefba3edb640e0bd9c922caec6fffee65
runner_ref: iamkayleb/Workflows/.github/workflows/reusable-model-profile-trial.yml@e85edadb246e41d172a0c79fad147752d1df9ea9
capacity_pool: codex-standard
safety: read-only
lifecycle: trial
Expand All @@ -74,7 +74,7 @@ execution_profiles:
model: gpt-5.6-luna
fallback_model: gpt-5.5
runner: reusable-model-profile-trial
runner_ref: stranske/Workflows/.github/workflows/reusable-model-profile-trial.yml@822e323eefba3edb640e0bd9c922caec6fffee65
runner_ref: iamkayleb/Workflows/.github/workflows/reusable-model-profile-trial.yml@e85edadb246e41d172a0c79fad147752d1df9ea9
capacity_pool: codex-standard
safety: read-only
lifecycle: trial
Expand Down Expand Up @@ -137,7 +137,7 @@ agents:
branch_prefix: cursor/issue-
capacity:
window: daily
limit: 1 # TODO: confirm owner-supplied public plan limit
limit: 10 # SET THIS to your actual Cursor plan quota
ui_mentions_allowed: false
# Reuses stranske-automation-bot for branch pushes/attribution until a
# dedicated stranske-cursor-bot service account is provisioned.
Expand All @@ -152,7 +152,7 @@ agents:
capabilities:
pr_keepalive: true
pr_autofix: true # wired into agents-autofix-loop.yml (autofix-cursor job)
belt: false # belt routing deferred to a later phase
belt: true # dispatched by agents-81 run-cursor
verifier_checkbox: false # verification stays on the existing judge (config/llm_slots.json)

gemini:
Expand Down
4 changes: 4 additions & 0 deletions .github/sync-manifest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ workflows:
sync_mode: create_only # Don't overwrite existing consumer Gate files; fresh repos can still receive this file, so follow #2158 before first seeding.
overwrite_repos:
- stranske/Template
- iamkayleb/bukay
skip_repos:
- repo: stranske/Manager-Database
reason: "Maintains a fully custom Gate workflow; never overwrite (replaces the hard-coded custom_gate_repos list in maint-68)."
Expand Down Expand Up @@ -73,6 +74,9 @@ workflows:
- source: .github/workflows/agents-72-codex-belt-worker.yml
description: "Codex belt worker - executes agent on issues with full prompt and context"

- source: .github/workflows/health-codex-auth-check.yml
description: "Twice-daily CODEX_AUTH_JSON expiry check - opens an auth-expiring issue before the token lapses"

- source: .github/workflows/agents-72-codex-belt-worker-dispatch.yml
description: "Codex belt worker dispatch wrapper - allows workflow_dispatch for the worker"

Expand Down
48 changes: 46 additions & 2 deletions .github/workflows/agents-71-codex-belt-dispatcher.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ on:
required: false
default: false
type: boolean
base_branch:
description: >-
Optional base branch for the agent branch. Overrides the issue's
`<!-- base-branch: X -->` marker and the repository default.
required: false
default: ''
type: string
orchestrator_skill_pack:
description: >-
Optional reference-pack name override for exported Orchestrator skill context on
Expand Down Expand Up @@ -76,6 +83,13 @@ on:
required: false
default: false
type: boolean
base_branch:
description: >-
Optional base branch for the agent branch. Overrides the issue's
`<!-- base-branch: X -->` marker and the repository default.
required: false
default: ''
type: string
orchestrator_skill_pack:
description: >-
Optional reference-pack name override for exported Orchestrator skill context on
Expand Down Expand Up @@ -292,12 +306,42 @@ jobs:
]);

const { data: repoInfo } = await withRetry((client) => client.rest.repos.get({ owner, repo }));
const base = repoInfo.default_branch;
if (!base) {
const defaultBranch = repoInfo.default_branch;
if (!defaultBranch) {
core.setFailed('Repository default branch not available');
return;
}

// Base resolution mirrors reusable-agents-issue-bridge.yml: an
// explicit input wins, then the issue's `<!-- base-branch: X -->`
// marker, then the repository default. Without the marker every
// agent branch is cut from the default branch, which silently
// defeats any per-lane workflow (evaluation lanes, release trains,
// long-lived feature bases).
let base = String(process.env.INPUT_BASE_BRANCH || '').trim();
let baseSource = base ? 'input' : '';
Comment on lines +321 to +322

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Pass the dispatcher base input into the script

For either workflow_call or workflow_dispatch with base_branch set, INPUT_BASE_BRANCH is never defined in the Resolve candidate issue step's environment—the step exports only FORCE_ISSUE and AGENT_KEY. Therefore this expression is always empty and the advertised explicit override is ignored in favor of the issue marker or default branch; pass ${{ inputs.base_branch }} through the step environment as the reusable issue bridge does.

Useful? React with 👍 / 👎.

if (!base) {
try {
const { data: issueData } = await withRetry((client) =>
client.rest.issues.get({ owner, repo, issue_number: issueNumber }));
const marker = String(issueData.body || '')
.match(/<!--\s*base-branch:\s*([^\s>]+)\s*-->/);
if (marker) { base = marker[1].trim(); baseSource = 'issue-marker'; }
} catch (error) {
core.warning(`Could not read issue body for a base-branch marker: ${error.message}`);
}
}
if (!base) { base = defaultBranch; baseSource = 'default'; }
if (base !== defaultBranch) {
try {
await withRetry((client) => client.rest.repos.getBranch({ owner, repo, branch: base }));
} catch (error) {
core.warning(`Base branch '${base}' not found; falling back to '${defaultBranch}'.`);
base = defaultBranch; baseSource = 'default-fallback';
}
}
core.info(`Base branch: ${base} (source: ${baseSource})`);

let branchPrefix = 'codex/issue-';
try {
const { getAgentConfig } = require('./.github/scripts/agent_registry.js');
Expand Down
98 changes: 94 additions & 4 deletions .github/workflows/agents-auto-pilot.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
# See docs/ci/AGENTS_POLICY.md for guardrails and override process.
name: Agents Auto-Pilot

# Correlating a run to its issue needs the issue number in the run title;
# without it `gh run list` shows only the workflow name and no per-issue
# history can be reconstructed.
run-name: >-
Agents Auto-Pilot
#${{ github.event.issue.number || github.event.pull_request.number ||
inputs.issue_number }}

# End-to-end automation: Issue → Format → Optimize → Apply → Agent → Keepalive → Merge
# Triggered by:
# 1. agents:auto-pilot label (initial trigger)
Expand Down Expand Up @@ -2880,12 +2888,53 @@ jobs:
owner: context.repo.owner,
repo: context.repo.repo
}));
const baseBranch = repoInfo.default_branch;
if (!baseBranch) {
const defaultBranch = repoInfo.default_branch;
if (!defaultBranch) {
core.setFailed('Repository default branch not available');
return;
}

// Resolve the pull request base the same way the issue bridge and the
// belt dispatcher do: the issue's `<!-- base-branch: X -->` marker
// wins over the repository default. Auto-pilot opens the pull request
// itself, so without this the marker is honoured when the branch is
// cut and then ignored when the PR is opened — the PR lands on the
// default branch and any per-lane workflow silently collapses.
let baseBranch = defaultBranch;
let baseSource = 'default';
try {
const { data: baseIssue } = await withRetry((client) =>
client.rest.issues.get({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
}));
const marker = String(baseIssue.body || '')
.match(/<!--\s*base-branch:\s*([^\s>]+)\s*-->/);
if (marker) {
const candidate = marker[1].trim();
if (candidate && candidate !== defaultBranch) {
try {
await withRetry((client) => client.rest.repos.getBranch({
owner: context.repo.owner,
repo: context.repo.repo,
branch: candidate,
}));
baseBranch = candidate;
baseSource = 'issue-marker';
} catch (branchError) {
core.warning(
`Base branch '${candidate}' from the issue marker was not found; ` +
`falling back to '${defaultBranch}'.`);
baseSource = 'default-fallback';
}
}
}
} catch (markerError) {
core.warning(`Could not read issue #${issueNumber} for a base-branch marker: ${markerError.message}`);
}
core.info(`Base branch: ${baseBranch} (source: ${baseSource})`);

// If a PR already exists for this branch, stop create-pr loop
try {
const headRef = `${context.repo.owner}:${branchName}`;
Expand Down Expand Up @@ -3754,12 +3803,53 @@ jobs:
owner: context.repo.owner,
repo: context.repo.repo
}));
const baseBranch = repoInfo.default_branch;
if (!baseBranch) {
const defaultBranch = repoInfo.default_branch;
if (!defaultBranch) {
core.setFailed('Repository default branch not available');
return;
}

// Resolve the pull request base the same way the issue bridge and the
// belt dispatcher do: the issue's `<!-- base-branch: X -->` marker
// wins over the repository default. Auto-pilot opens the pull request
// itself, so without this the marker is honoured when the branch is
// cut and then ignored when the PR is opened — the PR lands on the
// default branch and any per-lane workflow silently collapses.
let baseBranch = defaultBranch;
let baseSource = 'default';
try {
const { data: baseIssue } = await withRetry((client) =>
client.rest.issues.get({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
}));
const marker = String(baseIssue.body || '')
.match(/<!--\s*base-branch:\s*([^\s>]+)\s*-->/);
if (marker) {
const candidate = marker[1].trim();
if (candidate && candidate !== defaultBranch) {
try {
await withRetry((client) => client.rest.repos.getBranch({
owner: context.repo.owner,
repo: context.repo.repo,
branch: candidate,
}));
baseBranch = candidate;
baseSource = 'issue-marker';
} catch (branchError) {
core.warning(
`Base branch '${candidate}' from the issue marker was not found; ` +
`falling back to '${defaultBranch}'.`);
baseSource = 'default-fallback';
}
}
}
} catch (markerError) {
core.warning(`Could not read issue #${issueNumber} for a base-branch marker: ${markerError.message}`);
}
core.info(`Base branch: ${baseBranch} (source: ${baseSource})`);

const scriptsPath = process.env.WORKFLOWS_SCRIPTS_PATH || process.env.GITHUB_WORKSPACE;
const { redispatchForceStep } = require(
`${scriptsPath}/.github/scripts/auto_pilot_transitions.js`
Expand Down
19 changes: 17 additions & 2 deletions .github/workflows/agents-issue-optimizer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,13 @@ name: Agents Issue Optimizer
# nothing and reported 0 for an issue it was re-running every minute. Pin the issue
# number into the run name so both trigger types are correlatable.
run-name: >-
Agents Issue Optimizer #${{ github.event.issue.number || github.event.inputs.issue_number }}
Agents Issue Optimizer
${{ (github.event_name == 'workflow_dispatch' ||
github.event.label.name == 'agents:format' ||
github.event.label.name == 'agents:optimize' ||
github.event.label.name == 'agents:apply-suggestions')
&& '[work]' || '[noop]' }}
#${{ github.event.issue.number || github.event.inputs.issue_number }}

on:
issues:
Expand Down Expand Up @@ -210,6 +216,14 @@ jobs:

# `gh run list` defaults to 20 runs, which a tight loop exhausts inside the
# window; ask for enough history to actually see the recursion.
#
# Count only runs that could do work. This workflow triggers on EVERY
# `labeled` event, but only agents:format / agents:optimize /
# agents:apply-suggestions (and workflow_dispatch) reach the optimizer;
# every other label spawns a run that exits at the trigger check. Those
# no-ops used to count here, so applying three labels to a new issue
# burned the whole budget before any real work started and the guard
# tripped on legitimate bulk seeding. run-name marks them [noop].
# shellcheck disable=SC2016
count=$(gh run list \
--workflow=agents-issue-optimizer.yml \
Expand All @@ -218,7 +232,8 @@ jobs:
| jq --arg cutoff "$one_hour_ago" \
--arg issue "#$ISSUE_NUMBER" \
'[.[] | select(.createdAt > $cutoff
and (.displayTitle | endswith($issue)))
and (.displayTitle | endswith($issue))
and (.displayTitle | contains("[noop]") | not))
] | length')

echo "Optimizer runs for issue #$ISSUE_NUMBER in last hour: $count"
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/agents-model-profile-trial.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ permissions:

jobs:
trial:
uses: stranske/Workflows/.github/workflows/reusable-model-profile-trial.yml@822e323eefba3edb640e0bd9c922caec6fffee65
uses: iamkayleb/Workflows/.github/workflows/reusable-model-profile-trial.yml@e85edadb246e41d172a0c79fad147752d1df9ea9
permissions:
contents: read
with:
Expand All @@ -61,6 +61,6 @@ jobs:
packet_hash: ${{ inputs.packet_hash }}
launch_ordinal: ${{ fromJSON(inputs.launch_ordinal) }}
expected_source_sha: ${{ inputs.expected_source_sha }}
runner_sha: 822e323eefba3edb640e0bd9c922caec6fffee65
runner_sha: e85edadb246e41d172a0c79fad147752d1df9ea9
secrets:
CODEX_AUTH_JSON: ${{ secrets.CODEX_AUTH_JSON }}
Loading