ouroboros/tests/test_acceptance_fixround.py
Ouroboros 3182e44ca1 Read a relocated chapter exactly as the monolith it came out of
The split left every full-book reader pointing at what is now a membership
page. `load_governance_doc` returned 1,744 chars of orientation where the
triad, preflight, scope and plan-review prompts believed they had the
architecture map, and nothing caught it: those surfaces are covered on
synthetic `tmp_path` corpora, so the loss only shows in production packs.
`load_governance_doc` now composes a book entrypoint, and an unassemblable
book is a named omission rather than a page that reads like a delivered book.

The canonical-five list had four hand-maintained copies. It has one owner now
(`review_helpers.CANONICAL_GOVERNANCE_DOCS`) with two predicates beside it:
`is_canonical_governance_path`, which answers for a chapter exactly as it
answers for its entrypoint, and `canonical_governance_sources`, which resolves
the population of an actual tree so a pack that inlined a composed book does
not also owe its chapters as separate snapshots. `reference_books.book_path_role`
and `book_entrypoint_for` are the pure path-shape question underneath, so no
consumer carries a list of 27 filenames that goes stale the next time a book
gains or splits a chapter. Without this, a commit touching
`docs/development/06-rules-by-change-class.md` would have stopped being
canonical-doc work: degradable to diff-only in the scope ladder, and an
ordinary changed file to the atlas.

Three more consequences of the same fact:

* the triad pack's duplicate suppression asks the byte-identity question of a
  MEMBER — a touched chapter is withheld when its current bytes already sit in
  the composed copy the prefix carries, and a chapter edited after the prefix
  was rendered keeps its full text;
* the new-module documentation gate accepts any staged source of the
  Architecture book. A new module is documented in the chapter that owns its
  subsystem, and demanding an entrypoint edit would only buy a membership-list
  touch that documents nothing;
* untruncated repository reads take `UNTRUNCATED_REPO_READ_PREFIXES` (prompts
  plus the two chapter directories) rather than a chapter list. Four chapters
  exceed the 80,000-char `read_file` result cap, and a silently capped chapter
  is a partial governance source that reads like a complete one.

Test side: `tests/_governance_docs_shared.py` is the one reader tests use for a
governance document's complete text. Sixteen suites read an entrypoint with
`Path.read_text()` and asserted body prose; two of them PASSED while testing
nothing, because their pins are negatives. The atlas drift guard over three
synchronized canonical lists becomes an identity guard over the one owner, and
the retired-timeout grep allowlists a book rather than a filename.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-15 19:20:44 +03:00

790 lines
33 KiB
Python

"""Focused regressions for the first P3 acceptance-packet fix round."""
import json
from pathlib import Path
from types import SimpleNamespace
import pytest
from tests._governance_docs_shared import architecture_text, development_text
def test_prompt_projection_keeps_panels_ahead_of_an_oversized_lens():
from ouroboros.review_evidence import format_review_evidence_for_prompt
rendered = format_review_evidence_for_prompt(
{"has_evidence": True, "task_id": "task-panel", "oversized_lens": "L" * 30_000},
max_chars=1_100,
acceptance_panels=[{
"panel_id": "panel-must-survive",
"surface": "task_acceptance",
"aggregate_signal": "PASS",
"transport_status": "success",
"parse_status": "valid",
"reason": "deciding finding " + "R" * 1_000,
"actors": [{
"slot_id": "slot_1",
"response_ref": {"call_id": "response-must-survive"},
}],
}, {
"panel_id": "panel-dropped-whole",
"surface": "task_acceptance",
"aggregate_signal": "PASS",
"reason": "trailing record " + "T" * 1_000,
}],
)
assert rendered.startswith("TASK ACCEPTANCE PANELS:")
assert "panel-must-survive" in rendered
assert '"aggregate_signal": "PASS"' in rendered
assert "deciding finding" in rendered
assert '"reason_omitted_chars"' in rendered
assert "response-must-survive" in rendered
panel_json = rendered.split("\n\n", 1)[0].split("\n", 1)[1]
panel_projection = json.loads(panel_json)
assert panel_projection["records"][0]["panel_id"] == "panel-must-survive"
assert panel_projection["records_omitted"] == 1
assert "panel-dropped-whole" not in rendered
assert "OMISSION NOTE" in rendered
assert "canonical source_ref" in rendered
assert '"reader": "get_task_result"' in rendered
def test_partial_trajectory_is_non_resolving_but_complete_trajectory_resolves():
from ouroboros.review_dispatch import task_acceptance_zero_physical_refusal
from ouroboros.review_evidence import annotate_criteria_evidence_resolution
from ouroboros.review_evidence_refs import acceptance_evidence_ref_vocabulary
from ouroboros.review_substrate import task_acceptance_is_clean
def _actor():
return {
"signal": "PASS",
"parsed": {
"outcome_tier": "solved",
"criteria_used": [{
"criterion": "tool outcome",
"status": "supported",
"evidence_refs": ["tool_trajectory"],
}],
},
}
def _result(actor):
return SimpleNamespace(
aggregate_signal="PASS", degraded=False, actors=[actor],
)
partial = {
"tool_trajectory": [{"tool": "read_file", "result_complete": False}],
"__provenance__": {"tool_trajectory": "tool_result"},
}
partial_actor = _actor()
annotate_criteria_evidence_resolution([partial_actor], partial)
assert task_acceptance_zero_physical_refusal(partial) == {}
assert acceptance_evidence_ref_vocabulary(partial)["tool_trajectory"] == "partial"
assert task_acceptance_is_clean(_result(partial_actor)) is False
complete = {
"tool_trajectory": [{"tool": "read_file", "result_complete": True}],
"__provenance__": {"tool_trajectory": "tool_result"},
}
complete_actor = _actor()
annotate_criteria_evidence_resolution([complete_actor], complete)
assert acceptance_evidence_ref_vocabulary(complete)["tool_trajectory"] == "packet_section"
assert task_acceptance_is_clean(_result(complete_actor)) is True
def test_budget_truncated_repo_diff_cannot_resolve_clean_acceptance():
from ouroboros.review_evidence import (
_accept_enforce_budget,
annotate_criteria_evidence_resolution,
)
from ouroboros.review_evidence_refs import acceptance_evidence_ref_vocabulary
from ouroboros.review_substrate import task_acceptance_is_clean
packet = _accept_enforce_budget({
"repo_diff": "diff --git a/a b/a\n" + "x" * 50_000,
"repo_diff_source_ref": {"task_id": "task-diff", "artifact": "repo_diff.patch"},
"__provenance__": {"repo_diff": "host_attested"},
}, budget=25_000)
actor = {
"signal": "PASS",
"parsed": {"outcome_tier": "solved", "criteria_used": [{
"criterion": "the patch is correct", "status": "supported",
"evidence_refs": ["repo_diff"],
}]},
}
annotate_criteria_evidence_resolution([actor], packet)
assert packet["repo_diff_complete"] is False
assert acceptance_evidence_ref_vocabulary(packet)["repo_diff"] == "partial"
result = SimpleNamespace(aggregate_signal="PASS", degraded=False, actors=[actor])
assert task_acceptance_is_clean(result) is False
def test_leading_trajectory_omission_from_packet_producer_cannot_resolve_clean(tmp_path):
from ouroboros.review_dispatch import task_acceptance_zero_physical_refusal
from ouroboros.review_evidence import (
_ACCEPT_TRAJECTORY_MAX_CALLS,
annotate_criteria_evidence_resolution,
build_task_acceptance_evidence,
)
from ouroboros.review_evidence_refs import acceptance_evidence_ref_vocabulary
from ouroboros.review_substrate import task_acceptance_is_clean
from ouroboros.tools.registry import ToolContext
ctx = ToolContext(repo_dir=tmp_path, drive_root=tmp_path, task_id="task-traj")
packet = build_task_acceptance_evidence(
ctx, drive_root=tmp_path, task_id="task-traj",
llm_trace={"tool_calls": [
{"tool": "read_file", "status": "ok", "result": str(index)}
for index in range(_ACCEPT_TRAJECTORY_MAX_CALLS + 1)
]},
)
actor = {
"signal": "PASS",
"parsed": {"outcome_tier": "solved", "criteria_used": [{
"criterion": "the execution was sound", "status": "supported",
"evidence_refs": ["tool_trajectory"],
}]},
}
annotate_criteria_evidence_resolution([actor], packet)
assert packet["tool_trajectory_omitted_leading"] == 1
partial = next(
row for row in packet["__unresolved_partial_artifacts__"]
if row["tool"] == "tool_trajectory"
)
assert partial["status"] == "not_materialized_for_reviewer"
assert partial["source_ref"] == packet["tool_trajectory_source_ref"]
assert partial["source_ref"]["root"] == "artifact_store"
assert partial["source_ref"]["reader"] == "read_file"
assert task_acceptance_zero_physical_refusal(packet) == {}
assert acceptance_evidence_ref_vocabulary(packet)["tool_trajectory"] == "partial"
result = SimpleNamespace(aggregate_signal="PASS", degraded=False, actors=[actor])
assert task_acceptance_is_clean(result) is False
def test_omitted_trajectory_corpus_round_trips_through_artifact_reader(tmp_path, monkeypatch):
from ouroboros import artifacts
from ouroboros.review_evidence import _ACCEPT_TRAJECTORY_MAX_CALLS, build_task_acceptance_evidence
from ouroboros.tools.core import _read_file
from ouroboros.tools.registry import ToolContext
calls = [
{"tool": "read_file", "status": "ok", "args": {"path": f"file-{index}"}, "result": str(index)}
for index in range(_ACCEPT_TRAJECTORY_MAX_CALLS + 1)
]
ctx = ToolContext(repo_dir=tmp_path, drive_root=tmp_path, task_id="trajectory-corpus")
packet = build_task_acceptance_evidence(
ctx, drive_root=tmp_path, task_id=ctx.task_id, llm_trace={"tool_calls": calls},
)
ref = packet["tool_trajectory_source_ref"]
assert ref["root"] == "artifact_store"
assert ref["artifact_ref"].startswith(f"artifact_store:{ref['path']}#chars=0-")
rendered = _read_file(ctx, root=ref["root"], path=ref["path"])
recovered = json.loads(rendered.split("\n", 1)[1])
assert recovered == calls
partial = next(
row for row in packet["__unresolved_partial_artifacts__"]
if row["tool"] == "tool_trajectory"
)
assert partial["status"] == "not_materialized_for_reviewer"
assert partial["source_ref"] == ref
recapped = build_task_acceptance_evidence(
ctx, drive_root=tmp_path, task_id=ctx.task_id,
llm_trace={"tool_calls": [
{"tool": "run_command", "status": "ok", "result": str(index) * 10_000}
for index in range(2)
]},
budget_chars=5_000,
)
assert all(row["result_complete"] is False for row in recapped["tool_trajectory"])
assert {
row["status"] for row in recapped["__unresolved_partial_artifacts__"]
if row["tool"] == "run_command"
} == {"not_materialized_for_reviewer"}
assert recapped["tool_trajectory_source_ref"]["root"] == "artifact_store"
monkeypatch.setattr(
artifacts, "store_actor_source_bytes",
lambda *_a, **_k: (_ for _ in ()).throw(OSError("artifact store unavailable")),
)
unavailable_root = tmp_path / "unavailable"
unavailable_ctx = ToolContext(
repo_dir=tmp_path, drive_root=unavailable_root, task_id="trajectory-unavailable",
)
unavailable = build_task_acceptance_evidence(
unavailable_ctx, drive_root=unavailable_root, task_id=unavailable_ctx.task_id,
llm_trace={"tool_calls": calls},
)
missing = next(
row for row in unavailable["__unresolved_partial_artifacts__"]
if row["tool"] == "tool_trajectory"
)
assert "tool_trajectory_source_ref" not in unavailable
assert missing["status"] == "source_unavailable"
assert missing["source_ref"] == {}
def _trajectory_packet(tmp_path, calls, *, indices=None, budget=0):
from ouroboros.review_evidence import build_task_acceptance_evidence
return build_task_acceptance_evidence(
SimpleNamespace(task_contract={}, task_metadata={}, repo_dir=None),
drive_root=tmp_path, task_id="selected-trajectory", llm_trace={"tool_calls": calls},
agent_evidence={"tool_trajectory_indices": indices} if indices is not None else None,
budget_chars=budget,
)
def test_selected_old_record_resolves_only_after_source_materialization(tmp_path):
from ouroboros import artifacts
from ouroboros.review_evidence import annotate_criteria_evidence_resolution, task_acceptance_evidence_revision
from ouroboros.review_evidence_refs import acceptance_evidence_ref_vocabulary, trajectory_record_ref
from ouroboros.review_substrate import task_acceptance_is_clean
exact, ref, issue = artifacts.persist_exact_text_source(
tmp_path, "selected-trajectory", source_id="old-output", text="retained evidence " * 2000)
assert not issue
calls = [{"tool": "run_command", "args": {"cmd": "argument " * 400},
"result": "preview", "result_partial": True, "result_source_ref": ref},
*[{"tool": "read_file", "result": str(i)} for i in range(120)]]
baseline = _trajectory_packet(tmp_path, calls)
old_ref = trajectory_record_ref(baseline["tool_trajectory_source_ref"], 0)
assert old_ref not in acceptance_evidence_ref_vocabulary(baseline)
packet = _trajectory_packet(tmp_path, calls, indices=[0, 0])
assert task_acceptance_evidence_revision(packet) == task_acceptance_evidence_revision(baseline)
assert packet["tool_trajectory_omitted_leading"] == 1
assert packet["tool_trajectory_complete"] is False
assert len(packet["tool_trajectory_selected"]) == 1
selected = packet["tool_trajectory_selected"][0]
assert selected["result"] == exact
assert json.loads(selected["args"]) == calls[0]["args"]
assert selected["args_complete"] and selected["result_complete"]
assert selected["ref"] == old_ref
vocabulary = acceptance_evidence_ref_vocabulary(packet)
assert vocabulary[old_ref] == "tool_record"
assert vocabulary["tool_trajectory"] == "partial"
actor = {"signal": "PASS", "parsed": {"outcome_tier": "solved", "criteria_used": [{
"criterion": "old command", "status": "supported", "evidence_refs": [old_ref]}]}}
annotate_criteria_evidence_resolution([actor], packet)
assert task_acceptance_is_clean(SimpleNamespace(aggregate_signal="PASS", degraded=False, actors=[actor]))
# Source identity covers the old row even while the ordinary tail hides it.
calls[0]["args"] = {"cmd": "different operation"}
assert task_acceptance_evidence_revision(_trajectory_packet(tmp_path, calls)) != task_acceptance_evidence_revision(baseline)
def test_selection_can_complete_a_capped_row_but_budgeting_can_make_it_partial(tmp_path):
from ouroboros.review_evidence_refs import acceptance_evidence_ref_vocabulary
from ouroboros.tool_capabilities import TOOL_RESULT_LIMITS
calls = [{"tool": "run_command", "args": {"cmd": "a" * 4000},
"result": "x" * (TOOL_RESULT_LIMITS["run_command"] + 1000)}]
baseline = _trajectory_packet(tmp_path, calls)
ref = baseline["tool_trajectory"][0]["ref"]
assert baseline["tool_trajectory"][0]["args_complete"] is False
assert baseline["tool_trajectory"][0]["result_complete"] is False
assert acceptance_evidence_ref_vocabulary(baseline)[ref] == "partial"
complete = _trajectory_packet(tmp_path, calls, indices=[0])
assert acceptance_evidence_ref_vocabulary(complete)[ref] == "tool_record"
assert acceptance_evidence_ref_vocabulary(complete)["tool_trajectory"] == "partial"
recapped = _trajectory_packet(tmp_path, calls, indices=[0], budget=12000)
selected = recapped["tool_trajectory_selected"][0]
assert selected["result_complete"] is False
assert selected["args_complete"] is False
assert acceptance_evidence_ref_vocabulary(recapped)[ref] == "partial"
assert acceptance_evidence_ref_vocabulary(recapped)["tool_trajectory_selected"] == "partial"
assert len(json.dumps(recapped, ensure_ascii=False)) <= 12000
overflow = _trajectory_packet(tmp_path, calls, indices=[0], budget=9000)
assert overflow["__immutable_core_overflow__"]["packet_chars"] > 9000
@pytest.mark.parametrize("failure", ["missing", "corrupt", "legacy"])
def test_selected_result_never_reconstructed_from_preview(tmp_path, failure):
from ouroboros import artifacts
from ouroboros.review_evidence_refs import acceptance_evidence_ref_vocabulary
_, ref, _ = artifacts.persist_exact_text_source(
tmp_path, "selected-trajectory", source_id="missing-output", text="actual bytes")
path = artifacts.task_artifact_dir_path(tmp_path, "selected-trajectory") / ref["path"]
if failure == "missing":
path.unlink()
elif failure == "corrupt":
path.write_bytes(b"other bytes!")
else:
ref = {k: v for k, v in ref.items() if k not in {"size", "sha256"}}
packet = _trajectory_packet(tmp_path, [
{"tool": "run_command", "result": "agent preview", "result_partial": True, "result_source_ref": ref},
*[{"tool": "read_file", "result": "ok"} for _ in range(120)],
], indices=[0])
row = packet["tool_trajectory_selected"][0]
assert row["result_complete"] is False
assert acceptance_evidence_ref_vocabulary(packet)[row["ref"]] == "partial"
assert any(r["status"] == "source_unavailable" for r in packet["__unresolved_partial_artifacts__"])
def test_selected_corpus_must_really_read_and_verify(tmp_path, monkeypatch):
from ouroboros import artifacts
from ouroboros.review_evidence_refs import acceptance_evidence_ref_vocabulary
read = artifacts.read_actor_source_bytes
def missing_corpus(root, task_id, ref):
if "acceptance_tool_trajectory" in ref.get("path", ""):
raise FileNotFoundError("corpus unavailable")
return read(root, task_id, ref)
monkeypatch.setattr(artifacts, "read_actor_source_bytes", missing_corpus)
packet = _trajectory_packet(tmp_path, [{"tool": "run_command", "result": "ok"}] * 121, indices=[0])
assert "tool_trajectory_selected" not in packet
assert any(r["tool"] == "tool_trajectory_selected" and r["status"] == "source_unavailable"
for r in packet["__unresolved_partial_artifacts__"])
assert acceptance_evidence_ref_vocabulary(packet)["agent_supplied"] == "agent_supplied_section"
def test_invalid_selected_indices_are_disclosed_without_fabricated_rows(tmp_path):
packet = _trajectory_packet(tmp_path, [{"tool": "run_command", "result": "ok"}],
indices=[-1, True, "0", 999, {}, 0])
assert [row["source_index"] for row in packet["tool_trajectory_selected"]] == [0]
assert any(row["reason"] == "invalid_source_index" for row in packet["__unresolved_partial_artifacts__"])
def test_selected_record_recovers_real_sanitized_arguments_from_call_source(tmp_path):
from ouroboros.observability import persist_call
from ouroboros.review_evidence_refs import acceptance_evidence_ref_vocabulary
from ouroboros.utils import sanitize_tool_args_for_log
args = {"cmd": "a" * 4000, "items": list(range(51))}
call = {"tool": "run_command", "tool_call_id": "old-call", "args": args, "result": "ok"}
trace = persist_call(tmp_path, task_id="selected-trajectory", call_id="old-call",
call_type="tool", payload=call)
call = {**call, "args": sanitize_tool_args_for_log("run_command", args), "trace_ref": trace}
packet = _trajectory_packet(tmp_path, [call], indices=[0])
row = packet["tool_trajectory_selected"][0]
assert json.loads(row["args"]) == args
assert acceptance_evidence_ref_vocabulary(packet)[row["ref"]] == "tool_record"
Path(trace["redacted_projection_ref"]["path"]).unlink()
missing = _trajectory_packet(tmp_path, [call], indices=[0])
row = missing["tool_trajectory_selected"][0]
assert row["args_complete"] is False
assert acceptance_evidence_ref_vocabulary(missing)[row["ref"]] == "partial"
def test_selection_survives_the_real_cheap_tool_to_host_packet_path(tmp_path, monkeypatch):
from ouroboros.loop_acceptance_review import _build_host_acceptance_evidence
from ouroboros.loop_tool_execution import process_tool_results
from ouroboros.tools.registry import ToolContext
from ouroboros.tools.review import _handle_task_acceptance_review
monkeypatch.setenv("OUROBOROS_TASK_REVIEW_MODE", "auto")
ctx = ToolContext(repo_dir=tmp_path, drive_root=tmp_path, task_id="selected-trajectory")
response = _handle_task_acceptance_review(ctx, claim="answer", goal="inspect", evidence={
"tool_trajectory_indices": [0], "tool_trajectory_selected": [{"result": "invented prose"}],
})
trace = {"tool_calls": [{"tool": "read_file", "result": "real old source"}]}
process_tool_results([{
"fn_name": "task_acceptance_review", "tool_call_id": "choose", "is_error": False,
"args_for_log": {}, "result": response,
}], [], trace, lambda *_a, **_kw: None)
packet = _build_host_acceptance_evidence(SimpleNamespace(
tools=SimpleNamespace(_ctx=ctx), llm_trace=trace, drive_root=tmp_path,
task_id=ctx.task_id, task_type="task", content="answer", subtree_statuses=[],
packet_budget_chars=240000,
))
assert packet["tool_trajectory_selected"][0]["result"] == "real old source"
assert packet["agent_supplied"]["tool_trajectory_selected"][0]["result"] == "invented prose"
assert packet["__provenance__"]["agent_supplied"] == "agent_supplied"
def test_budget_recapped_trajectory_from_producer_cannot_resolve_clean():
from ouroboros.review_evidence import (
_accept_enforce_budget,
annotate_criteria_evidence_resolution,
)
from ouroboros.review_evidence_refs import acceptance_evidence_ref_vocabulary
from ouroboros.review_substrate import task_acceptance_is_clean
packet = _accept_enforce_budget({
"tool_trajectory": [{"tool": "run_command", "status": "ok", "result": "x" * 30_000}],
"__provenance__": {"tool_trajectory": "tool_result"},
}, budget=5_000)
actor = {
"signal": "PASS",
"parsed": {"outcome_tier": "solved", "criteria_used": [{
"criterion": "the command passed", "status": "supported",
"evidence_refs": ["tool_trajectory"],
}]},
}
annotate_criteria_evidence_resolution([actor], packet)
assert packet["tool_trajectory"][0]["result_complete"] is False
assert acceptance_evidence_ref_vocabulary(packet)["tool_trajectory"] == "partial"
result = SimpleNamespace(aggregate_signal="PASS", degraded=False, actors=[actor])
assert task_acceptance_is_clean(result) is False
def test_mixed_source_budget_recap_refuses_a_false_clean_pass(tmp_path):
from ouroboros.review_dispatch import task_acceptance_zero_physical_refusal
from ouroboros.review_evidence import _accept_enforce_budget
from ouroboros.review_substrate import (
ReviewRequest, ReviewSlot, run_review_request, task_acceptance_is_clean,
)
packet = _accept_enforce_budget({
"tool_trajectory": [
{"tool": "read_file", "result": "r" * 20_000,
"result_source_ref": {"kind": "artifact", "path": "results/read.txt"}},
{"tool": "run_command", "result": "c" * 20_000},
],
"__provenance__": {"tool_trajectory": "tool_result"},
}, budget=5_000)
partials = packet["__unresolved_partial_artifacts__"]
assert [row["status"] for row in partials] == [
"not_materialized_for_reviewer", "source_unavailable",
]
assert task_acceptance_zero_physical_refusal(packet)["status"] == "degraded_partial_source"
leading = _accept_enforce_budget({
"tool_trajectory": [
{"tool": "run_command", "result": "lost"},
*[{"tool": "read_file", "result": "kept"} for _ in range(20)],
],
"owner_requirements_and_decisions": "x" * 10_000,
}, budget=1_000)
assert any(
row["tool"] == "tool_trajectory" and row["status"] == "source_unavailable"
for row in leading["__unresolved_partial_artifacts__"]
)
class _PassReviewer:
calls = 0
def chat(self, **_kwargs):
self.calls += 1
return {"content": json.dumps({"verdict": "PASS", "findings": []})}, {}
reviewer = _PassReviewer()
result = run_review_request(
ReviewRequest(surface="task_acceptance", goal="review", evidence=packet),
slots=[ReviewSlot(slot_id="slot_1", model="reviewer")],
drive_root=tmp_path,
llm=reviewer,
)
assert reviewer.calls == 0
assert result.aggregate_signal == "DEGRADED"
assert task_acceptance_is_clean(result) is False
def test_skill_history_root_task_projection_avoids_whole_history_reads(monkeypatch, tmp_path):
from ouroboros.skill_readiness import _skill_names_from_review_history
from ouroboros import utils
skill_dir = tmp_path / "state" / "skills" / "large-skill"
skill_dir.mkdir(parents=True)
history = skill_dir / "review_history.jsonl"
history.write_text(
(json.dumps({"root_task_id": "some-other-root", "padding": "x" * 200}) + "\n")
* 20_000,
encoding="utf-8",
)
(tmp_path / "state" / "skill_review_root_tasks.jsonl").write_text(
json.dumps({"root_task_id": "root-wanted", "skill": "large-skill"}) + "\n",
encoding="utf-8",
)
original = Path.read_text
original_iter = utils.iter_jsonl_objects
bounded_projection_reads = []
def _guarded_read(path, *args, **kwargs):
if path.name == "review_history.jsonl":
raise AssertionError("acceptance rebuilt the full skill review history")
return original(path, *args, **kwargs)
monkeypatch.setattr(Path, "read_text", _guarded_read)
def _bounded_iter(path, *args, **kwargs):
if path.name == "skill_review_root_tasks.jsonl":
bounded_projection_reads.append(kwargs)
assert kwargs.get("tail_bytes")
assert kwargs.get("max_entries")
return original_iter(path, *args, **kwargs)
monkeypatch.setattr(utils, "iter_jsonl_objects", _bounded_iter)
history = _skill_names_from_review_history(tmp_path, "root-wanted")
assert history["names"] == ["large-skill"]
assert history["coverage"]["complete"] is True
assert len(bounded_projection_reads) == 1
def test_terminal_skill_review_updates_the_root_task_projection(tmp_path):
from ouroboros.skill_review_runner import _append_terminal_history
assert _append_terminal_history(
tmp_path,
"projected-skill",
{"job_id": "job-1", "root_task_id": "root-1"},
status="pass",
terminal_reason="review_complete",
ts="2026-09-03T00:00:00+00:00",
)
assert _append_terminal_history(
tmp_path,
"projected-skill",
{"job_id": "job-1", "root_task_id": "root-1"},
status="pass",
terminal_reason="review_complete",
ts="2026-09-03T00:00:00+00:00",
)
rows = [
json.loads(line)
for line in (tmp_path / "state" / "skill_review_root_tasks.jsonl")
.read_text(encoding="utf-8").splitlines()
]
assert rows == [{
"ts": "2026-09-03T00:00:00+00:00",
"root_task_id": "root-1",
"skill": "projected-skill",
"job_id": "job-1",
}]
def test_projection_failure_is_durable_in_coverage_and_runner_receipt(monkeypatch, tmp_path):
from ouroboros import skill_review_history
from ouroboros.skill_readiness import _skill_names_from_review_history
from ouroboros.skill_review_runner import _append_terminal_history
monkeypatch.setattr(
skill_review_history, "_append_root_task_projection_once", lambda *_a, **_k: False,
)
assert not _append_terminal_history(
tmp_path,
"gap-skill",
{"job_id": "job-gap", "root_task_id": "root-gap"},
status="pass",
terminal_reason="review_complete",
ts="2026-09-04T00:00:00+00:00",
)
gap_path = tmp_path / "state" / "skill_review_root_tasks.gaps.jsonl"
gap = json.loads(gap_path.read_text(encoding="utf-8").splitlines()[0])
assert gap == {
"ts": "2026-09-04T00:00:00+00:00",
"root_task_id": "root-gap",
"skill": "gap-skill",
"job_id": "job-gap",
"reason": "root_task_projection_append_failed",
}
history = _skill_names_from_review_history(tmp_path, "root-gap")
assert history["names"] == []
assert history["coverage"]["complete"] is False
assert "root_task_projection_append_failed" in history["coverage"]["gap_reasons"]
events = [
json.loads(line)
for line in (tmp_path / "logs" / "events.jsonl").read_text(encoding="utf-8").splitlines()
]
receipt = next(row for row in events if row.get("type") == "skill_review_history_append_failed")
assert "root-task projection" in receipt["reason"]
def test_skill_review_projection_retry_finds_identity_before_bounded_tail(tmp_path):
from ouroboros.skill_review_history import _append_root_task_projection_once
original = {"job_id": "job-original", "root_task_id": "root-original"}
assert _append_root_task_projection_once(tmp_path, "projected-skill", original)
for index in range(129):
assert _append_root_task_projection_once(
tmp_path, "projected-skill",
{"job_id": f"job-{index}", "root_task_id": f"root-{index}"},
)
assert _append_root_task_projection_once(tmp_path, "projected-skill", original)
rows = [
json.loads(line)
for line in (tmp_path / "state" / "skill_review_root_tasks.jsonl")
.read_text(encoding="utf-8").splitlines()
]
assert sum(
row.get("root_task_id") == "root-original"
and row.get("skill") == "projected-skill"
and row.get("job_id") == "job-original"
for row in rows
) == 1
def test_skill_review_projection_is_enrolled_as_a_hot_store():
from ouroboros.agent_startup_checks import _hot_store_thresholds
assert "state/skill_review_root_tasks.jsonl" in {
relative for relative, _threshold, _remediation in _hot_store_thresholds()
}
def test_acceptance_slot_fit_uses_packet_density():
from ouroboros.review_dispatch import acceptance_slot_fit
chars = 330_001
cap, estimated = acceptance_slot_fit(
SimpleNamespace(model="reviewer", max_tokens=16_384),
SimpleNamespace(prompt_chars=lambda: chars),
slot_input_caps={"reviewer": 200_000},
)
assert cap == 200_000
assert estimated == 100_001
assert estimated > chars // 4
def test_acceptance_slot_fit_reuses_packet_budget_caps(monkeypatch):
from ouroboros.review_dispatch import acceptance_slot_fit
from ouroboros.review_evidence import acceptance_packet_budget_chars
from ouroboros.review_substrate import ReviewSlot
from ouroboros.tools import review_synthesis
calls = []
caps = {"wide": 800_000, "narrow": 20_000}
def _caps(models, **_kwargs):
calls.append(list(models))
return {slot.slot_id: caps[model] for model, slot in zip(models, _kwargs["slots"])}
monkeypatch.setattr(review_synthesis, "per_slot_input_token_limits", _caps)
slots = [
ReviewSlot(slot_id="slot_1", model="wide"),
ReviewSlot(slot_id="slot_2", model="narrow"),
]
budget = acceptance_packet_budget_chars(slots)
monkeypatch.setattr(
review_synthesis,
"per_slot_input_token_limits",
lambda *_args, **_kwargs: (_ for _ in ()).throw(
AssertionError("dispatch recalibrated cached packet caps")
),
)
cap, estimated = acceptance_slot_fit(
slots[1], SimpleNamespace(prompt_chars=lambda: 99_000),
slot_input_caps=budget.slot_input_caps,
)
assert calls == [["wide", "narrow"]]
assert cap == 20_000
assert estimated == 30_000
def test_budget_ladder_stops_shedding_after_predecessor_fits():
from ouroboros.review_evidence import _accept_enforce_budget
trajectory = [{"tool": f"tool-{index}", "result": "ok"} for index in range(21)]
evidence = {
"task_contract": {
"requirements": "keep the trajectory",
"predecessor_authority": {
"previous_task_id": "prior-task",
"envelope": "x" * 20_000,
},
},
"tool_trajectory": trajectory,
}
compact_without_envelope = {
**evidence,
"task_contract": {
"requirements": "keep the trajectory",
"predecessor_authority": {
"kind": "predecessor_authority_omitted_for_budget",
"previous_task_id": "prior-task",
"omitted_chars": len(json.dumps(
evidence["task_contract"]["predecessor_authority"]
)),
},
},
"omissions_manifest": [{
"section": "task_contract.predecessor_authority",
"omitted": len(json.dumps(
evidence["task_contract"]["predecessor_authority"]
)),
"reason": "evidence_budget",
}],
}
budget = len(json.dumps(compact_without_envelope)) + 10
compact_without_envelope["__budget_note__"] = (
f"⚠️ OMISSION NOTE: evidence exceeded {budget} chars; "
f"omitted the predecessor authority envelope ({compact_without_envelope['omissions_manifest'][0]['omitted']} chars). "
"Full content is durable off-axis."
)
budget = len(json.dumps(compact_without_envelope, ensure_ascii=False)) + 10
result = _accept_enforce_budget(evidence, budget=budget)
assert result["tool_trajectory"] == trajectory
assert len(json.dumps(result, ensure_ascii=False, default=str)) <= budget
assert not any(
row.get("section") == "tool_trajectory"
for row in result["omissions_manifest"]
)
def test_acceptance_docs_have_complete_sentence_boundaries():
development = development_text()
architecture = architecture_text()
assert "silent false green. The\n Every forced rail" not in development
assert "never certify success; An OPEN plan wave" not in architecture
assert "never had claims. an unresolved reference" not in architecture
def test_refused_slot_reuses_the_already_persisted_prompt(monkeypatch, tmp_path):
import ouroboros.review_substrate as substrate
calls = []
def _persist(*_args, **kwargs):
calls.append(kwargs["call_type"])
return {"manifest_ref": kwargs["call_id"]}
monkeypatch.setattr(substrate, "persist_call", _persist)
request = substrate.ReviewRequest(
surface="task_acceptance",
goal="review",
task_id="prompt-reuse",
evidence={"__unresolved_partial_artifacts__": [{
"status": "source_unavailable",
}]},
)
actor = substrate.ReviewCoordinator(drive_root=tmp_path)._run_slot(
request,
substrate.ReviewSlot(slot_id="slot_1", model="reviewer"),
operation_id="operation-1",
)
assert actor.status == "not_dispatched"
assert actor.prompt_ref == {"manifest_ref": "operation-1_prompt"}
assert len([call for call in calls if call.endswith("_prompt")]) == 1
assert len(calls) == 2
def test_broken_reflection_panel_keeps_commit_advisory_lens(monkeypatch):
from ouroboros.reflection import generate_reflection
from ouroboros import review_substrate
captured = {}
class _Llm:
def chat(self, **kwargs):
captured["prompt"] = kwargs["messages"][0]["content"]
return {"content": "Reflection completed."}, {}
monkeypatch.setattr(
review_substrate,
"compact_review_projection",
lambda _runs: (_ for _ in ()).throw(ValueError("broken panel")),
)
generate_reflection(
task={"id": "reflection-task", "text": "reflect"},
llm_trace={"tool_calls": [], "review_runs": [{"broken": True}]},
trace_summary="completed",
llm_client=_Llm(),
usage_dict={"rounds": 2, "cost": 0.1},
review_evidence={"has_evidence": True, "lens_marker": "lens-survives"},
)
assert "lens-survives" in captured["prompt"]
assert "review evidence unavailable" not in captured["prompt"]