diff --git a/profiles/harness.agent-dev-local-1.1.0.yaml b/profiles/harness.agent-dev-local-1.1.0.yaml new file mode 100644 index 0000000..f8665ab --- /dev/null +++ b/profiles/harness.agent-dev-local-1.1.0.yaml @@ -0,0 +1,35 @@ +id: harness.agent-dev-local +version: "1.1.0" +contract_version: "1.0" +status: enabled +operational_readiness: + status: unverified + reason: bounded GLAS-WP-0012-T04 proof candidate; no positive real-run evidence yet + owner: glas-harness + evidence_ref: GLAS-WP-0012-T03 +rein: + id: rein-aharness + required_capabilities: + session_style: unattended + model_class: frontier +sandbox_profile: profile.bwrap-local +tool_profile: green-commit-only +model: + provider: anthropic + model: claude-sonnet-4-6 + model_class: frontier + route: claude-code-cli +limits: + budget_tokens: 60000 + timeout_seconds: 900 + max_turns: 30 + max_budget_usd: 5.0 +credential_route_refs: [] +metadata: + latency_class: fast + stream_tool_events: true + # Candidate for the metered one-cycle owner (rein-aharness metered-once). + # The provider key stays with MessagesOwner outside bwrap; the workload gets + # only an owner-socket route, so the sandbox keeps empty egress and no + # credential route refs. max_budget_usd matches the accepted spend envelope + # hfact-glas-anthropic-2026-09 (infd-20260921-b01). Rollback: pin 1.0.0. diff --git a/tests/test_profiles.py b/tests/test_profiles.py index d3c6957..5cb22d7 100644 --- a/tests/test_profiles.py +++ b/tests/test_profiles.py @@ -67,18 +67,19 @@ def test_committed_catalog_resolves_both_constellations() -> None: contexts = catalog.validate_all() - assert len(contexts) == 3 + assert len(contexts) == 4 assert {context.rein_id for context in contexts} == { "rein-aharness", "rein-openweights", } assert { - (context.profile.id, context.operational_readiness.status) + (context.profile.id, context.profile.version, context.operational_readiness.status) for context in contexts } == { - ("harness.agent-dev-local", "blocked"), - ("harness.agent-dev-openweights-local", "blocked"), - ("harness.agent-dev", "unverified"), + ("harness.agent-dev-local", "1.0.0", "blocked"), + ("harness.agent-dev-local", "1.1.0", "unverified"), + ("harness.agent-dev-openweights-local", "1.0.0", "blocked"), + ("harness.agent-dev", "1.0.0", "unverified"), } profile, descriptor = catalog.resolve( "harness.agent-dev-openweights-local@1.0.0" @@ -98,6 +99,21 @@ def test_committed_catalog_resolves_both_constellations() -> None: assert rein.budget_tokens == 60000 +def test_metered_candidate_carries_native_limits_and_no_credential_route() -> None: + catalog = ProfileCatalog() + profile, _ = catalog.resolve("harness.agent-dev-local@1.1.0") + catalog.require_operational(profile) + assert profile.operational_readiness.status == "unverified" + assert profile.sandbox_profile == "profile.bwrap-local" + assert profile.credential_route_refs == [] + assert profile.limits.max_turns == 30 + assert profile.limits.max_budget_usd == 5.0 + assert profile.limits.timeout_seconds == 900 + assert profile.limits.budget_tokens == 60000 + with pytest.raises(AmbiguousProfileError): + catalog.resolve("harness.agent-dev-local") + + def test_ready_profile_requires_an_evidence_reference(tmp_path) -> None: profiles = tmp_path / "profiles" reins = tmp_path / "reins" diff --git a/workplans/GLAS-WP-0012-first-local-profile-production-proof.md b/workplans/GLAS-WP-0012-first-local-profile-production-proof.md index 59326a0..513b3a1 100644 --- a/workplans/GLAS-WP-0012-first-local-profile-production-proof.md +++ b/workplans/GLAS-WP-0012-first-local-profile-production-proof.md @@ -105,7 +105,7 @@ See docs/local-profile-acceptance.md. ```task id: GLAS-WP-0012-T03 -status: wait +status: progress priority: high state_hub_task_id: "c660808a-1724-555c-bc59-7318870d3591" ``` @@ -126,6 +126,18 @@ Done when the exact candidate resolves, the real runtime starts through its owner, the focused tests and full suite pass, and rollback to the blocked `harness.agent-dev-local@1.0.0` pin is documented. +2026-09-21 candidate: `profiles/harness.agent-dev-local-1.1.0.yaml`, readiness +`unverified` (evidence_ref GLAS-WP-0012-T03), `profile.bwrap-local`, no +credential route refs, claude-sonnet-4-6, 900 s / 60,000 tokens, max_turns 30, +max_budget_usd 5.0. The provider key stays with rein-aharness MessagesOwner +outside bwrap (metered-once); the owner bootstrap's sandbox, model and +credential-route checks accept it. max_budget_usd matches the operator-accepted +spend envelope hfact-glas-anthropic-2026-09 (Informed Decision +infd-20260921-b01, approval ba5ce2d8). Unpinned selection is now ambiguous and +1.0.0 stays blocked; rollback is pinning 1.0.0. 134 tests pass. Remaining for +done: the rebuilt runtime artifact carrying this profile starts through its +owner on railiance01 (SECRETS-WP-0009-T03 step B2). + ## Prove one real bounded rein task inside the sandbox ```task