| """Trace & stats sharing: the promote (stats vs full), lenient validation + |
| completeness, idempotent stats->full upgrade, listing/detail, and the project |
| token aggregate (including null/coverage handling). All over the FakeHub.""" |
| from __future__ import annotations |
|
|
| from app.frontmatter import serialise |
| from fakes import seed_agent |
|
|
|
|
| CC_USAGE = { |
| "input_tokens": 1000, |
| "output_tokens": 200, |
| "cache_read_tokens": 5000, |
| "cache_creation_tokens": 300, |
| "total_tokens": 6500, |
| } |
|
|
|
|
| def _manifest( |
| *, |
| session_id="sess-1", |
| harness="claude-code", |
| model="claude-opus-4-8", |
| usage=CC_USAGE, |
| tool_calls=18, |
| body="Swept BPE vocab; 32k won.", |
| **extra, |
| ): |
| fm = { |
| "schema_version": 1, |
| "harness": harness, |
| "session_id": session_id, |
| "model": model, |
| "started_at": "2026-06-25T13:50:11Z", |
| "ended_at": "2026-06-25T14:30:11Z", |
| } |
| if usage is not None: |
| fm["usage"] = usage |
| if tool_calls is not None: |
| fm["activity"] = {"tool_calls": tool_calls, "tool_calls_by_name": {"Bash": tool_calls}} |
| fm.update(extra) |
| return serialise(fm, body) |
|
|
|
|
| def _write_bundle( |
| env, |
| *, |
| agent="agent-1", |
| session="sess-1", |
| manifest=None, |
| log=None, |
| log_name="session.jsonl", |
| ): |
| """Stage a bundle in the agent's own scratch bucket; return its source URI dir.""" |
| seed_agent(env.hub, agent) |
| bucket = env.settings.agent_bucket(agent) |
| env.hub.write_text_to_bucket( |
| bucket, f"traces/{session}/manifest.md", manifest if manifest is not None else _manifest(session_id=session) |
| ) |
| if log is not None: |
| env.hub.write_bytes_to_bucket(bucket, f"traces/{session}/{log_name}", log) |
| return f"hf://buckets/{bucket}/traces/{session}" |
|
|
|
|
| def _central(env): |
| return env.hub.buckets[env.settings.central_bucket] |
|
|
|
|
| |
|
|
| def test_stats_promote_writes_manifest_only(env): |
| |
| src = _write_bundle(env, manifest=_manifest(), log=b'{"type":"user"}\n') |
| r = env.client.post("/v1/traces", json={"source": src}) |
| assert r.status_code == 201 |
| body = r.json() |
| assert body["share"] == "stats" |
| assert body["files_copied"] == 0 |
| assert body["completeness"] == "full" |
| assert body["path"] == "traces/agent-1/sess-1/" |
|
|
| central = _central(env) |
| assert "traces/agent-1/sess-1/manifest.md" in central |
| assert "traces/agent-1/sess-1/session.jsonl" not in central |
| |
| assert "agent: agent-1" in central["traces/agent-1/sess-1/manifest.md"].decode() |
| assert "via: bucket" in central["traces/agent-1/sess-1/manifest.md"].decode() |
|
|
|
|
| def test_full_promote_hash_copies_the_log(env): |
| src = _write_bundle( |
| env, |
| manifest=_manifest(native_log_file="session.jsonl"), |
| log=b'{"type":"user"}\n{"type":"assistant"}\n', |
| ) |
| r = env.client.post("/v1/traces", json={"source": src, "share": "full"}) |
| assert r.status_code == 201 |
| body = r.json() |
| assert body["share"] == "full" |
| assert body["files_copied"] == 1 |
| assert body["bytes_copied"] > 0 |
|
|
| central = _central(env) |
| assert "traces/agent-1/sess-1/session.jsonl" in central |
| |
| assert "promoted_at:" in central["traces/agent-1/sess-1/manifest.md"].decode() |
|
|
|
|
| def test_full_promote_requires_declared_log_file(env): |
| src = _write_bundle(env, manifest=_manifest(), log=b"{}\n") |
| r = env.client.post("/v1/traces", json={"source": src, "share": "full"}) |
| assert r.status_code == 400 |
| assert r.json()["error"]["code"] == "INVALID_FRONTMATTER" |
|
|
|
|
| def test_full_promote_copies_only_declared_log_file(env): |
| src = _write_bundle( |
| env, |
| manifest=_manifest(native_log_file="session.jsonl"), |
| log=b'{"current":true}\n', |
| ) |
| bucket = env.settings.agent_bucket("agent-1") |
| env.hub.write_bytes_to_bucket(bucket, "traces/sess-1/stale.jsonl", b'{"stale":true}\n') |
|
|
| r = env.client.post("/v1/traces", json={"source": src, "share": "full"}) |
| assert r.status_code == 201 |
| assert r.json()["files_copied"] == 1 |
|
|
| central = _central(env) |
| assert "traces/agent-1/sess-1/session.jsonl" in central |
| assert "traces/agent-1/sess-1/stale.jsonl" not in central |
|
|
|
|
| def test_default_share_is_stats(env): |
| src = _write_bundle(env, manifest=_manifest()) |
| r = env.client.post("/v1/traces", json={"source": src}) |
| assert r.json()["share"] == "stats" |
|
|
|
|
| |
|
|
| def test_missing_required_fields_rejected(env): |
| bad = serialise({"harness": "claude-code"}, "no schema_version or session_id") |
| src = _write_bundle(env, manifest=bad) |
| r = env.client.post("/v1/traces", json={"source": src}) |
| assert r.status_code == 400 |
| assert r.json()["error"]["code"] == "INVALID_FRONTMATTER" |
|
|
|
|
| def test_negative_token_rejected(env): |
| bad = _manifest(usage={"total_tokens": -5}) |
| src = _write_bundle(env, manifest=bad) |
| r = env.client.post("/v1/traces", json={"source": src}) |
| assert r.status_code == 400 |
|
|
|
|
| def test_fractional_token_rejected(env): |
| bad = _manifest(usage={"total_tokens": 12.7}) |
| src = _write_bundle(env, manifest=bad) |
| r = env.client.post("/v1/traces", json={"source": src}) |
| assert r.status_code == 400 |
|
|
|
|
| def test_bad_timestamp_rejected(env): |
| bad = _manifest(started_at="not-a-date") |
| src = _write_bundle(env, manifest=bad) |
| r = env.client.post("/v1/traces", json={"source": src}) |
| assert r.status_code == 400 |
|
|
|
|
| def test_missing_manifest_rejected(env): |
| seed_agent(env.hub, "agent-1") |
| bucket = env.settings.agent_bucket("agent-1") |
| env.hub.write_bytes_to_bucket(bucket, "traces/sess-1/session.jsonl", b"{}\n") |
| r = env.client.post( |
| "/v1/traces", json={"source": f"hf://buckets/{bucket}/traces/sess-1"} |
| ) |
| assert r.status_code == 400 |
|
|
|
|
| def test_unknown_harness_is_partial_but_accepted(env): |
| |
| m = _manifest(harness="cursor", usage=None, tool_calls=None) |
| src = _write_bundle(env, manifest=m) |
| r = env.client.post("/v1/traces", json={"source": src}) |
| assert r.status_code == 201 |
| assert r.json()["completeness"] == "partial" |
|
|
|
|
| def test_known_harness_without_tool_calls_is_partial(env): |
| m = _manifest(tool_calls=None) |
| src = _write_bundle(env, manifest=m) |
| assert env.client.post("/v1/traces", json={"source": src}).json()["completeness"] == "partial" |
|
|
|
|
| |
|
|
| def test_not_registered_rejected(env): |
| bucket = env.settings.agent_bucket("ghost") |
| env.hub.write_text_to_bucket(bucket, "traces/s/manifest.md", _manifest(session_id="s")) |
| r = env.client.post("/v1/traces", json={"source": f"hf://buckets/{bucket}/traces/s"}) |
| assert r.status_code == 404 |
| assert r.json()["error"]["code"] == "NOT_REGISTERED" |
|
|
|
|
| def test_source_outside_own_bucket_rejected(env): |
| seed_agent(env.hub, "agent-1") |
| |
| r = env.client.post( |
| "/v1/traces", |
| json={"source": "hf://buckets/other-org/test-agent-1/traces/s"}, |
| ) |
| assert r.status_code == 400 |
| assert r.json()["error"]["code"] == "INVALID_PATH" |
|
|
|
|
| def test_source_must_be_traces_session_dir(env): |
| seed_agent(env.hub, "agent-1") |
| bucket = env.settings.agent_bucket("agent-1") |
| env.hub.write_text_to_bucket(bucket, "scratch/sess-1/manifest.md", _manifest()) |
| r = env.client.post( |
| "/v1/traces", json={"source": f"hf://buckets/{bucket}/scratch/sess-1"} |
| ) |
| assert r.status_code == 400 |
| assert r.json()["error"]["code"] == "INVALID_PATH" |
|
|
|
|
| def test_manifest_session_must_match_source_dir(env): |
| bad = _manifest(session_id="other-session") |
| src = _write_bundle(env, session="sess-1", manifest=bad) |
| r = env.client.post("/v1/traces", json={"source": src}) |
| assert r.status_code == 400 |
| assert r.json()["error"]["code"] == "INVALID_PATH" |
|
|
|
|
| def test_stats_then_full_upgrade(env): |
| |
| src1 = _write_bundle(env, manifest=_manifest()) |
| assert env.client.post("/v1/traces", json={"source": src1}).json()["files_copied"] == 0 |
| |
| bucket = env.settings.agent_bucket("agent-1") |
| env.hub.write_text_to_bucket( |
| bucket, |
| "traces/sess-1/manifest.md", |
| _manifest(native_log_file="session.jsonl"), |
| ) |
| env.hub.write_bytes_to_bucket( |
| bucket, "traces/sess-1/session.jsonl", b"{}\n" |
| ) |
| src2 = f"hf://buckets/{env.settings.agent_bucket('agent-1')}/traces/sess-1" |
| r = env.client.post("/v1/traces", json={"source": src2, "share": "full"}) |
| assert r.status_code == 201 |
| assert r.json()["files_copied"] == 1 |
| assert "traces/agent-1/sess-1/session.jsonl" in _central(env) |
| detail = env.client.get("/v1/traces/agent-1/sess-1").json() |
| assert detail["log_files"] == ["traces/agent-1/sess-1/session.jsonl"] |
|
|
|
|
| |
|
|
| def test_list_and_detail(env): |
| env.client.post( |
| "/v1/traces", |
| json={ |
| "source": _write_bundle( |
| env, |
| manifest=_manifest(native_log_file="session.jsonl"), |
| log=b"{}\n", |
| ), |
| "share": "full", |
| }, |
| ) |
|
|
| lst = env.client.get("/v1/traces?expand=true").json() |
| assert lst["count"] == 1 and lst["matched"] == 1 |
| item = lst["items"][0] |
| assert item["agent"] == "agent-1" and item["session_id"] == "sess-1" |
| assert item["total_tokens"] == 6500 and item["tool_calls"] == 18 |
| assert item["harness"] == "claude-code" |
| assert "Swept BPE" in item["summary_excerpt"] |
| assert item["primary_log_file"] == "traces/agent-1/sess-1/session.jsonl" |
|
|
| detail = env.client.get("/v1/traces/agent-1/sess-1").json() |
| assert detail["frontmatter"]["usage"]["total_tokens"] == 6500 |
| assert "Swept BPE" in detail["body"] |
| assert detail["log_files"] == ["traces/agent-1/sess-1/session.jsonl"] |
|
|
|
|
| def test_list_filters_by_harness(env): |
| env.client.post("/v1/traces", json={"source": _write_bundle(env, agent="agent-1", session="a", manifest=_manifest(session_id="a", harness="claude-code"))}) |
| env.client.post("/v1/traces", json={"source": _write_bundle(env, agent="agent-2", session="b", manifest=_manifest(session_id="b", harness="codex"))}) |
| cc = env.client.get("/v1/traces?harness=claude-code&expand=true").json() |
| assert cc["count"] == 2 and cc["matched"] == 1 |
| assert cc["items"][0]["harness"] == "claude-code" |
|
|
|
|
| def test_detail_not_found(env): |
| assert env.client.get("/v1/traces/agent-1/nope").status_code == 404 |
|
|
|
|
| |
|
|
| def test_stats_aggregate_sums_and_counts_coverage(env): |
| |
| env.client.post("/v1/traces", json={"source": _write_bundle(env, agent="agent-1", session="a", manifest=_manifest(session_id="a"))}) |
| env.client.post("/v1/traces", json={"source": _write_bundle(env, agent="agent-2", session="b", manifest=_manifest(session_id="b", harness="cursor", usage=None, tool_calls=None))}) |
|
|
| s = env.client.get("/v1/stats").json() |
| assert s["tokens"]["total"] == 6500 |
| assert s["tokens"]["cache_read"] == 5000 |
| assert s["sessions_counted"] == 1 |
| assert s["sessions_missing_tokens"] == 1 |
| assert s["agents_reporting"] == 2 |
| assert s["by_agent"]["agent-1"]["total"] == 6500 |
| assert s["by_model"]["claude-opus-4-8"]["total"] == 6500 |
| assert s["by_day"]["2026-06-25"]["total"] == 6500 |
|
|
|
|
| def test_stats_empty(env): |
| s = env.client.get("/v1/stats").json() |
| assert s["tokens"]["total"] == 0 |
| assert s["sessions_counted"] == 0 and s["agents_reporting"] == 0 |
|
|
|
|
| def test_cost_summed_when_present(env): |
| env.client.post("/v1/traces", json={"source": _write_bundle(env, manifest=_manifest(cost_usd=4.0))}) |
| assert env.client.get("/v1/stats").json()["cost_usd"] == 4.0 |
|
|