feat: instance manifest, tool profiles, metrics, and budget enforcement
Land HARNESS-WP-0001 T01/T02/T04/T05: extend ADR-005 schedule.yml with harness fields, named tool-profile registry, ADR-004 metrics writes, and BudgetTracker wiring. CLI gains validate/profiles; task-file path kept.
This commit is contained in:
parent
16f5c29c08
commit
4144eba160
17 changed files with 1387 additions and 60 deletions
|
|
@ -52,3 +52,48 @@ def close_task(task_id: str) -> bool:
|
|||
return True
|
||||
except httpx.HTTPError:
|
||||
return False
|
||||
|
||||
|
||||
def post_token_event(
|
||||
repo: str,
|
||||
tokens: int,
|
||||
*,
|
||||
budget: int | None = None,
|
||||
agent: str | None = None,
|
||||
ok: bool = True,
|
||||
detail: dict[str, Any] | None = None,
|
||||
) -> bool:
|
||||
"""Best-effort token cost event for the hub Token Cost dashboard.
|
||||
|
||||
Schema is intentionally loose: if the hub rejects the payload we
|
||||
swallow the error so a metrics-schema drift never fails a run.
|
||||
"""
|
||||
payload: dict[str, Any] = {
|
||||
"repo": repo,
|
||||
"tokens": tokens,
|
||||
"source": "agent-harness",
|
||||
"ok": ok,
|
||||
}
|
||||
if budget is not None:
|
||||
payload["budget"] = budget
|
||||
if agent is not None:
|
||||
payload["agent"] = agent
|
||||
if detail:
|
||||
payload["detail"] = detail
|
||||
try:
|
||||
resp = httpx.post(
|
||||
f"{_base_url()}/token-events/upsert",
|
||||
json=payload,
|
||||
timeout=_TIMEOUT,
|
||||
)
|
||||
if resp.status_code >= 400:
|
||||
# Fallback shape used by some hub builds
|
||||
resp = httpx.post(
|
||||
f"{_base_url()}/token-events/",
|
||||
json=payload,
|
||||
timeout=_TIMEOUT,
|
||||
)
|
||||
resp.raise_for_status()
|
||||
return True
|
||||
except httpx.HTTPError:
|
||||
return False
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue