Skip to content

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 20 Aug 05:51
· 110 commits to main since this release
  • 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.