Add harness.agent-dev-local 1.1.0 metered-owner candidate (GLAS-WP-0012-T03)
All checks were successful
ci / validate (push) Successful in 1m5s

Unverified bounded-proof profile for rein-aharness metered-once: bwrap-local
with empty egress, no credential routes, 900 s / 60k tokens, 30 turns and a
USD 5.00 native cap matching the accepted spend envelope. 1.0.0 stays
blocked; unpinned selection becomes ambiguous. 134 tests pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 272244@bnt-lap001
Assistant-Session: c8962fa7-b290-47df-865f-403ddb6c77e9
This commit is contained in:
tegwick 2026-09-21 23:06:42 +02:00
parent f08ecc35e5
commit 462436b611
3 changed files with 69 additions and 6 deletions

View file

@ -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.

View file

@ -67,18 +67,19 @@ def test_committed_catalog_resolves_both_constellations() -> None:
contexts = catalog.validate_all() contexts = catalog.validate_all()
assert len(contexts) == 3 assert len(contexts) == 4
assert {context.rein_id for context in contexts} == { assert {context.rein_id for context in contexts} == {
"rein-aharness", "rein-aharness",
"rein-openweights", "rein-openweights",
} }
assert { assert {
(context.profile.id, context.operational_readiness.status) (context.profile.id, context.profile.version, context.operational_readiness.status)
for context in contexts for context in contexts
} == { } == {
("harness.agent-dev-local", "blocked"), ("harness.agent-dev-local", "1.0.0", "blocked"),
("harness.agent-dev-openweights-local", "blocked"), ("harness.agent-dev-local", "1.1.0", "unverified"),
("harness.agent-dev", "unverified"), ("harness.agent-dev-openweights-local", "1.0.0", "blocked"),
("harness.agent-dev", "1.0.0", "unverified"),
} }
profile, descriptor = catalog.resolve( profile, descriptor = catalog.resolve(
"harness.agent-dev-openweights-local@1.0.0" "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 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: def test_ready_profile_requires_an_evidence_reference(tmp_path) -> None:
profiles = tmp_path / "profiles" profiles = tmp_path / "profiles"
reins = tmp_path / "reins" reins = tmp_path / "reins"

View file

@ -105,7 +105,7 @@ See docs/local-profile-acceptance.md.
```task ```task
id: GLAS-WP-0012-T03 id: GLAS-WP-0012-T03
status: wait status: progress
priority: high priority: high
state_hub_task_id: "c660808a-1724-555c-bc59-7318870d3591" 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 owner, the focused tests and full suite pass, and rollback to the blocked
`harness.agent-dev-local@1.0.0` pin is documented. `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 ## Prove one real bounded rein task inside the sandbox
```task ```task