agentfootprint 9.82.0 → 9.83.0

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/CLAUDE.md +1 -0
  3. package/README.md +15 -15
  4. package/ai-instructions/claude-code/SKILL.md +1 -1
  5. package/dist/core/Agent.js +33 -1
  6. package/dist/core/Agent.js.map +1 -1
  7. package/dist/core/agent/evidence/evidenceIndex.js +96 -11
  8. package/dist/core/agent/evidence/evidenceIndex.js.map +1 -1
  9. package/dist/core/agent/evidence/gate.js +66 -6
  10. package/dist/core/agent/evidence/gate.js.map +1 -1
  11. package/dist/core/agent/stages/route.js +71 -12
  12. package/dist/core/agent/stages/route.js.map +1 -1
  13. package/dist/esm/core/Agent.d.ts +4 -0
  14. package/dist/esm/core/Agent.js +33 -1
  15. package/dist/esm/core/Agent.js.map +1 -1
  16. package/dist/esm/core/agent/evidence/evidenceIndex.d.ts +91 -5
  17. package/dist/esm/core/agent/evidence/evidenceIndex.js +96 -11
  18. package/dist/esm/core/agent/evidence/evidenceIndex.js.map +1 -1
  19. package/dist/esm/core/agent/evidence/gate.d.ts +27 -0
  20. package/dist/esm/core/agent/evidence/gate.js +66 -6
  21. package/dist/esm/core/agent/evidence/gate.js.map +1 -1
  22. package/dist/esm/core/agent/evidence/types.d.ts +12 -0
  23. package/dist/esm/core/agent/stages/route.d.ts +6 -1
  24. package/dist/esm/core/agent/stages/route.js +69 -10
  25. package/dist/esm/core/agent/stages/route.js.map +1 -1
  26. package/dist/esm/core/agent/types.d.ts +66 -0
  27. package/dist/esm/index.d.ts +1 -0
  28. package/dist/esm/index.js +8 -0
  29. package/dist/esm/index.js.map +1 -1
  30. package/dist/esm/integrity/disposition/lifecycle.d.ts +17 -1
  31. package/dist/esm/integrity/disposition/lifecycle.js +26 -1
  32. package/dist/esm/integrity/disposition/lifecycle.js.map +1 -1
  33. package/dist/esm/integrity/finding/types.d.ts +12 -2
  34. package/dist/esm/integrity/finding/types.js.map +1 -1
  35. package/dist/esm/integrity/prior-turn-evidence/check.d.ts +145 -0
  36. package/dist/esm/integrity/prior-turn-evidence/check.js +200 -0
  37. package/dist/esm/integrity/prior-turn-evidence/check.js.map +1 -0
  38. package/dist/esm/lib/trace-toolpack/traceToolpack.js +3 -2
  39. package/dist/esm/lib/trace-toolpack/traceToolpack.js.map +1 -1
  40. package/dist/index.js +12 -3
  41. package/dist/index.js.map +1 -1
  42. package/dist/integrity/disposition/lifecycle.js +26 -1
  43. package/dist/integrity/disposition/lifecycle.js.map +1 -1
  44. package/dist/integrity/finding/types.js.map +1 -1
  45. package/dist/integrity/prior-turn-evidence/check.js +204 -0
  46. package/dist/integrity/prior-turn-evidence/check.js.map +1 -0
  47. package/dist/lib/trace-toolpack/traceToolpack.js +3 -2
  48. package/dist/lib/trace-toolpack/traceToolpack.js.map +1 -1
  49. package/dist/types/core/Agent.d.ts +4 -0
  50. package/dist/types/core/Agent.d.ts.map +1 -1
  51. package/dist/types/core/agent/evidence/evidenceIndex.d.ts +91 -5
  52. package/dist/types/core/agent/evidence/evidenceIndex.d.ts.map +1 -1
  53. package/dist/types/core/agent/evidence/gate.d.ts +27 -0
  54. package/dist/types/core/agent/evidence/gate.d.ts.map +1 -1
  55. package/dist/types/core/agent/evidence/types.d.ts +12 -0
  56. package/dist/types/core/agent/evidence/types.d.ts.map +1 -1
  57. package/dist/types/core/agent/stages/route.d.ts +6 -1
  58. package/dist/types/core/agent/stages/route.d.ts.map +1 -1
  59. package/dist/types/core/agent/types.d.ts +66 -0
  60. package/dist/types/core/agent/types.d.ts.map +1 -1
  61. package/dist/types/index.d.ts +1 -0
  62. package/dist/types/index.d.ts.map +1 -1
  63. package/dist/types/integrity/disposition/lifecycle.d.ts +17 -1
  64. package/dist/types/integrity/disposition/lifecycle.d.ts.map +1 -1
  65. package/dist/types/integrity/finding/types.d.ts +12 -2
  66. package/dist/types/integrity/finding/types.d.ts.map +1 -1
  67. package/dist/types/integrity/prior-turn-evidence/check.d.ts +146 -0
  68. package/dist/types/integrity/prior-turn-evidence/check.d.ts.map +1 -0
  69. package/dist/types/lib/trace-toolpack/traceToolpack.d.ts.map +1 -1
  70. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -7,6 +7,97 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [9.83.0] - 2026-09-03
11
+
12
+ ### Fixed
13
+
14
+ - **The evidence gate claimed a boundary it did not measure.** Both of its
15
+ user-facing sentences — the correction it sends the model
16
+ (`buildEvidenceCorrection`) and the warning it prints an operator
17
+ (`evidenceRefusalSentence`) — said the flagged values *"appear in NO tool
18
+ result **from this turn**"*. The index behind them has never been turn-scoped:
19
+ it walks every `role: 'tool'` turn in the history. The library was asserting a
20
+ scope it could not honour, in the two places that assertion is read.
21
+
22
+ Both now say what the check really reaches — *"appear in no tool result this
23
+ run read"* — which is both true and the stronger claim, and the operator
24
+ sentence adds the two facts a reader needs: that the corpus is the LIVE
25
+ WINDOW (a window strategy rewrites `scope.history` in place, so a dropped
26
+ result is not in it), and that `noticePriorTurnEvidence` is what answers the
27
+ recency question. The frame PREFIX is unchanged, so
28
+ `isLibraryAuthoredTurn` and every consumer matching on it are untouched.
29
+
30
+ ### Added
31
+
32
+ - **`noticePriorTurnEvidence` — the answer is grounded, and nothing this turn
33
+ fetched grounds it.** Default off.
34
+
35
+ The measured failure: a consumer's agent answered a data question with **zero
36
+ tool calls**, and the gate approved it — `LLM calls 1 · Tool calls 0 ·
37
+ Iterations 1`, then *"All 7 values in the answer were found in what the tools
38
+ returned — the answer stands."* They were found: in an inventory result from
39
+ four turns earlier, fetched for a different question. The user had asked about
40
+ array performance; the answer recommended enabling a collector that had been
41
+ running for months. Two turns did it back to back. Every rail passed honestly
42
+ — the gate measures GROUNDEDNESS and had no notion of WHEN a value was
43
+ grounded.
44
+
45
+ Every indexed form now carries the turn that last served it — one number,
46
+ stamped during the walk the index was already doing (`EvidenceCorpus.values`
47
+ became a `Map<form, turn>`; a TURN starts at each `role: 'user'` message the
48
+ library did not author). When at least one value in the answer is grounded and
49
+ **not one of them** came from the turn being answered, one `advisory` finding
50
+ is filed at the claim seam:
51
+
52
+ ```ts
53
+ const agent = Agent.create({ provider, model, noticePriorTurnEvidence: true })
54
+ .tool(arrayInventory)
55
+ .namesAndNumbersFromEvidence() // ← the other half: it owns the extractor
56
+ .build();
57
+
58
+ await agent.run('what arrays are there?'); // fetches, answers, files nothing
59
+ await agent.followUp('how is array performance?'); // no tool call, answers from turn 1
60
+ // → prior-turn-evidence: 3 grounded value(s), all last served in turn 1,
61
+ // and this turn called no tool at all.
62
+ ```
63
+
64
+ **The corpus is deliberately NOT narrowed to this turn.** That would have made
65
+ the old sentence true and been the wrong fix: *"and what about that disk?"*
66
+ leans on the previous turn's rows legitimately, and a check that cries wolf is
67
+ a check somebody switches off. ONE grounded value from this turn's own results
68
+ files nothing — not a threshold to tune, but the falsification of the claim
69
+ being tested. A follow-up that calls a tool usually gets that for free,
70
+ because a lookup keyed on an earlier identifier echoes it back.
71
+
72
+ A turn that served no tool results at all is the SAME finding with a stronger
73
+ witness, not a second kind: it is a cheaper proof of the identical fact.
74
+
75
+ **The ceiling** ships as `PRIOR_TURN_EVIDENCE_CEILING`, exported and quoted
76
+ verbatim into every message: referring back is indistinguishable, by evidence
77
+ alone, from going stale; the ordinals count only the turns still in the live
78
+ window, so the distance is a FLOOR (the boundary itself is exact — the
79
+ current request is un-droppable); and values that reached the model through
80
+ `.memory()` recall or RAG are exempt from grounding and invisible to it, so it
81
+ can under-report and never over-report.
82
+
83
+ **Two halves arm it**, and the second is structural rather than a policy
84
+ companion: the dial AND `.namesAndNumbersFromEvidence()`, whose extractor
85
+ decides which tokens in an answer are values at all. It REPORTS — whether an
86
+ answer is advised or refused stays the gate's own `posture` decision, and
87
+ nothing here blocks, revises or rewrites anything. Absent, a run is
88
+ byte-identical save the registered `prior-turn-evidence` row filed
89
+ `not-applicable`, which is the family's law rather than an exception to it.
90
+
91
+ Three terminal exits reach a caller without the gate ever producing a
92
+ grounding reading — an empty answer, a middleware denial, and an answer the
93
+ output schema rejected — and each files its disposition rather than leaving
94
+ the armed row untouched. An untouched armed row is what `assertAlive` reads
95
+ as wiring rot, so without this an empty answer under
96
+ `integrityPosture: 'dev'` would have failed a healthy run with
97
+ `CheckerDeadError`.
98
+
99
+ Docs: [Prior-turn evidence](https://agentfootprint.dev/docs/monitor/prior-turn-evidence).
100
+
10
101
  ## [9.82.0] - 2026-08-30
11
102
 
12
103
  ### Added
package/CLAUDE.md CHANGED
@@ -53,6 +53,7 @@ not in this table, search `src/index.ts` for the nearest noun before writing cod
53
53
  | the model inventing an id or a reading that no tool ever returned — a deterministic fabrication detector on the final answer, with a posture for how hard it pushes back | `.namesAndNumbersFromEvidence()` + `posture` (`'assist'` record+flag, the default / `'guard'` one revision then ship flagged / `'rails'` refuse instead) + `shapes` + `exempt` + `minDigits` (default 4) + `nudge` (default off) | `src/core/agent/evidence/` | 9.35.0 |
54
54
  | counting a HUMAN-VERIFIED value as ground for the choice-seam check — the person clicked a row, the app verified the cells against the artifact, and the id the model takes from that selection is not fabricated; the source label travels onto the record | `externalGrounds` + `ExternalGround` + `external_ground_used` | `src/integrity/unsupported-argument/check.ts` | 9.72.0 |
55
55
  | a lookup tool that answers "nothing found" for EVERY id because a filter broke, and an agent reporting that absence as fact — the run itself produced the id, the lookup came back empty, and that PAIR is worth a look | `noticeEmptyLookups` + `readLookupResult` + `EMPTY_LOOKUP_CEILING` (dial default OFF and needs a tool declaring `argumentsFrom` too — two halves; kind `empty-lookup` at seam `write`, always `advisory: true`; empty = a zero-length ARRAY or an `absent()` envelope, every other shape files `not-applicable` and no finding; the ceiling is quoted verbatim into every message) | `src/integrity/empty-lookup/` | 9.77.0 |
56
+ | an agent answering a NEW question out of an OLD turn's tool results — grounded, four turns stale, and the evidence gate approving it (`Tool calls 0` and "all 7 values were found in what the tools returned"). ALSO the bug half: the gate's two sentences claimed the flagged values "appear in no tool result FROM THIS TURN" while its index walked every `role:'tool'` turn — a boundary asserted and never measured; both now say "no tool result this run read" | `noticePriorTurnEvidence` + `PRIOR_TURN_EVIDENCE_CEILING` + `priorTurnEvidenceOf` + `AnswerGroundingReading` (dial default OFF and needs `.namesAndNumbersFromEvidence()` too — two halves, and the second is structural: the gate owns the extractor that decides which tokens are values; kind `prior-turn-evidence` at seam `claim`, always `advisory: true`; `EvidenceCorpus.values` became a `Map<form, turn>` stamped in the walk that was already happening, a TURN = each `role:'user'` message `isLibraryAuthoredTurn` did NOT write (counting the gate's own correction would file against every revised answer); fires when ≥1 value is grounded and NOT ONE came from the turn being answered — ONE current-turn value files nothing, which is what keeps an honest follow-up quiet and is the design's falsification test; the zero-tool-call turn is the SAME kind with a stronger witness, not a second kind; corpus is the LIVE WINDOW so ordinals are window-relative and the distance is a FLOOR, while the boundary stays exact (`'current-request'` is un-droppable); memory/RAG values are exempt from grounding and invisible — it can under-report, never over-report; the ceiling is quoted verbatim into every message) | `src/integrity/prior-turn-evidence/` | 9.83.0 |
56
57
  | a tool's ROWS quietly disagreeing with what the tool promised — a LUN 0 stored as `""` because it is falsy, a numeric column arriving as quoted strings, a declared column present in no row at all | `Tool.resultColumns` + `checkColumnTypes` + `COLUMN_TYPE_CEILING` + `readRowset` (dial `'off'` (default) / `'warn'` (file findings, model reads the rows unchanged) / `'enforce'` (refuse the rows, `resultCeiling`'s teaching-sentence idiom, delivered status `'invalid'`) — the `toolArgsValidation` trio, this seam's mirror; needs a tool declaring `resultColumns` too — two halves; types `number`/`string`/`boolean`/`date`, bare word or `{type, nullable}`, deliberately NO `'unknown'`; OPEN — unlisted columns allowed and unjudged; TWO kinds at seam `write` — `column-type-mismatch` (there, wrong type) vs `missing-column` (declared, in no row); rowset = an ARRAY OF PLAIN OBJECTS with ≥1 row, everything else incl. the ZERO-ROW result files `not-applicable` (empty is `empty-lookup`'s subject); travels MCP `_meta`; the ceiling is quoted verbatim into every message) | `src/integrity/column-types/` | 9.78.0 |
57
58
  | a model head-mathing a total from tool-result numbers while a compute tool sits unused on the wire — a LATE line each iteration naming the staged refs and the `wants` tool that spends them (recency working FOR the instruction), plus the revise correction naming the same route | `nudge: true` (default off) + `stagedRefsNudgeLine` + `findStagedRefs` + `grounding_nudged` | `src/core/agent/stagedRefs.ts` | 9.75.0 |
58
59
  | a tool answering "I looked and found nothing", routably | `absent` + `looked_for` + `checked`/`not_checked`/`cannot_cover` + `tryInstead` (delivered status `'absent'`, routable by `onToolStatus`) | `src/core/agent/coverage/absent.ts` | 9.43.0 |
package/README.md CHANGED
@@ -121,7 +121,7 @@ This is the step that makes "the test run and the production run are the same co
121
121
 
122
122
  `ollama()` talks Ollama's native API directly, so there's nothing to install on this side, streamed calls report real token counts (so `.compaction()` and cost budgets work), and when it can't work it says why in words that contain the fix — `ollama serve` when nothing is listening, `ollama pull <model>` when the model isn't there, never a raw connection error and never a hang.
123
123
 
124
- For llama.cpp's `llama-server`, vLLM, Together or Groq, use `openai({ baseURL: 'http://localhost:8080/v1', apiKey: 'not-needed', defaultModel: '…' })` — any server speaking the OpenAI Chat Completions API, same `Agent` code either way. Full recipes: [Ollama guide](https://footprintjs.github.io/agentfootprint/docs/build/ollama/) · [OpenAI-compatible endpoints](https://footprintjs.github.io/agentfootprint/docs/build/openai/#openai-compatible-endpoints-ollama-llamacpp-vllm-together-groq-lm-studio).
124
+ For llama.cpp's `llama-server`, vLLM, Together or Groq, use `openai({ baseURL: 'http://localhost:8080/v1', apiKey: 'not-needed', defaultModel: '…' })` — any server speaking the OpenAI Chat Completions API, same `Agent` code either way. Full recipes: [Ollama guide](https://agentfootprint.dev/docs/build/ollama/) · [OpenAI-compatible endpoints](https://agentfootprint.dev/docs/build/openai/#openai-compatible-endpoints-ollama-llamacpp-vllm-together-groq-lm-studio).
125
125
 
126
126
  ### Then add context
127
127
 
@@ -591,7 +591,7 @@ const reflexion = Loop.create()
591
591
  | 2 | 12 tools shown | **5 tools** (skill activated) |
592
592
  | 3 | 12 tools shown | 5 tools |
593
593
 
594
- > 📖 [Dynamic ReAct guide](https://footprintjs.github.io/agentfootprint/docs/build/dynamic-react/) · [Key concepts](https://footprintjs.github.io/agentfootprint/docs/getting-started/key-concepts/)
594
+ > 📖 [Dynamic ReAct guide](https://agentfootprint.dev/docs/build/dynamic-react/) · [Key concepts](https://agentfootprint.dev/docs/getting-started/key-concepts/)
595
595
 
596
596
  ### Multi-agent — compose with the alphabet
597
597
 
@@ -635,7 +635,7 @@ The patterns the field knows reduce to the same alphabet:
635
635
 
636
636
  Same trick as the injection model: instead of N libraries for N patterns, we found the M building blocks all N patterns are made of.
637
637
 
638
- > 📖 Compare: [hand-rolled vs declarative](https://footprintjs.github.io/agentfootprint/docs/getting-started/why/) · [migration from LangChain / CrewAI / LangGraph](https://footprintjs.github.io/agentfootprint/docs/getting-started/vs/)
638
+ > 📖 Compare: [hand-rolled vs declarative](https://agentfootprint.dev/docs/getting-started/why/) · [migration from LangChain / CrewAI / LangGraph](https://agentfootprint.dev/docs/getting-started/vs/)
639
639
 
640
640
  ### Check in with the receipts — human-in-the-loop consent for consequential actions
641
641
 
@@ -663,7 +663,7 @@ Run the flagship demo — an AI coworker that drafts a weekly status doc and che
663
663
  npm run example examples/features/34-checkin-coworker.ts -- --decline
664
664
  ```
665
665
 
666
- See the [Check-in guide](https://footprintjs.github.io/agentfootprint/docs/monitor/checkin/).
666
+ See the [Check-in guide](https://agentfootprint.dev/docs/monitor/checkin/).
667
667
 
668
668
  ### Act — everything your agent does about its own loop, in one block
669
669
 
@@ -697,7 +697,7 @@ It is pure sugar over the five individual doors, pinned byte-equivalent per key
697
697
  npm run example examples/features/38-act.ts
698
698
  ```
699
699
 
700
- See [The moments of the loop](https://footprintjs.github.io/agentfootprint/docs/build/loop-moments/).
700
+ See [The moments of the loop](https://agentfootprint.dev/docs/build/loop-moments/).
701
701
 
702
702
  ### Watch — who is looking while it does
703
703
 
@@ -774,7 +774,7 @@ answers at the cheap model's price inside the expensive conversation.
774
774
  [`08`](examples/observability/08-self-explain.ts) · the doors walk the
775
775
  [**same evidence the board visualizes ▶**](https://footprintjs.github.io/agentThinkingUI/demo/backtrack.html).
776
776
 
777
- > 📖 Powered by [footprintjs `causalChain()`](https://footprintjs.github.io/footPrint/blog/backward-causal-chain/) — backward thin-slicing on the commit log. [Causal memory deep dive](https://footprintjs.github.io/agentfootprint/docs/debug/causal-deep-dive/) · [Explainability & compliance](https://footprintjs.github.io/footPrint/blog/explainability-compliance/)
777
+ > 📖 Powered by [footprintjs `causalChain()`](https://footprintjs.github.io/footPrint/blog/backward-causal-chain/) — backward thin-slicing on the commit log. [Causal memory deep dive](https://agentfootprint.dev/docs/debug/causal-deep-dive/) · [Explainability & compliance](https://footprintjs.github.io/footPrint/blog/explainability-compliance/)
778
778
 
779
779
  **One recording. Two lenses. Three consumers. Zero extra instrumentation.**
780
780
 
@@ -898,7 +898,7 @@ The flowchart, recorders, and tests don't change between dev and prod.
898
898
  | `anthropic` | Claude (Sonnet, Opus, Haiku) via `@anthropic-ai/sdk` |
899
899
  | `openai` | GPT-4o, GPT-4-turbo via `openai` SDK |
900
900
  | `bedrock` | Claude / Titan / Mistral via AWS Bedrock runtime |
901
- | `gemini` | Gemini via `@google/genai` — two doors, **Vertex** (project + ADC) or the Gemini API (one key). Not every door/model pair works: read the [door/model matrix](https://footprintjs.github.io/agentfootprint/docs/infrastructure/google-cloud/#the-doormodel-matrix) first |
901
+ | `gemini` | Gemini via `@google/genai` — two doors, **Vertex** (project + ADC) or the Gemini API (one key). Not every door/model pair works: read the [door/model matrix](https://agentfootprint.dev/docs/infrastructure/google-cloud/#the-doormodel-matrix) first |
902
902
  | `ollama` | Local models, over Ollama's native API — no SDK, no key, real token counts, refusals that name `ollama serve` / `ollama pull` · `openai({ baseURL })` reaches llama.cpp, vLLM, and any other OpenAI-compatible endpoint |
903
903
  | `browserAnthropic` | Browser-side Claude calls (no proxy server) |
904
904
  | `browserOpenai` | Browser-side OpenAI calls (no proxy server) |
@@ -916,7 +916,7 @@ The flowchart, recorders, and tests don't change between dev and prod.
916
916
  - Skill artifact vocabularies — a skill or a step declares `produces` / `consumes` (artifact kinds), and `graph.checkup()` warns `artifact-kind-unsatisfied` when nothing on the agent claims to make what a consumer needs. Honest by construction: a warning, never an error, because it reads declarations only and artifacts outlive the turn that made them
917
917
  - Human-in-the-loop pause / resume — a tool calls `pauseHere(...)` (or `askHuman(...)`); `isPaused(result)` hands you a JSON-serializable checkpoint, and `agent.resume(checkpoint, input)` continues hours later on a different server
918
918
  - Resilience primitives — `withRetry`, `withFallback`, `withCircuitBreaker`, `.outputFallback`, `agent.resumeOnError`
919
- - Context Integrity — deterministic checks at the seams where a run contradicts ITSELF: a tool parked but still on the wire, a tool offered after the results grounding it were evicted, an answer field that disagrees with the fact it claims to report (`.claims()`, requires `.outputSchema()`). Nothing is blocked or rewritten — each defect is one typed finding, and every run files a disposition ledger so "no findings" and "no check ran" stay different states. `integrityPosture: 'dev'` adds the liveness proofs (a start-of-run canary; `CheckerDeadError` instead of a green report from a checker that never ran). Read it back with `find_context_errors` over a recording — [Context Integrity](https://footprintjs.github.io/agentfootprint/docs/monitor/context-integrity/)
919
+ - Context Integrity — deterministic checks at the seams where a run contradicts ITSELF: a tool parked but still on the wire, a tool offered after the results grounding it were evicted, an answer field that disagrees with the fact it claims to report (`.claims()`, requires `.outputSchema()`). Nothing is blocked or rewritten — each defect is one typed finding, and every run files a disposition ledger so "no findings" and "no check ran" stay different states. `integrityPosture: 'dev'` adds the liveness proofs (a start-of-run canary; `CheckerDeadError` instead of a green report from a checker that never ran). Read it back with `find_context_errors` over a recording — [Context Integrity](https://agentfootprint.dev/docs/monitor/context-integrity/)
920
920
  - 60+ typed observability events — `agent` · `composition` · `context` · `stream` · `tools` · `skill` · `memory` · `cache` · `cost` · `permission` · `eval` · `embedding` · `pause` · `error` · `fallback` · `resilience` · `reliability` · `risk`
921
921
 
922
922
  **Debugging & compliance** (`agentfootprint/observe`)
@@ -934,7 +934,7 @@ The flowchart, recorders, and tests don't change between dev and prod.
934
934
 
935
935
  </details>
936
936
 
937
- > 📖 [Agent API reference](https://footprintjs.github.io/agentfootprint/docs/api/classes/Agent/) · [CHANGELOG](./CHANGELOG.md)
937
+ > 📖 [Agent API reference](https://agentfootprint.dev/docs/api/classes/Agent/) · [CHANGELOG](./CHANGELOG.md)
938
938
 
939
939
  ---
940
940
 
@@ -942,12 +942,12 @@ The flowchart, recorders, and tests don't change between dev and prod.
942
942
 
943
943
  | If you are... | Go here |
944
944
  |---|---|
945
- | New to agents | [5-minute quick start](https://footprintjs.github.io/agentfootprint/docs/getting-started/quick-start/) |
946
- | Coming from LangChain / CrewAI / LangGraph | [Migration guide](https://footprintjs.github.io/agentfootprint/docs/getting-started/vs/) |
947
- | Architecting an enterprise rollout | [Production guide](https://footprintjs.github.io/agentfootprint/docs/monitor/deployment/) |
948
- | Doing due diligence | [Architecture overview](https://footprintjs.github.io/agentfootprint/docs/reference/dependency-graph/) |
949
- | Researcher / academic background | [Citations & prior art](https://footprintjs.github.io/agentfootprint/docs/reference/citations/) |
950
- | Curious about design | [Inspiration docs](https://footprintjs.github.io/agentfootprint/docs/reference/inspiration/) |
945
+ | New to agents | [5-minute quick start](https://agentfootprint.dev/docs/getting-started/quick-start/) |
946
+ | Coming from LangChain / CrewAI / LangGraph | [Migration guide](https://agentfootprint.dev/docs/getting-started/vs/) |
947
+ | Architecting an enterprise rollout | [Production guide](https://agentfootprint.dev/docs/monitor/deployment/) |
948
+ | Doing due diligence | [Architecture overview](https://agentfootprint.dev/docs/reference/dependency-graph/) |
949
+ | Researcher / academic background | [Citations & prior art](https://agentfootprint.dev/docs/reference/citations/) |
950
+ | Curious about design | [Inspiration docs](https://agentfootprint.dev/docs/reference/inspiration/) |
951
951
 
952
952
  Or jump into the [examples gallery](https://github.com/footprintjs/agentfootprint/tree/main/examples) — every example is also an end-to-end CI test.
953
953
 
@@ -309,7 +309,7 @@ if (!report.ok) throw new Error(formatCheckup(report));
309
309
  The full architecture of the skill graph — the three surfaces, the authority rule, the
310
310
  nine cursor causes, the three-way `read_skill`, and a worked refusal taken from a real
311
311
  run — is published as **Skill graph architecture**:
312
- <https://footprintjs.github.io/agentfootprint/docs/build/skill-graph-architecture/>.
312
+ <https://agentfootprint.dev/docs/build/skill-graph-architecture/>.
313
313
  Every capability claim there carries a status — `shipped` / `opt-in` /
314
314
  `application-provided` / `planned` — and every code block is type-checked against the
315
315
  shipped types at build. Read it rather than this file when the question is "how does
@@ -315,6 +315,10 @@ class Agent extends RunnerBase_js_1.RunnerBase {
315
315
  /** See AgentOptions.noticeEmptyLookups (9.77.0). Default false — absent is
316
316
  * byte-identical, save for the registered not-applicable ledger row. */
317
317
  noticeEmptyLookups = false;
318
+ /** See AgentOptions.noticePriorTurnEvidence (9.83.0). Default false —
319
+ * absent is byte-identical, save for the registered not-applicable ledger
320
+ * row. */
321
+ noticePriorTurnEvidence = false;
318
322
  /** Set at chart build: whether any tool in the FULL declared catalog
319
323
  * declared `resultColumns` (9.78.0) — the other half of the column-type
320
324
  * contract's arming. */
@@ -682,6 +686,22 @@ class Agent extends RunnerBase_js_1.RunnerBase {
682
686
  }
683
687
  this.noticeEmptyLookups = opts.noticeEmptyLookups;
684
688
  }
689
+ // The claim seam's recency dial (9.83.0) — refused at construction for
690
+ // the same reason as the write-seam one above: a truthy non-boolean here
691
+ // would silently arm a check the author only half asked for, and the
692
+ // arming is what decides whether a run is byte-identical to the one
693
+ // before it.
694
+ if (opts.noticePriorTurnEvidence !== undefined) {
695
+ if (typeof opts.noticePriorTurnEvidence !== 'boolean') {
696
+ throw new Error(`Agent: noticePriorTurnEvidence must be a boolean, got ` +
697
+ `${JSON.stringify(opts.noticePriorTurnEvidence)}. It arms the claim-seam ` +
698
+ `'prior-turn-evidence' advisory — a final answer whose every value was last served ` +
699
+ `before this turn — and it needs \`.namesAndNumbersFromEvidence()\` armed beside ` +
700
+ `it, because that gate owns the extractor that decides which tokens are values. ` +
701
+ `Omit it (or pass false) and no such advisory is ever filed.`);
702
+ }
703
+ this.noticePriorTurnEvidence = opts.noticePriorTurnEvidence;
704
+ }
685
705
  // The column-type contract's dial (9.78.0) — refused at construction for
686
706
  // the same reason as the postures above, and with one more: `'enforce'`
687
707
  // REFUSES tool results, so a misspelling silently downgraded to off would
@@ -2389,6 +2409,12 @@ class Agent extends RunnerBase_js_1.RunnerBase {
2389
2409
  // AND a tool declaring `resultColumns`. Either alone leaves two
2390
2410
  // registered `not-applicable` rows.
2391
2411
  columnTypes: this.checkColumnTypes !== 'off' && this.integrityColumnsPresent,
2412
+ // TWO HALVES (9.83.0), and here the second is structural rather than
2413
+ // a policy choice: the evidence gate owns the extractor that decides
2414
+ // which tokens in an answer are values, so a dial with no gate has
2415
+ // nothing whose provenance it could read. Either alone leaves a
2416
+ // registered `not-applicable` row.
2417
+ priorTurnEvidence: this.noticePriorTurnEvidence && this.evidenceGate !== undefined,
2392
2418
  }, this.integrityPosture);
2393
2419
  }
2394
2420
  /**
@@ -3267,7 +3293,13 @@ class Agent extends RunnerBase_js_1.RunnerBase {
3267
3293
  // question a build-time mount can answer.
3268
3294
  const canCallTools = registryByName.size > 0 || this.externalToolProvider !== undefined;
3269
3295
  const hasWrapUp = canCallTools && this.wrapUpAtMaxIterations !== false;
3270
- const routeDecider = (0, route_js_1.buildRouteDeciderStage)(this.messageMiddleware, this.outputEnforcement, stepPlanFor, this.evidenceGate, hasWrapUp, this.claimContract, this.integrityLedgerHolder);
3296
+ const routeDecider = (0, route_js_1.buildRouteDeciderStage)(this.messageMiddleware, this.outputEnforcement, stepPlanFor, this.evidenceGate, hasWrapUp, this.claimContract, this.integrityLedgerHolder,
3297
+ // THE CLAIM SEAM'S RECENCY READ (9.83.0). Value-conditional on both
3298
+ // halves, so an agent that armed neither hands the decider builder
3299
+ // exactly the arguments it always did — and `buildRouteDeciderStage`'s
3300
+ // no-judge fast path still returns the very function reference every
3301
+ // pre-9.83.0 chart was given.
3302
+ this.noticePriorTurnEvidence && this.evidenceGate !== undefined ? true : undefined);
3271
3303
  // toolCallsHandler extracted to ./agent/stages/toolCalls.ts (v2.11.2).
3272
3304
  const toolCallsHandler = (0, toolCalls_js_1.buildToolCallsHandler)({
3273
3305
  registryByName,