fissible / verdict-console
Human-in-the-loop approval runtime and operator UI for Laravel AI agents governed by Verdict.
Requires
- php: ^8.3
- fissible/verdict: ^0.9
- illuminate/console: ^12.0||^13.0
- illuminate/contracts: ^12.0||^13.0
- illuminate/database: ^12.0||^13.0
- illuminate/support: ^12.0||^13.0
- laravel/ai: ^0.11.0
Requires (Dev)
- larastan/larastan: ^3.9
- laravel/pint: ^1.29
- orchestra/testbench: ^10.0||^11.0
- pestphp/pest: ^4.6
- pestphp/pest-plugin-laravel: ^4.1
- pestphp/pest-plugin-type-coverage: ^4.0
- phpstan/extension-installer: ^1.4
This package is auto-updated.
Last update: 2026-08-26 06:17:59 UTC
README
Human-in-the-loop approval runtime and operator UI for Laravel AI agents governed by Verdict.
Status: pre-1.0, headless.
0.1.0ships the headless approval round trip — pause → authorized human decision → receipt transition → exact resume → execute at most once — driveable from your own code with no UI. Notifications, evidence projections, and the Blade / Livewire / Filament surfaces are specified indocs/design/0001-verdict-console-design.mdand land in later minors; build order is tracked inMILESTONES.md. Substantial decisions are recorded indocs/adr/; start with ADR 0001, the approval-surface contract — including the rule that a Verdictdenyis never approvable from the console.
What it is
Verdict decides at the tool boundary and records evidence; Laravel AI runs the agent and persists
conversations. Neither owns the tissue between them and a human. Verdict Console is that tissue plus
the operator surfaces: it turns a Verdict require_confirmation into a screen a person acts on,
drives the receipt → resume round trip, and presents what Verdict recorded.
It never decides (Verdict does), never persists conversations (Laravel AI does), and is never a second authorization authority. It owns the approval workflow and the UI.
Scope boundary (read first)
The receipt-backed approval loop exists only for Verdict BoundTool on an agent using Laravel
AI's RemembersConversations concern with a real (non-fake) gateway. Non-BoundTool approvals
are observable but not Verdict-drivable. See design §3.
Verdict require_review is a separate, gated review lane: it has no receipt and does not resume
an agent. Its durable review substrate and read API are planned in Verdict #297 and #298, so this
package does not yet expose review items or treat decision evidence as an inbox.
Package family
Install only the presentation stack you render in; all three sit on one headless core.
| Package | Contains |
|---|---|
fissible/verdict-console (this repo) |
Headless runtime + publishable Blade stubs (a working UI on install). |
fissible/verdict-console-livewire |
End-user chat with inline approval cards. |
fissible/verdict-console-filament |
Operator console (approval queue, evidence browser, alarms). |
Installation
composer require fissible/verdict-console:^0.2 php artisan vendor:publish --tag=verdict-console # config + the pending-approvals migration php artisan migrate php artisan verdict-console:doctor # preflight every silent trap before the first pause
Migrations are published, not auto-loaded: a console table must not appear on migrate without the
host asking for it. Publish only the config or only the migration with --tag=verdict-console-config
or --tag=verdict-console-migrations. Then bind the two host seams the round trip needs —
ResumableAgents (how to rebuild your agent from a stable key) and, if your conversations carry a
participant, ConversationParticipants — and define the approve-verdict-action Gate ability:
the shipped authority fails closed until you do.
Requirements
- PHP 8.3+
- Laravel 12 or 13
laravel/ai^0.11fissible/verdict^0.12
Development
composer install composer test # analyse + lint + type-coverage + pest
License
MIT — see LICENSE.md.