You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Every SHA-256 fingerprint validator now anchors with \z. PR #247's
review found that /^[a-f0-9]{64}$/ admits a 65-byte value ending in a newline, because PCRE's $
matches before a trailing \n, and closed the hole inside EvaluationReport. The three pre-existing
copies of the same pattern — ProvenanceEntry::assertFingerprint(), Assertions::requireFingerprint(),
and ToolObservation's constructor — now anchor the same way, each pinned by a test that rejects the
newline-suffixed digest. Closes #248.
Failure-path tool correlation is asserted, not inferred.ToolFailed reaches Verdict in the same
trailing-event position that carried the defect ToolInvoked used to have — it fires after any
generation the tool nested, which is exactly when the old shared GeneratesText::$currentToolInvocationId
was overwritten. laravel/ai#872 made the id a local handed to both events, so the same fix covers both;
"covers both for the same reason" is an inference, and failure-path evidence is the last place to leave
one unasserted. The deferred half of #130.
Two cases, both written from measured behaviour rather than assumption. A tool that throws inside a
sub-agent is absorbed and reported as that sub-agent's failed tool result, leaving the outer call to
succeed — so the outer completion still lands after a nested run, and must not carry the failed tool's
id. A tool that runs a nested generation and then throws propagates out of prompt(), and its own ToolFailed is the trailing event. Both report their own ids, and each run keeps its own invocation id.
Also corrects a test whose name and comment still described the upstream defect as live in production
("hides the nested clobber", "a defect that exists in production"). It now records what it actually
demonstrates: a fake clones providers per resolution, so that arrangement could never have observed the
defect and its green was never evidence either way.
laravel/ai widened to ^0.11.0, and 0.10.x is no longer supported.0.11.0 released the
run-context stack Verdict had been waiting on (#870, #872, #873, #874, #875, #876). See #130. Dropping 0.10.x is forced, not incidental. #874 made float $time a required seventh argument on Events\ToolInvoked; one test construction cannot satisfy both floors, and supporting both would mean
version-conditional test code for no adopter benefit. Applications on laravel/ai 0.10.x must upgrade
before taking this release. An upstream defect Verdict pinned is fixed, and the pin now asserts the fix.ToolInvoked used to
report the inner tool's id on the outer tool's completion event under a sub-agent, because GeneratesText::$currentToolInvocationId was one property on a memoized provider. Verdict recorded that
id into its evidence trail, so ToolInvocationCorrelationTest pinned the broken behaviour on purpose
(#53) — an upstream fix would fail loudly rather than
change the meaning of recorded evidence in silence. laravel/ai#872 fixed it; the alarm fired; the
assertion now states the fixed behaviour. Nothing else in Verdict changed. PHPStan is clean and the only two failures on the upgrade were the
two the compatibility watch had planted. Re-verified explicitly, because each could have shifted
evidence correlation without failing a test: a sub-agent run still receives its own invocation id
rather than inheriting its parent's, so tool-result provenance still correlates to the run that produced
it; a two-turn approval resume still mints two invocation ids, so the tool call id remains the
boundary-spanning key; and laravel/ai#758's change to conversation-history replay leaves the streamed and
queued approval-resumption matrix cells passing unchanged. docs/laravel-ai-compatibility.md records
what changed and what did not.