Download the PHP package fissible/verdict without Composer

On this page you can find all versions of the php package fissible/verdict. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package verdict

Verdict

Tests Latest version OpenSSF Scorecard OpenSSF Best Practices OpenSSF Baseline

Verdict is a Laravel security boundary for AI-triggered application actions.

It bounds four things: authority — your Laravel policies, evaluated against a resolved target; duplication — at-most-once execution claims; rate — semantic limits; and approval — human confirmation carrying a bound receipt. It does not bound intent. Under prompt injection the actor is still the legitimate authenticated user, so an instruction that selects any record inside that user's own authority passes every check by design. It bounds what an agent may do, not what it was trying to do — see the security model and limitations.

Verdict makes an AI ask your application for permission before it performs an important action. Language models are good at proposing what to do next; they should not be the final authority on what they are allowed to do.

Models propose. Applications authorize.

It sits between an AI tool call and your application code. Before a protected action runs, Verdict applies the policies you configure. Your application—not the model—decides whether the actor is allowed, which resource is safe to use, whether a person must approve the operation, and which safety limits apply.

Verdict is deterministic application code: your Laravel policies decide, and no model judges anything. It is unrelated to the LLM-as-a-judge evaluation libraries that share the name.

Why Verdict exists

AI frameworks let models call functions. That is useful, but it means a model can influence real business operations.

Consider a tool that refunds an order:

Without an application-controlled boundary, a model can influence which order is selected, whether a refund is appropriate, when to make it, and whether to try again. Prompt injection, mistaken instructions, and ordinary model errors can all reach the same function.

Verdict puts an authorization pipeline before that application code executes. The model can recommend an action; your Laravel policies and configured safeguards remain the authority.

Why not just call a Policy inside the tool?

You can — and the check might still be skipped in the next tool someone writes. Verdict's difference is not the check; it is where the check lives:

Quick example

Register a capability in a service provider's boot() method (an AppServiceProvider works). Give it the Laravel authorization ability and a trusted resolver, then expose it to Laravel AI through a secure BoundTool.

The refund Laravel policy decides whether the authenticated actor can refund the resolved order. Because the order was selected by the application rather than by the proposal, an injected instruction cannot redirect the refund at a different record, even one the actor owns. The resolver's ActionContext parameter type makes that structural rather than conventional: the proposal is not available to read.

When the model legitimately selects the target

Some capabilities exist precisely so a model can choose among candidates. Use Capability::usingPolicy() — its resolver receives the full envelope. Resolve from the proposal, and scope the lookup to the actor so an argument cannot reach outside their records:

This bounds authority: the action cannot reach a record the actor could not reach themselves. It does not bound intent. If injected content selects one of the actor's own orders, the policy will permit it. For consequential operations, pair argument-resolved targets with requiresConfirmation() and treat the approval, not the authorization, as the control. Decision evidence records which resolution path every capability uses, so these remain auditable. See authority is not intent.

What the model sees when Verdict says no

A denial is a result, not an exception. The tool call completes, the agent loop continues, and the model receives a structured refusal it can explain to the user or recover from:

decision carries the disposition — deny, require_confirmation, or throttle — and the message comes from verdict.ai.denied_message, so you control what the model is told. Nothing else about the denial reaches the model: no policy internals, no target state. If the model retries, every retry re-enters the same pipeline; a denial cannot be worn down. When an evidence recorder is configured, the denial is recorded like any other decision.

Installation

Verdict requires PHP 8.3+, Laravel 12 or 13, and Laravel AI ^1.0.

See the security model before protecting production-changing operations.

Fastest way to start

The generator asks for the capability's name, model, and controls, then writes a fail-closed skeleton and its test — every security decision is an explicit TODO that throws until you supply it. Details and flags are in the generator section.

Basic usage

Each protected operation is a named capability. A capability begins with two application-owned decisions:

  1. Resolve the requested resource from trusted application data.
  2. Authorize the actor with a Laravel policy or gate ability.

For a BoundTool, also select an ExecutionTargetPolicy. refresh() re-loads the resource before execution, which is usually the safer choice for mutable records. The policy can then add safeguards appropriate to this particular action:

A capability lives in a class under app/Capabilities/, which php artisan verdict:make-capability generates for you:

implements DefinesCapability is the registration. Verdict discovers definition classes that implement it and registers them at boot, so there is no provider wiring. The generator deliberately leaves the interface off: adding it is an affirmation that you have replaced every TODO in the file. Until then the class is inert, and php artisan verdict:validate names it. Verdict::capability($capability) still works for capabilities you would rather register by hand.

Then use Verdict::bound(...) instead of exposing the underlying Laravel AI tool directly. The ADR 0027 explains why a definition is discovered statically rather than resolved from the container.

Core security checklist

These are independent, configurable policies—not one opaque allow/deny decision. Pick the safeguards that fit each capability and its risk.

Question Verdict feature
Is this actor allowed to perform this capability? Laravel authorization through Capability::usingPolicy()
Which resource may actually be changed? ExecutionTargetPolicy and a trusted target resolver
Does a person need to approve it? requiresConfirmation() with an application-defined binding
Has this exact action already been admitted? atMostOnce() and an execution-claim policy
Has the actor exceeded a meaningful safety limit? rateLimit() and a semantic rate-limit policy
What information may enter the model context? Context-release and evidence policies

Authorization and target binding establish the protected capability. Confirmation, duplicate-action prevention, limits, and evidence are selected per operation; a read-only lookup does not need the same controls as a refund.

Features

Secure tool execution

BoundTool connects a Laravel AI tool to a capability whose executor runs only after Verdict’s checks pass. It is the preferred integration for new work.

Making sure the AI acts on the right resource

An ExecutionTargetPolicy captures a stable identity for a trusted target and can refresh that target immediately before the executor runs. This reduces stale-object mistakes; it does not replace database transactions or locking.

Human approval for consequential actions

Capabilities can require approval bound to application-defined, canonical facts about the action. A later action with different relevant facts does not reuse that approval.

Preventing duplicate actions

For operations that must not be admitted twice, an execution-claim policy provides strict at-most-once admission for the configured claim fingerprint.

How duplicate-action prevention works internally Verdict derives a fingerprint from the claim policy’s canonical inputs and uses an atomic state transition in its independent security state. The exact semantics, retention trade-offs, and failure behavior are documented in [ADR 0002](docs/adr/0002-strict-at-most-once-admission.md) and [ADR 0009](docs/adr/0009-execution-claim-retention.md). The [security-state concurrency benchmarks](docs/benchmarks.md) record measured SQLite and MySQL characteristics.

Limiting what AI can do

Semantic rate limits count application-defined action semantics—such as refunds per actor or high-value changes—not model tokens. This lets limits express the operation you actually need to control.

Measured SQLite and MySQL contention characteristics are in the security-state concurrency benchmarks.

Controlling what information the AI sees

Context-release policies and layered evidence help you decide what may be disclosed to a model and what audit evidence is retained. The package follows a fingerprint-first approach for its security evidence rather than recording raw prompts or tool arguments by default.

AttestEvidenceRecorder (opt-in, requires fissible/attest-laravel) upgrades decisions and context releases from an ordinary mutable audit store to a signed, hash-chained one — see limitations for exactly what it does and does not cover.

Testing safeguards before production

Verdict includes deterministic evaluation primitives and an opt-in repeated-trial live evaluation runner, so applications can test security and utility thresholds without making a specific model provider part of the package contract.

For capability integration tests, the framework-agnostic capability security test kit drives a hand-written capability through Verdict's protected execution path and checks the common authorization, freshness, approval, claim, rate-limit, and failure invariants.

For common structural composition, see capability starter patterns. They require your application-owned lookup, identity, and operation-binding callbacks; they never register capabilities or supply policy, tenancy, or side-effect behavior.

Generate a fail-closed capability skeleton

verdict:make-capability creates a capability module and test skeleton, but never edits a policy, route, or service provider. Every target lookup, execution target, executor, and selected-control binding is an explicit throwing TODO until the application supplies its own security facts.

The interactive prompts have these exact flag equivalents. Review the printed policy fragment and registration snippet, replace all TODOs, register the capability yourself, then run php artisan verdict:validate.

The generated test is intentionally incomplete until your application supplies the fixtures and observations. It already calls the capability security test kit through the same registered capability and protected path Verdict uses at runtime:

When selected, --confirmation, --claim, and --rate-limit add the corresponding approval, duplicate-admission, and rate-limit kit assertions to that skeleton.

Guarantees

For actions that are registered as capabilities and executed through Verdict’s protected path, Verdict provides these package-level guarantees:

Those guarantees are scoped to the protected path and the policies you configure. Read the limitations before treating any of them as a complete application security program.

Limitations

Verdict is a security boundary, not a replacement for the rest of your application’s controls. In particular, it does not:

The complete, deliberately specific list is in limitations.

Deeper documentation

The full documentation is published at docs.fissible.dev/verdict. The source pages:

Status

Verdict is a pre-1.0 developer preview. Its public surface is evolving; pin a compatible version and review release notes before upgrading a production integration.


All versions of verdict with dependencies

PHP Build Version
Package Version
Requires php Version ^8.3
illuminate/contracts Version ^12.0||^13.0
illuminate/console Version ^12.0||^13.0
illuminate/database Version ^12.0||^13.0
illuminate/filesystem Version ^12.0||^13.0
illuminate/support Version ^12.0||^13.0
laravel/ai Version ^1.0
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package fissible/verdict contains the following files

Loading the files please wait ...