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
40 changes: 34 additions & 6 deletions .github/agents/registry.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,25 @@ default_agent: codex
# Shared keepalive marker prefix (agent-agnostic)
keepalive_marker_prefix: agent-keepalive

# Dedicated instrumentation-only contract for the Sol/Terra/Luna plumbing
# canary. The reusable workflow ref is replaced with the exact commit containing
# this runner before merge. Trial profiles are rejected by ordinary agent and
# Keepalive execution. The lane cannot fall back, mutate source, invoke an
# evaluator, or claim provider-resolved identity.
model_profile_trial_contract:
mode: read-only
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
cli_version: 0.144.1
runtime_fallback_allowed: false
auxiliary_evaluator_allowed: false
provider_resolved_identity: unavailable
capacity_pool_mapping:
orchestrator: codex-subscription
workflows: codex-standard

execution_profiles:
codex-default:
agent: codex
Expand All @@ -26,26 +45,35 @@ execution_profiles:
agent: codex
model: gpt-5.6-sol
fallback_model: gpt-5.5
runner: reusable-codex-run
runner: reusable-model-profile-trial
runner_ref: stranske/Workflows/.github/workflows/reusable-model-profile-trial.yml@822e323eefba3edb640e0bd9c922caec6fffee65
capacity_pool: codex-standard
safety: standard
safety: read-only
lifecycle: trial
reasoning_effort: high
permission_mode: read-only
codex-5.6-terra-high:
agent: codex
model: gpt-5.6-terra
fallback_model: gpt-5.5
runner: reusable-codex-run
runner: reusable-model-profile-trial
runner_ref: stranske/Workflows/.github/workflows/reusable-model-profile-trial.yml@822e323eefba3edb640e0bd9c922caec6fffee65
capacity_pool: codex-standard
safety: standard
safety: read-only
lifecycle: trial
reasoning_effort: high
permission_mode: read-only
codex-5.6-luna-high:
agent: codex
model: gpt-5.6-luna
fallback_model: gpt-5.5
runner: reusable-codex-run
runner: reusable-model-profile-trial
runner_ref: stranske/Workflows/.github/workflows/reusable-model-profile-trial.yml@822e323eefba3edb640e0bd9c922caec6fffee65
capacity_pool: codex-standard
safety: standard
safety: read-only
lifecycle: trial
reasoning_effort: high
permission_mode: read-only

agents:
codex:
Expand Down
24 changes: 10 additions & 14 deletions .github/scripts/__tests__/agent-registry.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -227,20 +227,16 @@ test('resolveExecutionProfile returns registry-backed codex model contract', ()
assert.equal(profile.runner, 'reusable-codex-run');
});

test('resolveExecutionProfile exposes the explicit Sol Terra Luna trial profiles', () => {
const expected = {
'codex-5.6-sol-high': ['gpt-5.6-sol', 'gpt-5.5'],
'codex-5.6-terra-high': ['gpt-5.6-terra', 'gpt-5.5'],
'codex-5.6-luna-high': ['gpt-5.6-luna', 'gpt-5.5'],
};
for (const [profileId, [model, fallback]] of Object.entries(expected)) {
const profile = resolveExecutionProfile(profileId, { registryPath: REGISTRY_PATH });
assert.equal(profile.agent, 'codex');
assert.equal(profile.model, model);
assert.equal(profile.fallback_model, fallback);
assert.equal(profile.runner, 'reusable-codex-run');
assert.equal(profile.capacity_pool, 'codex-standard');
assert.equal(profile.lifecycle, 'trial');
test('resolveExecutionProfile rejects trial profiles from ordinary agent execution', () => {
for (const profileId of [
'codex-5.6-sol-high',
'codex-5.6-terra-high',
'codex-5.6-luna-high',
]) {
assert.throws(
() => resolveExecutionProfile(profileId, { registryPath: REGISTRY_PATH }),
new RegExp(`Execution profile ${profileId} has lifecycle trial`),
);
}
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,20 @@ test('workflow dispatch profile input is honored when PR body omits a profile',
);
});

test('ordinary keepalive execution rejects lifecycle trial profiles', () => {
const registry = readWorkflow('.github/scripts/agent_registry.js');
assert.match(
registry,
/String\(profile\.lifecycle \|\| ''\)\.trim\(\) !== 'active'/,
'expected the shared resolver to fail closed before Keepalive can use a trial profile',
);
assert.match(
registry,
/ordinary agent execution accepts active profiles only/,
'expected an explicit lifecycle rejection rather than a normal runner fallback',
);
});

test('profile validation is limited to codex execution actions', () => {
const keepaliveLoop = readWorkflow('.github/scripts/keepalive_loop.js');
assert.match(
Expand Down
6 changes: 6 additions & 0 deletions .github/scripts/agent_registry.js
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,12 @@ function resolveExecutionProfile(profileId, options = {}) {
);
}
validateExecutionProfile(id, profile, registry);
if (String(profile.lifecycle || '').trim() !== 'active') {
throw new Error(
`Execution profile ${id} has lifecycle ${profile.lifecycle || '(empty)'}; ` +
'ordinary agent execution accepts active profiles only',
);
}
return {
id,
...profile,
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Core layers:
- Minimal invariant CI (`pr-11-ci-smoke.yml`): lean push/PR workflow that installs the project once on Python 3.12, sanity-checks imports, and executes the invariant tests from Issue #3651 so regressions surface quickly.
- Gate summary (`pr-00-gate.yml` post-CI jobs): integrated post-CI reporting that batches small hygiene fixes, posts Gate summaries, and manages trivial failure remediation using the composite autofix action.
- Agents orchestration (`agents-70-orchestrator.yml` + `reusable-16-agents.yml`): single entry point for Codex readiness, bootstrap, diagnostics, and watchdog sweeps. Use the [Agent task issue template][agent-task-template] (auto-labels `agents` + `agent:codex`) to raise work for Codex; the issue bridge listens for `agent:codex` and hands issues to the orchestrator. Legacy consumer shims remain removed following Issue #2650.
- Model-profile trial (`agents-model-profile-trial.yml` + `reusable-model-profile-trial.yml`): Workflows-only manual transport for one immutable, read-only Sol/Terra/Luna instrumentation arm. A separately pinned helper requires the target to equal current remote `main` before auth and uploads v2 quarantine telemetry with source-manifest and GitHub provenance. It has no commit, push, comment, auth-refresh, evaluator, provider-resolution, or ordinary Keepalive path.
- PR metadata management (`agents-pr-meta.yml`): serializes Codex activation commands and PR body decoration through dedicated jobs that share a concurrency group keyed by PR number. This prevents marker thrash while keeping activation dispatch responsive.
- Agents intake + orchestration (`agents-63-issue-intake.yml`, `agents-70-orchestrator.yml`, `reusable-16-agents.yml`): unified entry point for ChatGPT topic imports and Codex readiness/bridge sweeps. Use the [Agent task issue template][agent-task-template] (auto-labels `agents` + `agent:codex`) to raise work for Codex; the intake workflow handles both label-triggered bridges and manual dispatch while keeping parsing and bridge logic centralised.
- Codex belt automation (`agents-71-codex-belt-dispatcher.yml`, `agents-72-codex-belt-worker.yml`, `agents-73-codex-belt-conveyor.yml`): hands-off conveyor for labelled issues—dispatcher selects `agent:codex` + `status:ready` issues and prepares a `codex/issue-*` branch, worker opens or refreshes the PR with labels/assignees, and conveyor merges after Gate success before re-queuing the dispatcher.
Expand Down
66 changes: 66 additions & 0 deletions .github/workflows/agents-model-profile-trial.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: Agents Model Profile Trial

on:
workflow_dispatch:
inputs:
trial_id:
description: Frozen Orchestrator trial identifier.
required: true
type: string
request_id:
description: Replay-stable request identifier from the trial bridge.
required: true
type: string
request_hash:
description: Replay hash of the exact bridge request.
required: true
type: string
trial_run_id:
description: Unique worker run identifier for this arm.
required: true
type: string
profile_id:
description: Exact Sol, Terra, or Luna execution profile ID.
required: true
type: choice
options:
- codex-5.6-sol-high
- codex-5.6-terra-high
- codex-5.6-luna-high
packet_hash:
description: SHA-256 identity of the frozen common task packet.
required: true
type: string
launch_ordinal:
description: Randomized arm launch position, from 1 through 3.
required: true
type: choice
options:
- "1"
- "2"
- "3"
expected_source_sha:
description: Full immutable Workflows source SHA for this arm.
required: true
type: string

permissions:
contents: read

jobs:
trial:
uses: stranske/Workflows/.github/workflows/reusable-model-profile-trial.yml@822e323eefba3edb640e0bd9c922caec6fffee65
permissions:
contents: read
with:
trial_id: ${{ inputs.trial_id }}
request_id: ${{ inputs.request_id }}
request_hash: ${{ inputs.request_hash }}
trial_run_id: ${{ inputs.trial_run_id }}
profile_id: ${{ inputs.profile_id }}
packet_hash: ${{ inputs.packet_hash }}
launch_ordinal: ${{ fromJSON(inputs.launch_ordinal) }}
expected_source_sha: ${{ inputs.expected_source_sha }}
runner_sha: 822e323eefba3edb640e0bd9c922caec6fffee65
secrets:
CODEX_AUTH_JSON: ${{ secrets.CODEX_AUTH_JSON }}
Loading
Loading