..............................F...F..................................... [ 3%]
........................................................................ [ 6%]
.........FF..............................................F.............. [ 10%]
.................F...................................................... [ 13%]
.........................................FFFFFFFF...............F....... [ 17%]
........................................................................ [ 20%]
........................................................................ [ 24%]
........................................................................ [ 27%]
........................................................................ [ 30%]
........................................................................ [ 34%]
..................FFF.FF.FFFF.FFF.F.FFF...FF.FFFF.F.FFF.. [ 37%]
F.F..FFF.FFFF....F...FFF.F..FFFF.FFF.F.FFF.F.FF.FFFF.F.FFF..F.F..FFF.FFF [ 40%]
F....F..F....F.......................................................... [ 43%]
......................................F................................. [ 47%]
.................................FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF [ 50%]
F..FF.........................FFF....................................... [ 54%]
........................................................................ [ 57%]
.................sss..s................................................. [ 61%]
........................................................................ [ 64%]
........................................................................ [ 67%]
......................................................F................. [ 71%]
......................FF............................................. [ 74%]
........................................................................ [ 78%]
...............ss....................................................... [ 81%]
.......FFF.............................................................. [ 85%]
...................................sssssssssssssssssssssssss............ [ 88%]
.........................................FFFF.FF....FF...F....F......... [ 91%]
........................................................................ [ 95%]
.................................sss.................................... [ 98%]
....................s..F.. [100%]
=================================== FAILURES ===================================
_____________ test_edges_cite_journal_records_across_chosen_chats ______________
store = (, {'pay': {'seq': 1, 'observed_at': '2026-11-14T07:28:44.989+00:00', ...ward': {'seq': 4, 'observed_at': '2026-11-14T07:28:45.014+00:00', 'source_at': None, 'kind': 'message.new', ...}, ...})
def test_edges_cite_journal_records_across_chosen_chats(store):
value, records = store
model = graphs.collect(extensions.JournalReader(lambda: value), {CHAT, OTHER})
reply = edge(model, "account:22", "account:11", "reply")
assert reply["weight"] == 1 and reply["refs"] == [{"chat": CHAT, "message": 2, "seq": records["reply"]["seq"],
"hash": records["reply"]["hash"]}]
assert edge(model, "account:11", "account:22", "reply")["refs"][0]["seq"] == records["back"]["seq"]
assert edge(model, "account:33", "source:-1000000000555", "forward")["refs"][0]["message"] == 4
assert edge(model, "account:22", "mention:@helper_bot", "mention")["weight"] == 1
wallet = "indicator:wallet:" + WALLET
assert {e["source"] for e in model["edges"] if e["target"] == wallet} == {"account:11", "account:33"}
assert edge(model, "account:33", wallet, "posted")["refs"][0]["chat"] == OTHER
assert model["totals"]["indicators_shared_by_several"] == 1 and model["format"] == graphs.FORMAT
nodes = {n["id"]: n for n in model["nodes"]}
assert nodes["account:11"]["label"] == "Alice &" and nodes["account:11"]["messages"] == 2
assert nodes["account:11"]["community"] == nodes["account:22"]["community"]
assert all(len(e["refs"]) <= graphs.MAX_REFS for e in model["edges"]) and not model["truncated"]
> assert any("does not mean there was no contact" in line for line in model["limits"])
E assert False
E + where False = any(. at 0x70b6f88d5e50>)
tools/test_analyzer_graphs.py:71: AssertionError
_______ test_rotated_account_ranks_first_with_explanation_and_citations ________
reader =
def test_rotated_account_ranks_first_with_explanation_and_citations(reader):
result = linking.candidates(reader, {CHAT}, offset_minutes=180)
assert result["format"] == linking.FORMAT and result["accounts"] == 5 and result["compared"] == 10
assert result["basis"] == "absolute"
top = result["pairs"][0]
assert top["key"] == "101|202" and top["tier"] == "strong"
assert all(top["score"] > pair["score"] for pair in result["pairs"][1:])
assert {"lexical", "hours", "handoff", "shared"} <= set(top["standout"])
assert top["handoff"]["gone"] == 101 and top["handoff"]["arrived"] == 202
assert any(line.startswith("Same vocabulary") for line in top["explanation"])
assert any(line.startswith("One stops, other starts: Payout Desk (ID 101)") for line in top["explanation"])
[shared] = top["shared_indicators"]
assert shared["kind"] == "wallet" and shared["value"] == WALLET
assert all(len(ref["hash"]) == 64 and ref["chat"] == CHAT for ref in shared["refs"] + top["a"]["refs"])
assert top["a"]["first_seen"].endswith("+03:00")
> assert any("not identification" in line for line in result["limits"])
E assert False
E + where False = any(. at 0x70b708b5a810>)
tools/test_analyzer_linking.py:81: AssertionError
______ test_package_contains_readable_report_files_and_explanations[tsr] _______
tmp_path = PosixPath('/tmp/pytest-of-root/pytest-8/test_package_contains_readable0')
receipt_kind = 'tsr'
@pytest.mark.parametrize("receipt_kind", ["tsr", "ots"])
def test_package_contains_readable_report_files_and_explanations(tmp_path, receipt_kind):
vault, store = Vault(tmp_path / "workspace"), Store(tmp_path / "workspace")
store.bind(vault)
media = tmp_path / "workspace" / "media"
media.mkdir(exist_ok=True)
for data in (PHOTO, SECRET):
(media / sha(data)).write_bytes(data)
try:
session = documentation.create(store, Start(title="Fictional case"), "admin")
store.append("interaction.requested", {"request": {"action": "send", "chat_id": BOT, "text": "hi"}}, BOT)
store.append("message.new", {**incoming("hi"), "outgoing": True, "source": "panel_action"}, BOT, 1)
store.append("message.new", incoming("Pay to bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4"), BOT, 2)
store.append("media.saved", {"media_sha256": sha(PHOTO), "mime_type": "image/jpeg"}, BOT, 2)
hidden = store.append("message.new", incoming("explicit"), BOT, 3)
store.append("media.saved", {"media_sha256": sha(SECRET), "mime_type": "image/jpeg"}, BOT, 3)
store.append("capture.opened", {"requested_url": "https://pay.example.invalid/", "http_status": 200,
"artifacts": [{"sha256": sha(SCREEN), "size": len(SCREEN), "role": "viewport",
"media_type": "image/png"}], "errors": []})
documentation.add_mark(store, session["id"], Mark(text="Explicit", labels=["adult"], target_seq=hidden["seq"]))
with pytest.raises(ValueError, match="Fix the document"):
case_package.build(documentation.load(store, session["id"]), documentation.action_protocol.plain_say, {}, media)
fixed = documentation.fix(store, vault, session["id"])["fixed"]
checkpoints = tmp_path / "workspace" / "checkpoints"
(checkpoints / "anchors").mkdir(parents=True, exist_ok=True)
name = "checkpoint-" + str(fixed["event_seq"] + 1).zfill(12)
receipt_name = name + ".fictional-tsa." + receipt_kind
(checkpoints / (name + ".json")).write_text('{"statement": {}}')
(checkpoints / "anchors" / receipt_name).write_bytes(b"synthetic-reply")
loaded = documentation.load(store, session["id"])
path = case_package.build(loaded, documentation.action_protocol.plain_say, {sha(SCREEN): SCREEN}, media,
tmp_path, checkpoints)
root = "tgwitness-case-" + session["id"][:8] + "/"
with zipfile.ZipFile(path) as archive:
names = set(archive.namelist())
slides = archive.read(root + "data/presentation.html").decode()
assert slides.count(' assert "Timestamp receipts (not verified)" in certificate and "have not been verified" in certificate
E assert ('Timestamp receipts (not verified)' in '
Date:
Place: