fissible/verdict-console
The Artisan console companion for Fissible Verdict. It adds CLI commands to inspect, toggle, and manage Laravel feature flags, letting you check rollout status, adjust targeting, and keep environments in sync from your terminal. Ideal for local debugging, CI, and deployments.
Architecture fit
fissible/verdict-console is the third layer of a three-package chain: laravel/ai (agent runtime) → fissible/verdict (governance/authorization) → this package (human-in-the-loop approval runtime + operator console). It has no standalone value; fit is entirely contingent on already running the two upstream layers and having at least one agent workflow that executes tools.ToolApprovalRequest with a receipt issued and the tool unexecuted. That is a narrow but genuinely non-trivial responsibility — it is the boundary between an autonomous agent and a human decision.laravel/ai internals: ChatService::start/continue/stream, ChatTurn, ChatEntry, plus console-owned contracts ConversationParticipants and ResumableAgents. These are not stable public APIs — laravel/ai 1.0 already changed approval-resume behavior once.Integration feasibility
ResumableAgents::versionFor(string $key): ?string, bind a ConversationParticipants implementation, and (if streaming) write an adapter that drains ChatStream to exhaustion.ChatService::stream() was added specifically so adapters don't re-implement the authorization seams the core owns — a good sign of deliberate API design, but it also makes "consume to completion" a hard requirement rather than a style choice.Technical risk
ResumableAgents and explicitly states "in this 0.x line the minor is the breaking release boundary." There have been at least 12 minors, each potentially breaking. Treat version bumps as migrations, not upgrades.resolve() would currently rebuild" is prose, not an enforced contract. A host that gets this subtly wrong can resume a pause against a reconstructed agent that differs from the configuration the human approved — a tool schema or prompt drift that turns a human decision into consent for something else.laravel/ai 1.0 dropped its participant filter on approval resumes; the console re-grounds that as "console-owned identity policy." Behavior is unchanged, but the safety property is now this package's responsibility. Any path that bypasses the console loses the enforcement.fissible/verdict, what is its cadence, and does its interface stability match this package's assumptions?start/continue and avoid stream() entirely for v1, deferring the exhaustion semantics?laravel/ai 1.x range, database engines?Stack fit
laravel/ai 1.0. If our app is not already on that line, this package is blocked.Migration path
laravel/ai 1.0 → fissible/verdict with at least one gated tool workflow → verdict-console.versionFor() returning null first (explicitly declines versioning) to get pauses flowing, then introduce real tokens once agent configurations stabilize. Caveat: null is incomparable, so this is only acceptable while pauses are short-lived and pre-release.Compatibility
laravel/ai × verdict × verdict-console × PHP).Sequencing
ResumableAgents with versionFor(): null, drive one pause → approve → resume cycle end to end. Instrument exactly what the console persists and when.ChatService::stream() to exhaustion; deliberately test abandonment (client disconnect, timeout, kill -9) and record what is and isn't persisted. This determines whether streaming is in scope for v1.ConversationParticipants binding, the guarantee that identity is reproducible at resume time, and the operator UX for a refused (ParticipantUnresolvable) pause.null.Maintenance
versionFor, the participant resolver, the stream adapter, and UI authorization. Those are ours to maintain regardless of upstream churn.laravel/ai 1.0, maintaining the identity policy is a security-relevant duty, not plumbing. It needs an owner, a test suite, and a review gate — this is the kind of thing that quietly rots.Support
Scaling
laravel/ai and queue scaling characteristics rather than introducing new bottlenecks.Failure modes
ParticipantUnresolvable at resume — pause refused at resolution time. Needs a documented operational answer: who acts, and how the operator learns the pause is dead.Error event relayed, Laravel AI's terminal exception propagates, but the receipt may already exist. Retry must be idempotent at the receipt level or duplicates accumulate.laravel/ai 1.0). Assume it will happen again and re-read upstream notes on every bump.Ramp-up
laravel/ai abstractions, Verdict's governance model, and the console's drivability conditions and identity policy — plus the streaming exhaustion contract. Realistically 2–3 weeks to productive, longer to authoritative.How can I help you explore Laravel packages today?