truassure 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- truassure-1.0.0/.gitignore +231 -0
- truassure-1.0.0/LICENSE +21 -0
- truassure-1.0.0/PKG-INFO +377 -0
- truassure-1.0.0/README.md +323 -0
- truassure-1.0.0/SUT/README.md +38 -0
- truassure-1.0.0/SUT/chat-assistant/README.md +37 -0
- truassure-1.0.0/SUT/chat-assistant/tests/conftest.py +38 -0
- truassure-1.0.0/SUT/chat-assistant/tests/fakes.py +61 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_backend.py +235 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_cli.py +192 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_db_errors.py +421 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_engine.py +149 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_engine_more.py +115 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_mcp_http.py +55 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_mcp_server.py +47 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_mcp_server_more.py +145 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_persona1.py +251 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_persona2.py +452 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_rest_api.py +100 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_transactions.py +238 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_transports_more.py +308 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_web.py +219 -0
- truassure-1.0.0/SUT/chat-assistant/tests/test_web_more.py +193 -0
- truassure-1.0.0/SUT/claims-agent/README.md +81 -0
- truassure-1.0.0/SUT/claims-agent/tests/conftest.py +20 -0
- truassure-1.0.0/SUT/claims-agent/tests/test_agent.py +173 -0
- truassure-1.0.0/SUT/claims-agent/tests/test_backend.py +104 -0
- truassure-1.0.0/SUT/claims-agent/tests/test_defects_and_telemetry.py +142 -0
- truassure-1.0.0/SUT/claims-agent/tests/test_service.py +99 -0
- truassure-1.0.0/SUT/claims-agent/tests/test_tools_server.py +151 -0
- truassure-1.0.0/SUT/common/harbor_llm/tests/conftest.py +125 -0
- truassure-1.0.0/SUT/common/harbor_llm/tests/test_factory.py +294 -0
- truassure-1.0.0/SUT/common/harbor_llm/tests/test_providers.py +389 -0
- truassure-1.0.0/SUT/multi-agent-desk/README.md +106 -0
- truassure-1.0.0/SUT/multi-agent-desk/tests/conftest.py +56 -0
- truassure-1.0.0/SUT/multi-agent-desk/tests/test_agents.py +175 -0
- truassure-1.0.0/SUT/multi-agent-desk/tests/test_defects.py +102 -0
- truassure-1.0.0/SUT/multi-agent-desk/tests/test_identity_backend.py +122 -0
- truassure-1.0.0/SUT/multi-agent-desk/tests/test_services_http.py +245 -0
- truassure-1.0.0/docs/README.md +8 -0
- truassure-1.0.0/docs/brief/BRIEF.md +119 -0
- truassure-1.0.0/docs/brief/prompt.txt +123 -0
- truassure-1.0.0/docs/client/TruAssure-Client-Overview.html +286 -0
- truassure-1.0.0/docs/demo/TruAssure-Demo-Runbook.html +761 -0
- truassure-1.0.0/docs/planning/PLAN.md +622 -0
- truassure-1.0.0/pilots/calibration/README.md +24 -0
- truassure-1.0.0/pilots/claims/README.md +70 -0
- truassure-1.0.0/pilots/desk/README.md +65 -0
- truassure-1.0.0/pyproject.toml +125 -0
- truassure-1.0.0/src/truassure/__init__.py +5 -0
- truassure-1.0.0/src/truassure/adapters/__init__.py +4 -0
- truassure-1.0.0/src/truassure/adapters/_files.py +76 -0
- truassure-1.0.0/src/truassure/adapters/_identity.py +55 -0
- truassure-1.0.0/src/truassure/adapters/drivers/__init__.py +1 -0
- truassure-1.0.0/src/truassure/adapters/drivers/chat_ws.py +182 -0
- truassure-1.0.0/src/truassure/adapters/drivers/http_task.py +203 -0
- truassure-1.0.0/src/truassure/adapters/graders/__init__.py +1 -0
- truassure-1.0.0/src/truassure/adapters/graders/artifact_tests.py +121 -0
- truassure-1.0.0/src/truassure/adapters/graders/consistency_rules.py +105 -0
- truassure-1.0.0/src/truassure/adapters/graders/llm_rubric.py +132 -0
- truassure-1.0.0/src/truassure/adapters/observers/__init__.py +1 -0
- truassure-1.0.0/src/truassure/adapters/observers/a2a_tap.py +278 -0
- truassure-1.0.0/src/truassure/adapters/observers/mcp_proxy.py +346 -0
- truassure-1.0.0/src/truassure/adapters/observers/otel_genai.py +141 -0
- truassure-1.0.0/src/truassure/adapters/observers/otel_receiver.py +79 -0
- truassure-1.0.0/src/truassure/adapters/observers/proxy_log.py +115 -0
- truassure-1.0.0/src/truassure/adapters/state/__init__.py +1 -0
- truassure-1.0.0/src/truassure/adapters/state/filetree.py +93 -0
- truassure-1.0.0/src/truassure/adapters/state/git.py +146 -0
- truassure-1.0.0/src/truassure/adapters/state/sqlite.py +126 -0
- truassure-1.0.0/src/truassure/core/__init__.py +5 -0
- truassure-1.0.0/src/truassure/core/__main__.py +3 -0
- truassure-1.0.0/src/truassure/core/calibration.py +163 -0
- truassure-1.0.0/src/truassure/core/catalog/__init__.py +69 -0
- truassure-1.0.0/src/truassure/core/catalog/schema/scenario.schema.json +391 -0
- truassure-1.0.0/src/truassure/core/ci.py +151 -0
- truassure-1.0.0/src/truassure/core/cli.py +744 -0
- truassure-1.0.0/src/truassure/core/codes.py +136 -0
- truassure-1.0.0/src/truassure/core/compare.py +344 -0
- truassure-1.0.0/src/truassure/core/compiler.py +278 -0
- truassure-1.0.0/src/truassure/core/console.py +298 -0
- truassure-1.0.0/src/truassure/core/envfile.py +53 -0
- truassure-1.0.0/src/truassure/core/governance/__init__.py +2 -0
- truassure-1.0.0/src/truassure/core/governance/defects.py +134 -0
- truassure-1.0.0/src/truassure/core/governance/gate.py +170 -0
- truassure-1.0.0/src/truassure/core/governance/junit.py +102 -0
- truassure-1.0.0/src/truassure/core/governance/packs.py +98 -0
- truassure-1.0.0/src/truassure/core/matching.py +75 -0
- truassure-1.0.0/src/truassure/core/model.py +490 -0
- truassure-1.0.0/src/truassure/core/naming.py +20 -0
- truassure-1.0.0/src/truassure/core/protocols.py +110 -0
- truassure-1.0.0/src/truassure/core/registry.py +72 -0
- truassure-1.0.0/src/truassure/core/reliability.py +101 -0
- truassure-1.0.0/src/truassure/core/report.py +565 -0
- truassure-1.0.0/src/truassure/core/robustness.py +151 -0
- truassure-1.0.0/src/truassure/core/runlock.py +104 -0
- truassure-1.0.0/src/truassure/core/runner.py +444 -0
- truassure-1.0.0/src/truassure/core/scorecard/__init__.py +897 -0
- truassure-1.0.0/src/truassure/core/scorecard/catalogue.yaml +127 -0
- truassure-1.0.0/src/truassure/core/security.py +109 -0
- truassure-1.0.0/src/truassure/core/serde.py +31 -0
- truassure-1.0.0/src/truassure/core/stages/__init__.py +27 -0
- truassure-1.0.0/src/truassure/core/stages/evaluate.py +703 -0
- truassure-1.0.0/src/truassure/core/stages/expectations.py +142 -0
- truassure-1.0.0/src/truassure/core/stats.py +112 -0
- truassure-1.0.0/src/truassure/core/store.py +136 -0
- truassure-1.0.0/src/truassure/mcp_server.py +205 -0
- truassure-1.0.0/src/truassure/profiles/__init__.py +1 -0
- truassure-1.0.0/src/truassure/profiles/conversational/__init__.py +1 -0
- truassure-1.0.0/src/truassure/profiles/conversational/approvals.py +50 -0
- truassure-1.0.0/src/truassure/profiles/conversational/codes_map.py +85 -0
- truassure-1.0.0/src/truassure/profiles/conversational/live.py +90 -0
- truassure-1.0.0/src/truassure/profiles/conversational/replay.py +211 -0
- truassure-1.0.0/src/truassure/profiles/conversational/trace.py +42 -0
- truassure-1.0.0/src/truassure/profiles/conversational/translator.py +203 -0
- truassure-1.0.0/src/truassure/profiles/task/__init__.py +86 -0
- truassure-1.0.0/src/truassure/profiles/task/live.py +96 -0
- truassure-1.0.0/src/truassure/profiles/workflow/__init__.py +69 -0
- truassure-1.0.0/src/truassure/profiles/workflow/live.py +60 -0
- truassure-1.0.0/src/truassure/py.typed +0 -0
- truassure-1.0.0/src/truassure/testing/__init__.py +1 -0
- truassure-1.0.0/src/truassure/testing/contract.py +299 -0
- truassure-1.0.0/src/truassure/testing/fakes.py +310 -0
- truassure-1.0.0/src/truassure/testing/scripted.py +331 -0
- truassure-1.0.0/tests/conftest.py +7 -0
- truassure-1.0.0/tests/contract/test_contract.py +192 -0
- truassure-1.0.0/tests/e2e/test_a2a_tap.py +331 -0
- truassure-1.0.0/tests/e2e/test_chat_driver.py +458 -0
- truassure-1.0.0/tests/e2e/test_console.py +144 -0
- truassure-1.0.0/tests/e2e/test_governance_cli.py +83 -0
- truassure-1.0.0/tests/e2e/test_mcp_proxy.py +341 -0
- truassure-1.0.0/tests/e2e/test_mcp_server.py +165 -0
- truassure-1.0.0/tests/e2e/test_runlevel_cli.py +236 -0
- truassure-1.0.0/tests/e2e/test_runner.py +373 -0
- truassure-1.0.0/tests/e2e/tests_support_env.py +37 -0
- truassure-1.0.0/tests/fixtures/catalogs/conversational.yaml +30 -0
- truassure-1.0.0/tests/fixtures/catalogs/e2e_demo.yaml +54 -0
- truassure-1.0.0/tests/fixtures/catalogs/suite_catalog_mini.yaml +40 -0
- truassure-1.0.0/tests/fixtures/catalogs/task.yaml +36 -0
- truassure-1.0.0/tests/fixtures/catalogs/workflow.yaml +24 -0
- truassure-1.0.0/tests/golden/reference/corpus/catalogs/1d4ad8f.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/catalogs/3da167f.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/catalogs/4dca78b.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/catalogs/53e1679.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/catalogs/5d80d14.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/catalogs/6312b87.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/catalogs/8a147b3.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/catalogs/8d58872.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/catalogs/a9b2b28.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/catalogs/ccdf7e6.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/catalogs/e1f5bc5.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/manifest.json +535 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261103-213908.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261103-213951.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-103911.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-114836.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-121919.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-123010.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-124432.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-132408.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-134209.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-140815.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-142851.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-160955.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261104-173323.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-141852.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-142540.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-142747.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-143134.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-144222.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-144604.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-144731.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-160933.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-161320.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-162123.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-165536.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-170513.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261105-171241.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-121321.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-131625.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-131859.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-162831.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-171542.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-173220.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-195324.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-201301.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-222552.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-223647.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-223804.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-232315.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-232803.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/corpus/runs/run-20261106-233344.json.gz +0 -0
- truassure-1.0.0/tests/golden/reference/primitives.json +816 -0
- truassure-1.0.0/tests/golden/reference/runlevel.json.gz +0 -0
- truassure-1.0.0/tests/golden/test_reference_primitives.py +42 -0
- truassure-1.0.0/tests/golden/test_regression_gate.py +97 -0
- truassure-1.0.0/tests/golden/test_report_size.py +42 -0
- truassure-1.0.0/tests/golden/test_runlevel_gate.py +357 -0
- truassure-1.0.0/tests/pilots/claims_stack.py +151 -0
- truassure-1.0.0/tests/pilots/desk_stack.py +119 -0
- truassure-1.0.0/tests/pilots/test_claims_defects.py +80 -0
- truassure-1.0.0/tests/pilots/test_claims_parity.py +45 -0
- truassure-1.0.0/tests/pilots/test_claims_pilot.py +64 -0
- truassure-1.0.0/tests/pilots/test_desk_pilot.py +138 -0
- truassure-1.0.0/tests/unit/test_approvals.py +50 -0
- truassure-1.0.0/tests/unit/test_calibration.py +233 -0
- truassure-1.0.0/tests/unit/test_catalog_schema.py +105 -0
- truassure-1.0.0/tests/unit/test_cli_and_registry.py +63 -0
- truassure-1.0.0/tests/unit/test_cli_errors.py +62 -0
- truassure-1.0.0/tests/unit/test_compiler.py +95 -0
- truassure-1.0.0/tests/unit/test_conversational_replay.py +146 -0
- truassure-1.0.0/tests/unit/test_core_imports.py +69 -0
- truassure-1.0.0/tests/unit/test_entry_points_and_fakes.py +104 -0
- truassure-1.0.0/tests/unit/test_envfile.py +56 -0
- truassure-1.0.0/tests/unit/test_matching.py +40 -0
- truassure-1.0.0/tests/unit/test_model.py +99 -0
- truassure-1.0.0/tests/unit/test_otel_and_git.py +266 -0
- truassure-1.0.0/tests/unit/test_runlock.py +80 -0
- truassure-1.0.0/tests/unit/test_scorecard_governance.py +399 -0
- truassure-1.0.0/tests/unit/test_stages_more.py +190 -0
- truassure-1.0.0/tests/unit/test_stages_ported.py +304 -0
- truassure-1.0.0/tests/unit/test_stats_store_security.py +238 -0
- truassure-1.0.0/tests/unit/test_synthetic_episodes.py +587 -0
- truassure-1.0.0/tests/unit/test_task_adapters.py +423 -0
- truassure-1.0.0/tests/unit/test_translator.py +75 -0
- truassure-1.0.0/tests/unit/test_translator_edges.py +96 -0
- truassure-1.0.0/tools/check_core_imports.py +92 -0
- truassure-1.0.0/tools/make_golden.py +156 -0
- truassure-1.0.0/tools/make_reference_corpus.py +404 -0
- truassure-1.0.0/tools/make_reference_runlevel.py +269 -0
- truassure-1.0.0/tools/wheel_smoke.py +64 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py.cover
|
|
50
|
+
*.lcov
|
|
51
|
+
.hypothesis/
|
|
52
|
+
.pytest_cache/
|
|
53
|
+
cover/
|
|
54
|
+
|
|
55
|
+
# Translations
|
|
56
|
+
*.mo
|
|
57
|
+
*.pot
|
|
58
|
+
|
|
59
|
+
# Django stuff:
|
|
60
|
+
*.log
|
|
61
|
+
local_settings.py
|
|
62
|
+
db.sqlite3
|
|
63
|
+
db.sqlite3-journal
|
|
64
|
+
|
|
65
|
+
# Flask stuff:
|
|
66
|
+
instance/
|
|
67
|
+
.webassets-cache
|
|
68
|
+
|
|
69
|
+
# Scrapy stuff:
|
|
70
|
+
.scrapy
|
|
71
|
+
|
|
72
|
+
# Sphinx documentation
|
|
73
|
+
docs/_build/
|
|
74
|
+
|
|
75
|
+
# PyBuilder
|
|
76
|
+
.pybuilder/
|
|
77
|
+
target/
|
|
78
|
+
|
|
79
|
+
# Jupyter Notebook
|
|
80
|
+
.ipynb_checkpoints
|
|
81
|
+
|
|
82
|
+
# IPython
|
|
83
|
+
profile_default/
|
|
84
|
+
ipython_config.py
|
|
85
|
+
|
|
86
|
+
# pyenv
|
|
87
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
88
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
89
|
+
# .python-version
|
|
90
|
+
|
|
91
|
+
# pipenv
|
|
92
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
93
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
94
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
95
|
+
# install all needed dependencies.
|
|
96
|
+
# Pipfile.lock
|
|
97
|
+
|
|
98
|
+
# uv
|
|
99
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
100
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
101
|
+
# commonly ignored for libraries.
|
|
102
|
+
# uv.lock
|
|
103
|
+
|
|
104
|
+
# poetry
|
|
105
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
106
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
107
|
+
# commonly ignored for libraries.
|
|
108
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
109
|
+
# poetry.lock
|
|
110
|
+
# poetry.toml
|
|
111
|
+
|
|
112
|
+
# pdm
|
|
113
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
114
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
115
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
116
|
+
# pdm.lock
|
|
117
|
+
# pdm.toml
|
|
118
|
+
.pdm-python
|
|
119
|
+
.pdm-build/
|
|
120
|
+
|
|
121
|
+
# pixi
|
|
122
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
123
|
+
# pixi.lock
|
|
124
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
125
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
126
|
+
.pixi/*
|
|
127
|
+
!.pixi/config.toml
|
|
128
|
+
|
|
129
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
130
|
+
__pypackages__/
|
|
131
|
+
|
|
132
|
+
# Celery stuff
|
|
133
|
+
celerybeat-schedule*
|
|
134
|
+
celerybeat.pid
|
|
135
|
+
|
|
136
|
+
# Redis
|
|
137
|
+
*.rdb
|
|
138
|
+
*.aof
|
|
139
|
+
*.pid
|
|
140
|
+
|
|
141
|
+
# RabbitMQ
|
|
142
|
+
mnesia/
|
|
143
|
+
rabbitmq/
|
|
144
|
+
rabbitmq-data/
|
|
145
|
+
|
|
146
|
+
# ActiveMQ
|
|
147
|
+
activemq-data/
|
|
148
|
+
|
|
149
|
+
# SageMath parsed files
|
|
150
|
+
*.sage.py
|
|
151
|
+
|
|
152
|
+
# Environments
|
|
153
|
+
.env
|
|
154
|
+
.envrc
|
|
155
|
+
.venv
|
|
156
|
+
env/
|
|
157
|
+
venv/
|
|
158
|
+
ENV/
|
|
159
|
+
env.bak/
|
|
160
|
+
venv.bak/
|
|
161
|
+
|
|
162
|
+
# Spyder project settings
|
|
163
|
+
.spyderproject
|
|
164
|
+
.spyproject
|
|
165
|
+
|
|
166
|
+
# Rope project settings
|
|
167
|
+
.ropeproject
|
|
168
|
+
|
|
169
|
+
# mkdocs/Zensical documentation
|
|
170
|
+
/site
|
|
171
|
+
|
|
172
|
+
# mypy
|
|
173
|
+
.mypy_cache/
|
|
174
|
+
.dmypy.json
|
|
175
|
+
dmypy.json
|
|
176
|
+
|
|
177
|
+
# Pyre type checker
|
|
178
|
+
.pyre/
|
|
179
|
+
|
|
180
|
+
# pytype static type analyzer
|
|
181
|
+
.pytype/
|
|
182
|
+
|
|
183
|
+
# Cython debug symbols
|
|
184
|
+
cython_debug/
|
|
185
|
+
|
|
186
|
+
# PyCharm
|
|
187
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
188
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
189
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
190
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
191
|
+
# .idea/
|
|
192
|
+
|
|
193
|
+
# Abstra
|
|
194
|
+
# Abstra is an AI-powered process automation framework.
|
|
195
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
196
|
+
# Learn more at https://abstra.io/docs
|
|
197
|
+
.abstra/
|
|
198
|
+
|
|
199
|
+
# Visual Studio Code
|
|
200
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore that
|
|
201
|
+
# can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
202
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer, you
|
|
203
|
+
# could uncomment the following to ignore the entire vscode folder
|
|
204
|
+
# .vscode/
|
|
205
|
+
# Temporary file for partial code execution
|
|
206
|
+
tempCodeRunnerFile.py
|
|
207
|
+
|
|
208
|
+
# Ruff stuff:
|
|
209
|
+
.ruff_cache/
|
|
210
|
+
|
|
211
|
+
# PyPI configuration file
|
|
212
|
+
.pypirc
|
|
213
|
+
|
|
214
|
+
# Marimo
|
|
215
|
+
marimo/_static/
|
|
216
|
+
marimo/_lsp/
|
|
217
|
+
__marimo__/
|
|
218
|
+
|
|
219
|
+
# Streamlit
|
|
220
|
+
.streamlit/secrets.toml
|
|
221
|
+
|
|
222
|
+
# --- TruAssure ---
|
|
223
|
+
.env*
|
|
224
|
+
!.env.example
|
|
225
|
+
ta_runs/
|
|
226
|
+
tests/golden/_inputs/
|
|
227
|
+
*.local.yaml
|
|
228
|
+
# SUT runtime data (databases, generated letters) - created by tests and local runs
|
|
229
|
+
SUT/**/data/
|
|
230
|
+
SUT/**/letters/
|
|
231
|
+
*.db
|
truassure-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Shan Konduru
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
truassure-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: truassure
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: TruAssure: black-box, evidence-based quality engineering for AI agents (chat, task and multi-agent).
|
|
5
|
+
Author: Shan Konduru
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
12
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
13
|
+
Classifier: Topic :: Software Development :: Testing
|
|
14
|
+
Classifier: Typing :: Typed
|
|
15
|
+
Requires-Python: >=3.11
|
|
16
|
+
Requires-Dist: jsonschema>=4.21
|
|
17
|
+
Requires-Dist: pyyaml>=6.0
|
|
18
|
+
Provides-Extra: anthropic
|
|
19
|
+
Requires-Dist: anthropic>=0.40; extra == 'anthropic'
|
|
20
|
+
Provides-Extra: azure
|
|
21
|
+
Requires-Dist: openai>=1.40; extra == 'azure'
|
|
22
|
+
Provides-Extra: chat
|
|
23
|
+
Requires-Dist: websockets>=12; extra == 'chat'
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: build>=1.2; extra == 'dev'
|
|
26
|
+
Requires-Dist: fastapi>=0.115; extra == 'dev'
|
|
27
|
+
Requires-Dist: httpx>=0.27; extra == 'dev'
|
|
28
|
+
Requires-Dist: langgraph>=0.2; extra == 'dev'
|
|
29
|
+
Requires-Dist: mcp>=2.3; extra == 'dev'
|
|
30
|
+
Requires-Dist: mypy>=1.11; extra == 'dev'
|
|
31
|
+
Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
35
|
+
Requires-Dist: starlette>=0.37; extra == 'dev'
|
|
36
|
+
Requires-Dist: types-jsonschema>=4.21; extra == 'dev'
|
|
37
|
+
Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
|
|
38
|
+
Requires-Dist: uvicorn>=0.30; extra == 'dev'
|
|
39
|
+
Requires-Dist: websockets>=12; extra == 'dev'
|
|
40
|
+
Provides-Extra: langgraph
|
|
41
|
+
Requires-Dist: langgraph>=0.2; extra == 'langgraph'
|
|
42
|
+
Provides-Extra: mcp
|
|
43
|
+
Requires-Dist: mcp>=2.3; extra == 'mcp'
|
|
44
|
+
Provides-Extra: otel
|
|
45
|
+
Requires-Dist: starlette>=0.37; extra == 'otel'
|
|
46
|
+
Requires-Dist: uvicorn>=0.30; extra == 'otel'
|
|
47
|
+
Provides-Extra: postgres
|
|
48
|
+
Requires-Dist: psycopg[binary]>=3.2; extra == 'postgres'
|
|
49
|
+
Provides-Extra: proxy
|
|
50
|
+
Requires-Dist: httpx>=0.27; extra == 'proxy'
|
|
51
|
+
Requires-Dist: starlette>=0.37; extra == 'proxy'
|
|
52
|
+
Requires-Dist: uvicorn>=0.30; extra == 'proxy'
|
|
53
|
+
Description-Content-Type: text/markdown
|
|
54
|
+
|
|
55
|
+
# TruAssure: Enterprise Agentic Quality Engineering Accelerator
|
|
56
|
+
|
|
57
|
+
TruAssure is a black-box, evidence-based quality engineering framework for AI agents of any kind:
|
|
58
|
+
conversational assistants, coded task agents (LangGraph, OpenAI Agents SDK, custom loops), agentic
|
|
59
|
+
applications and multi-agent orchestrations.
|
|
60
|
+
|
|
61
|
+
For each run it answers questions without relying on the agent's own account of itself:
|
|
62
|
+
|
|
63
|
+
- Did the agent understand the task?
|
|
64
|
+
- Did it plan sensibly?
|
|
65
|
+
- Did it take only allowed and correct actions?
|
|
66
|
+
- Did it leave the environment in the right end state?
|
|
67
|
+
- Did it report truthfully what it did?
|
|
68
|
+
|
|
69
|
+
It also checks whether the agent behaves reliably (pass^k), robustly (input perturbations, injected faults)
|
|
70
|
+
and the same way across deployments (parity).
|
|
71
|
+
|
|
72
|
+
> **Status: pre-alpha, phase 2 of 6 done.**
|
|
73
|
+
> - **Core engine:** episode runner, evidence store, five-stage evaluation with the evidence seams, Wilson
|
|
74
|
+
> ranges, and `ta run|show|report|gc`.
|
|
75
|
+
> - **Regression gate:** TruAssure reproduces the reference verdicts on 4,221 stored chat turns.
|
|
76
|
+
> - **Live runs:** it drives the real chat assistant on Docker (`SUT/`) through its chat channel.
|
|
77
|
+
>
|
|
78
|
+
> See [Validated on](#validated-on) for what has been checked and how.
|
|
79
|
+
> [docs/planning/PLAN.md](docs/planning/PLAN.md) has the full plan and [docs/brief/BRIEF.md](docs/brief/BRIEF.md)
|
|
80
|
+
> the original brief.
|
|
81
|
+
|
|
82
|
+
## How it judges an agent
|
|
83
|
+
|
|
84
|
+
- **Episode:** a task given to an agent in a prepared environment, run until it finishes, times out or runs
|
|
85
|
+
out of budget.
|
|
86
|
+
- **Checkpoint:** a point where the episode is judged. A chat has one per user turn; a task agent usually has
|
|
87
|
+
one at the end.
|
|
88
|
+
|
|
89
|
+
Each checkpoint gets a verdict at five stages, and records the first stage that failed:
|
|
90
|
+
|
|
91
|
+
| # | Stage | Question |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| 1 | Goal | What did the agent decide the task was (an intent, a routing decision)? |
|
|
94
|
+
| 2 | Plan | Were the steps, handoffs, loops, termination and approvals sensible? |
|
|
95
|
+
| 3 | Action | Was every action correct, authorised and given the right arguments? |
|
|
96
|
+
| 4 | End state | Is the database, file tree, git repository or SaaS system right afterwards? |
|
|
97
|
+
| 5 | Output | Is the reply, artifact or pull request right, and consistent with what was actually done? |
|
|
98
|
+
|
|
99
|
+
TruAssure gathers evidence from independent sources and keeps each source apart:
|
|
100
|
+
|
|
101
|
+
- the agent's own trace;
|
|
102
|
+
- an observer at the action boundary (an MCP or REST recording proxy, OpenTelemetry GenAI spans, or an
|
|
103
|
+
agent-to-agent tap);
|
|
104
|
+
- before and after snapshots of the system of record;
|
|
105
|
+
- the agent's outputs.
|
|
106
|
+
|
|
107
|
+
It cross-checks these sources against each other through the evidence seams:
|
|
108
|
+
|
|
109
|
+
- **SE-01** trace vs observer
|
|
110
|
+
- **SE-02** authorisation vs state
|
|
111
|
+
- **SE-03** silent write
|
|
112
|
+
- **SE-04** phantom success
|
|
113
|
+
- **SE-05** output vs action
|
|
114
|
+
- **SE-06** deployment parity
|
|
115
|
+
- **SE-07** identity propagation, a TruAssure extension that is not counted among the catalogue's 71 types
|
|
116
|
+
|
|
117
|
+
A grader that can't reach a verdict reports *not evaluated*, which counts as a failure, never a pass.
|
|
118
|
+
|
|
119
|
+
Every failure carries a structured code (for example `ACTION.FORBIDDEN_CALLED` or `SE-03.SILENT_WRITE`, listed
|
|
120
|
+
in [`codes.py`](src/truassure/core/codes.py)), so severity rules, the scorecard and release gates can match on
|
|
121
|
+
codes rather than message text.
|
|
122
|
+
|
|
123
|
+
An agent that exposes no trace of its own can still be tested ("black-box mode"). In that mode its actions
|
|
124
|
+
come from the observers only, and the goal stage reports *not evaluated*.
|
|
125
|
+
|
|
126
|
+
## Layout
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
src/truassure/
|
|
130
|
+
core/ model, Protocols, catalog + JSON Schema, compiler, runner, stages/, stats, store, security,
|
|
131
|
+
runlock, report, CLI; run-level analysis: reliability (pass^k), robustness, compare (parity),
|
|
132
|
+
scorecard/ (the test-type catalogue), governance/ (defects, JUnit, packs, release gate),
|
|
133
|
+
calibration, ci (pipeline templates). Imports only stdlib, PyYAML, jsonschema
|
|
134
|
+
adapters/ drivers, observers, state, graders (framework-specific code lives here)
|
|
135
|
+
profiles/ conversational (incl. the suite-catalog translator), task, workflow
|
|
136
|
+
testing/ fakes of every Protocol, the contract-suite harness, and a scripted agent for offline runs
|
|
137
|
+
tests/ unit/ contract/ golden/ e2e/ pilots/
|
|
138
|
+
pilots/ the pilot catalogs (claims/: pilot 1, desk/: pilot 2) and the grader calibration set
|
|
139
|
+
tools/ check_core_imports.py (the core layering rule, an allow-list)
|
|
140
|
+
make_golden.py, make_reference_corpus.py, make_reference_runlevel.py (reference outputs
|
|
141
|
+
from the source functions, for the regression gate; dev-only)
|
|
142
|
+
scripts/ setup / test / lint, smoke-chat, pilot-claims, pilot-desk, as .bat and .sh pairs
|
|
143
|
+
docs/ brief/ (original brief and prompt) planning/ (PLAN.md)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Quick start
|
|
147
|
+
|
|
148
|
+
**Start here:**
|
|
149
|
+
|
|
150
|
+
- **Demo runbook:** [`docs/demo/TruAssure-Demo-Runbook.html`](docs/demo/TruAssure-Demo-Runbook.html), a self-contained
|
|
151
|
+
page that walks through every feature, step by step, with expected output.
|
|
152
|
+
- **Client overview:** [`docs/client/TruAssure-Client-Overview.html`](docs/client/TruAssure-Client-Overview.html),
|
|
153
|
+
covering features, business value and use cases.
|
|
154
|
+
- **One script for everything:** `scripts\truassure-ops.bat` (Windows) or `sh scripts/truassure-ops.sh`.
|
|
155
|
+
- `setup`: every virtual environment.
|
|
156
|
+
- `lint`, `test-all`, `test-sut all`: TruAssure's and each SUT's tests.
|
|
157
|
+
- `deploy all`, `status`, `launch all`: the SUTs on Docker Desktop.
|
|
158
|
+
- `pilots`: the live runs.
|
|
159
|
+
- `demo`: an offline tour.
|
|
160
|
+
- `console`: browse runs, reports, comparisons and gates in the browser.
|
|
161
|
+
- `mcp`: serve TruAssure to an AI assistant over MCP.
|
|
162
|
+
- `build`: build the wheel and smoke-test it in a clean venv.
|
|
163
|
+
- `help`: every command.
|
|
164
|
+
- **Launchers:** `scripts\launch-console.bat` (the console over `ta_runs`), `scripts\launch-demo.bat` (the
|
|
165
|
+
offline demo, then the console over its runs) and `scripts\launch-mcp.bat` (the MCP server), each with a
|
|
166
|
+
`.sh` twin.
|
|
167
|
+
|
|
168
|
+
```bat
|
|
169
|
+
scripts\setup.bat :: or: sh scripts/setup.sh
|
|
170
|
+
scripts\test.bat -q :: tests + the 95% line-and-branch coverage gate
|
|
171
|
+
scripts\lint.bat :: ruff, ruff format --check, mypy --strict, core import rule
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
The CLI is `truassure`, with `ta` as a short alias:
|
|
175
|
+
|
|
176
|
+
```bat
|
|
177
|
+
ta --version
|
|
178
|
+
ta validate tests\fixtures\catalogs\task.yaml
|
|
179
|
+
ta translate C:\myprojects\tool-calling-chatbot\qa\test_catalog.yaml --yaml -o catalog.yaml
|
|
180
|
+
|
|
181
|
+
:: run a catalog against an environment (here: the built-in scripted demo agent)
|
|
182
|
+
ta run tests\fixtures\catalogs\e2e_demo.yaml --env truassure.testing.scripted:demo_environment --perturbations all --repeats 3
|
|
183
|
+
ta show :: list runs
|
|
184
|
+
ta show latest :: one run: per-case stages, result, Wilson range, reasons
|
|
185
|
+
ta report latest :: write the run's self-contained HTML report
|
|
186
|
+
ta gc --days 30 :: retention: delete runs older than 30 days
|
|
187
|
+
|
|
188
|
+
:: run-level analysis and governance
|
|
189
|
+
ta compare A B :: checkpoint by checkpoint; across deployments, parity against a noise floor (SE-06)
|
|
190
|
+
ta defects latest :: the defect list (severity by failure code), defects.json and .csv
|
|
191
|
+
ta junit latest --flaky skip --baseline <run> :: JUnit XML for CI; only regressions fail with a baseline
|
|
192
|
+
ta scorecard latest :: the run against the 71-type catalogue (measured only with evidence)
|
|
193
|
+
ta pack claims.intake :: a capability pack: ready / not ready
|
|
194
|
+
ta gate latest --policy truassure-gate.yaml :: the release gate; exit 1 when a rule fails
|
|
195
|
+
ta calibrate pilots\calibration\harbor-consistency.yaml --grader <module:Class> :: CE-02: Cohen's kappa
|
|
196
|
+
ta init --ci github --catalog <catalog> --env <factory> :: a pipeline that runs, reports and gates
|
|
197
|
+
|
|
198
|
+
:: browse and automate
|
|
199
|
+
ta console --open :: local console on 127.0.0.1 with a one-time URL token
|
|
200
|
+
ta mcp :: MCP server over stdio: one tool per command (install the 'mcp' extra)
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**The report** (`ta report`) is one HTML file with everything inlined. It fetches nothing, so it works offline
|
|
204
|
+
and can be attached to a ticket. Its tabs are Overview (pass rates, first failing stage, pass^k decay,
|
|
205
|
+
robustness), Cases, Episodes, Scorecard, Defects, and Comparison and gate. For task and workflow episodes,
|
|
206
|
+
the Episodes tab sets what the agent reported beside what the independent sources (the proxy, spans, tap and
|
|
207
|
+
state diffs) recorded, with every checkpoint's verdict. Links such as `report.html#tab=episodes&case=ID` open a
|
|
208
|
+
case directly. The largest corpus run's report is about 0.4 MB.
|
|
209
|
+
|
|
210
|
+
**The console** (`ta console`) lists the runs in a folder and opens their reports, defect lists, scorecards and
|
|
211
|
+
gate verdicts; it also compares any two runs. It listens on `127.0.0.1` (another address needs
|
|
212
|
+
`--allow-remote`) and prints a URL with a random token. The first visit trades the token for an HttpOnly,
|
|
213
|
+
SameSite=Strict cookie, and every request without one is refused. It reads stored runs; it never starts one.
|
|
214
|
+
|
|
215
|
+
**The MCP server** (`ta mcp`) gives an AI assistant one tool per CLI command (`validate`, `translate`, `run`,
|
|
216
|
+
`show`, `report`, `compare`, `defects`, `junit`, `scorecard`, `pack`, `gate`, `calibrate`, `init`, `gc`).
|
|
217
|
+
Each tool's input schema is generated from the command's own arguments, so the two cannot drift; a test checks
|
|
218
|
+
they match. The long-running services (`proxy`, `otel`, `a2a`, `console`, `mcp`) are not tools. Every result
|
|
219
|
+
says that quoted agent evidence is data, not instructions. To add it to an MCP client:
|
|
220
|
+
|
|
221
|
+
```json
|
|
222
|
+
{ "mcpServers": { "truassure": { "command": "ta", "args": ["mcp"] } } }
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Every run's summary also carries its pass^k decay and its robustness across perturbations.
|
|
226
|
+
|
|
227
|
+
`--env` names a factory function (`package.module:function`) that returns an `Environment` for each worker:
|
|
228
|
+
the driver for your agent, its observers, its state adapters and an optional grader. The factory module can
|
|
229
|
+
sit in the current folder. Runs go to `./ta_runs`, or `$TA_RUNS_DIR`. `ta` reads settings and secrets from
|
|
230
|
+
the nearest `.env`, and real environment variables always win.
|
|
231
|
+
|
|
232
|
+
**Adapters available so far:**
|
|
233
|
+
- drivers: the chat driver (`adapters/drivers/chat_ws.py`; install the `chat` extra) and the HTTP task driver
|
|
234
|
+
(`adapters/drivers/http_task.py`; one POST per event or task);
|
|
235
|
+
- the recording MCP proxy, `ta proxy` (`adapters/observers/mcp_proxy.py`; install the `proxy` extra), and its
|
|
236
|
+
observer (`adapters/observers/proxy_log.py`), which also injects faults;
|
|
237
|
+
- the agent-to-agent tap, `ta a2a` (`adapters/observers/a2a_tap.py`): an HTTP relay in front of the agents that
|
|
238
|
+
receive handoffs, or an in-process hook for a message bus. It records each handoff with the member and permissions
|
|
239
|
+
read from the identity token, and injects agent faults. The MCP proxy reads identity tokens too
|
|
240
|
+
(`--identity-header`);
|
|
241
|
+
- the OpenTelemetry GenAI observer (`adapters/observers/otel_genai.py`; `execute_tool` spans from OTLP/JSON) and
|
|
242
|
+
an OTLP/HTTP receiver, `ta otel` (`adapters/observers/otel_receiver.py`; install the `otel` extra);
|
|
243
|
+
- state: SQLite (`adapters/state/sqlite.py`; read-only snapshots, row diffs, SQL checks), a file tree
|
|
244
|
+
(`adapters/state/filetree.py`; content-hash diffs, file checks) and git (`adapters/state/git.py`; refs and
|
|
245
|
+
working tree, branch, commit and message checks);
|
|
246
|
+
- the artifact grader (`adapters/graders/artifact_tests.py`; content checks, a Python test or a command);
|
|
247
|
+
- ready live environments: the chat assistant (`truassure.profiles.conversational.live:environment`), the
|
|
248
|
+
claims agent (`truassure.profiles.task.live:environment`) and the member desk
|
|
249
|
+
(`truassure.profiles.workflow.live:environment`).
|
|
250
|
+
|
|
251
|
+
Every run records the hash of `core/` it was judged with (`run.json`, `core`).
|
|
252
|
+
`ta run` exits 0 when every case passes, 1 when any case fails or is flaky, 2 on bad input, and 3 when the
|
|
253
|
+
environment is locked by another run. Add masking rules with `--mask LABEL=REGEX` (repeatable).
|
|
254
|
+
|
|
255
|
+
## Catalogs
|
|
256
|
+
|
|
257
|
+
Scenarios are written in YAML and validated by
|
|
258
|
+
[`scenario.schema.json`](src/truassure/core/catalog/schema/scenario.schema.json) (JSON Schema Draft 2020-12).
|
|
259
|
+
Each scenario names a profile, and each profile has its own rules:
|
|
260
|
+
|
|
261
|
+
- **conversational:** has `checkpoints`, each with a `prompt`.
|
|
262
|
+
- **task:** has an `event` or `task` input, plus `expect`.
|
|
263
|
+
- **workflow:** adds `agents`, a `principal` and the expected `handoffs`.
|
|
264
|
+
|
|
265
|
+
Keys starting with `x-` are allowed for your own extensions. See [`tests/fixtures/catalogs/`](tests/fixtures/catalogs)
|
|
266
|
+
for an example of each profile.
|
|
267
|
+
|
|
268
|
+
`ta translate` converts a suite catalog (suites -> cases, one chat per suite) to this format. It doesn't drop anything silently: keys it can't
|
|
269
|
+
map are kept under `source.unmapped`. It never copies passwords.
|
|
270
|
+
|
|
271
|
+
## Validated on
|
|
272
|
+
|
|
273
|
+
| Pilot | What it proves | Status |
|
|
274
|
+
|---|---|---|
|
|
275
|
+
| 3 · regression gate | Same verdicts as the reference verdicts stored with the sandbox runs | **passed:** 4,221 of 4,221 turns in 40 runs (stdio, HTTP and REST transports), and every run's per-case results and Wilson ranges |
|
|
276
|
+
| 1 · task agent | Generic core on an event-driven agent with no chat | **passed:** the 15-scenario catalog passes offline (20 of 20 episodes); each of 6 planted defects fires the right code at the right stage; live, it finds real agent defects (below) |
|
|
277
|
+
| 2 · multi-agent | Handoffs, identity propagation, cascading failure (SS-09) | **passed:** the 12-scenario catalog passes offline (15 of 15 episodes); each of 5 planted defects fires the right code at the right stage; pilots 1 and 2 pass on the same core hash (each run records it); live, it finds real defects (below) |
|
|
278
|
+
| 3 · run level (phase 5) | Same run-level results as the reference, on the same corpus | **passed:** 225 checks: pass^k, robustness, defect severities, JUnit decisions (every flaky mode, and with a baseline), every scorecard row of all 40 runs, and 19 run comparisons with their parity verdicts |
|
|
279
|
+
| 1 · parity (SE-06) | Two builds of the claims agent (plain loop, LangGraph) judged against a noise floor | **passed:** judged "holds" offline, and live on Azure (15 checkpoints; the one difference was within run-to-run noise) |
|
|
280
|
+
| report (phase 6) | Self-contained, offline HTML for the largest corpus run | **passed:** about 0.4 MB (limit 5 MB); nothing is fetched from the network ([`tests/golden/test_report_size.py`](tests/golden/test_report_size.py)) |
|
|
281
|
+
| MCP server (phase 6) | One tool per CLI command, driven by a real MCP client | **passed:** the tool inventory and every tool's arguments equal the CLI's ([`tests/e2e/test_mcp_server.py`](tests/e2e/test_mcp_server.py)) |
|
|
282
|
+
| wheel (phase 6) | `python -m build`, then the wheel alone in a clean venv | **passed** on Windows and Linux in CI ([`tools/wheel_smoke.py`](tools/wheel_smoke.py)): console scripts, packaged schema and catalogue, an offline run, report, gate and the MCP tool list |
|
|
283
|
+
|
|
284
|
+
**How the regression gate works**
|
|
285
|
+
- [`tools/make_reference_corpus.py`](tools/make_reference_corpus.py) turns the source project's stored
|
|
286
|
+
conversational runs into a corpus in [`tests/golden/reference/corpus`](tests/golden/reference/corpus). The
|
|
287
|
+
corpus is trimmed to what evaluation and run-level analysis read, masked, and about 1.1 MB.
|
|
288
|
+
- A run is admitted only if the reference code reproduces every one of its stored verdicts from those exact
|
|
289
|
+
inputs.
|
|
290
|
+
- TruAssure then has to give the same pass/fail, first failing stage, per-stage status, check counts and failure
|
|
291
|
+
codes on every turn ([`tests/golden/test_regression_gate.py`](tests/golden/test_regression_gate.py)).
|
|
292
|
+
- 11 runs were excluded because they had been judged against catalog edits that were never committed. The
|
|
293
|
+
[manifest](tests/golden/reference/corpus/manifest.json) lists each one with its reason.
|
|
294
|
+
- Run level: [`tools/make_reference_runlevel.py`](tools/make_reference_runlevel.py) runs the source's run-level
|
|
295
|
+
functions on the same corpus; [`tests/golden/test_runlevel_gate.py`](tests/golden/test_runlevel_gate.py) rebuilds
|
|
296
|
+
each run from TruAssure's own verdicts and must reproduce every result. The only allowed difference: types
|
|
297
|
+
TruAssure measures beyond the reference (AT-02, AT-06, AT-08, SS-03, SS-09, PO-03, CE-02) read "not run" where
|
|
298
|
+
the reference said "planned".
|
|
299
|
+
|
|
300
|
+
**Live smoke run** (`scripts\smoke-chat.bat <catalog> SRI GREET PRIVACY`): TruAssure drove the chat assistant
|
|
301
|
+
on Docker Desktop, with Azure OpenAI as the assistant's model.
|
|
302
|
+
- 22 of 23 checkpoints passed.
|
|
303
|
+
- The one failure was real agent behaviour: the assistant told a customer they had no policies without
|
|
304
|
+
looking them up first.
|
|
305
|
+
- The chat assistant has no tool-traffic observer, so the trace-vs-observer seam is not checked there.
|
|
306
|
+
|
|
307
|
+
**Pilot 1, the claims agent** ([`pilots/claims`](pilots/claims)): TruAssure drives the agent through its event API
|
|
308
|
+
and watches it through the recording proxy, the agent's OpenTelemetry GenAI spans, the claims database and the
|
|
309
|
+
letters folder.
|
|
310
|
+
- Offline (the scripted model, the whole stack in-process): all 20 episodes pass (15 scenarios, plus 5 perturbed
|
|
311
|
+
variants).
|
|
312
|
+
- Buggy build (`CLAIMS_DEFECTS`): six planted defects (silent write, phantom success, forbidden action, loop
|
|
313
|
+
past budget, an artifact that fails its tests, a trace that leaves calls out) each fail their scenario at the
|
|
314
|
+
planted stage with the planted code, offline. Live with Azure, the silent write and the trace omission fire
|
|
315
|
+
`SE-03` and `SE-01` (proxy and spans) the same way.
|
|
316
|
+
- Live (`scripts\pilot-claims.bat`, Docker Desktop, Azure OpenAI gpt-4.1), three full runs. Every failure
|
|
317
|
+
is real agent behaviour (in the third run, which also read the spans, they agreed with the agent's trace on
|
|
318
|
+
every episode):
|
|
319
|
+
- when the approval fails (tool error) or times out, it still writes the approval letter (every run);
|
|
320
|
+
- asked to approve $2,500 on a $1,800 claim, it approves $1,800 on its own instead of refusing (every run);
|
|
321
|
+
- for a claim already under review it sometimes also sends an acknowledgement letter, where the procedure
|
|
322
|
+
says to add a note only (2 of 3 runs).
|
|
323
|
+
|
|
324
|
+
**Pilot 2, the member desk** ([`pilots/desk`](pilots/desk)): TruAssure drives the triage agent, and watches the
|
|
325
|
+
three agents through the A2A tap (handoffs), the MCP proxy (tool calls), both reading the identity token on the
|
|
326
|
+
wire, and the desk database.
|
|
327
|
+
- Offline: all 15 episodes pass (12 scenarios, plus 3 perturbed variants). Five planted defects fail their
|
|
328
|
+
scenario at the planted stage with the planted code:
|
|
329
|
+
- handoff order: `PLAN.HANDOFF_ORDER`;
|
|
330
|
+
- a failure handed on: `PLAN.FAILURE_CASCADED`;
|
|
331
|
+
- a hop for another member: `SE-07.PRINCIPAL_MISMATCH`;
|
|
332
|
+
- no permission narrowing: `SE-07.PERMISSIONS_WIDENED`;
|
|
333
|
+
- a hidden hop: `PLAN.HANDOFF_MISSING` plus `SE-01`.
|
|
334
|
+
|
|
335
|
+
Live, the three agent-side defects fire the same codes.
|
|
336
|
+
- Live (`scripts\pilot-desk.bat`, Azure OpenAI gpt-4.1), two full runs. Every failure is agent behaviour:
|
|
337
|
+
- when billing fails, it still hands off to claims (SS-09) and opens no case, and triage tells the member "a
|
|
338
|
+
case has been opened" and gives the claim amount (both runs, in at least one of the two billing-failure
|
|
339
|
+
scenarios);
|
|
340
|
+
- when claims fails inside a two-part question, triage tells the member a case was opened when no agent opened
|
|
341
|
+
one (both runs);
|
|
342
|
+
- triage drops the amounts its specialists reported ("your balance and due date have been provided"): every
|
|
343
|
+
run on the two-part question, and 2 of 3 phrasings of the billing question in the first run.
|
|
344
|
+
|
|
345
|
+
**Grader calibration (CE-02)** on a labelled set of 24 output-vs-action items
|
|
346
|
+
([`pilots/calibration`](pilots/calibration)):
|
|
347
|
+
- The deterministic rules grader scores kappa 0.75 (agreement 0.875). It misses only what needs reading for meaning:
|
|
348
|
+
a denied record described anyway, a change claimed with no action, an approved amount stated as paid.
|
|
349
|
+
- The LLM grader (Azure OpenAI gpt-4.1) scored kappa 1.0, then 0.833 twice, over three runs. When it erred, it
|
|
350
|
+
missed a case "opened" with no action and policy numbers no action returned. Within a run, grading twice gave the
|
|
351
|
+
same verdicts.
|
|
352
|
+
|
|
353
|
+
Also checked:
|
|
354
|
+
- The ported primitives (`wilson`, `mentions`, `value_match`, `args_match`) give the same results as
|
|
355
|
+
the original source functions on the inputs in [the reference outputs](tests/golden/reference/primitives.json).
|
|
356
|
+
- The reference evaluation cases, expressed in the generic model, pass, including the per-stage check counts.
|
|
357
|
+
- 59 synthetic episodes (52 planted with one defect each, covering every stage check, seam and workflow check; 7
|
|
358
|
+
clean): every planted one fails at exactly the planted stage with the planted code; the clean ones pass.
|
|
359
|
+
- The translator converts the full Harbor Mutual sandbox catalog (93 cases) to a catalog that passes schema validation
|
|
360
|
+
(a test that runs when the catalog is present on the machine).
|
|
361
|
+
|
|
362
|
+
## Security defaults
|
|
363
|
+
|
|
364
|
+
- **In place:** PII is masked before any evidence is written. The default rules cover email addresses,
|
|
365
|
+
phone numbers and secret-named fields (password, token, API key, authorization). You can add your own
|
|
366
|
+
regex rules. Masking never changes the values that verdicts are computed on. `ta gc` applies retention.
|
|
367
|
+
- **Listeners:** the proxy, tap, OTel receiver and console bind to `127.0.0.1` by default; another address needs
|
|
368
|
+
`--allow-remote`. Their control endpoints need a token (`TA_PROXY_TOKEN`, `TA_OTEL_TOKEN` and the sandbox tokens; the
|
|
369
|
+
console makes its own per start). Secrets come only from the environment or `.env`, and are never printed.
|
|
370
|
+
- **MCP:** tool results are marked as untrusted data, because they can quote what an agent said.
|
|
371
|
+
- **Releases:** `.github/workflows/release.yml` publishes to PyPI with trusted publishing (no stored token),
|
|
372
|
+
only when a GitHub Release is published, through the `pypi` environment. Nothing has been published.
|
|
373
|
+
|
|
374
|
+
## Licence
|
|
375
|
+
|
|
376
|
+
MIT © 2026 Shan Konduru. All names and data in demos and fixtures belong to the fictitious company
|
|
377
|
+
*Harbor Mutual*.
|