Issue #1034 establishes the provider-neutral authority contract for execution phases. It defines what a phase may request and how Veritas computes the effective result. Issue #1035 adds durable active-run transitions and operator controls. Issues #1036 and #1033 bind that evidence through launch, continuation, tools, approvals, completion, API, CLI, and operator UI surfaces.
The compiler remains intentionally pure. It does not mutate an active attempt, persist a transition, or filter a tool catalog. The separate Phase Transition Journal owns active state changes and their evidence; launch and tool services consume the compiled result.
The versioned contracts are:
phase-capability-profile/v1 for built-in and workspace-defined profilesphase-transition-intent/v1 for a requested move between phase identitiesphase-capability-evidence/v1 for the compiled result and blockersThe built-in phase names are explore, plan, implement, verify, and
publish. Launches without a profile compile in explicit legacy mode. Legacy
mode preserves the intersection of existing policies and emits a warning; it
does not silently invent a phase.
The compiler keeps these dimensions independent:
| Dimension | Scope meaning |
|---|---|
filesystem.read |
Exact logical paths or roots |
filesystem.write |
Exact logical paths or roots |
command.execute |
Trusted command classes, not arbitrary command text |
network.egress |
Exact destinations or policy-owned destination IDs |
credential.access |
Credential definition references, never values |
external.action |
Exact external action classes |
artifact.plan.write |
The narrow harness-owned plan artifact capability |
Scopes are exact strings. * means that one source does not narrow the
dimension. It cannot be combined with exact scopes. The compiler does not infer
path ancestry, destination patterns, credential aliases, or command safety.
In particular, an inspect command class is only a policy identifier for a
trusted, enforceable tool mapping. It does not make arbitrary shell commands
read-only.
| Phase | General workspace write | Task credentials | External mutation | Plan artifact |
|---|---|---|---|---|
explore |
No | No | No | No |
plan |
No | No | No | Optional exact path |
implement |
Yes | Separately bounded | No | No |
verify |
Yes | No | No | No |
publish |
Yes | Separately bounded | Separately bounded | No |
Profiles are ceilings, not grants by themselves. Agent, sandbox, tool, and launch policy sources can always narrow them.
Effective authority is the exact intersection of:
The compiler never unions scopes. A descendant therefore cannot exceed its parent. Every dimension records requested scopes, effective scopes, and the sources that narrowed it.
Each non-phase source also reports whether it can enforce every dimension:
enforced allows its exact scopes to participate.unsupported removes the dimension and creates a typed blocker when the
profile requires it.unenforceable also removes the dimension and creates a distinct typed
blocker when required.An enforced source with no matching requested scope produces
required-authority-denied for a required dimension. Optional authority can be
narrowed away with a warning. Unknown dimensions and malformed source records
are rejected by strict Zod schemas.
The plan profile may request one plan artifact through:
{
"exactPath": ".veritas-kanban/plans/task-1034.md",
"owner": "veritas-kanban",
"transport": "harness-api"
}
The effective evidence binds that exact normalized repository-relative path.
The contract records shellRedirection: false and indirectWrites: false.
Absolute paths, traversal, backslashes, control characters, and shell syntax
fail closed. The exception never adds filesystem.write authority and cannot
be requested by another built-in phase.
Only the harness API may perform this write. A provider shell, hook, MCP tool, or redirection must not translate the exception into a general filesystem grant.
Existing attempts and workflow history are not rewritten. A launch with no
explicit phase and no profile-authoritative parent remains in legacy mode;
its existing sandbox, provider, profile, and tool policies still apply.
Readers expose that identity without inventing a transition journal.
Migrate one execution path at a time:
phase to the API or CLI launch, or to an agent workflow step.agent:phase to
inspect the server-owned evidence.Agent profile packages remain independent narrowing sources. They do not silently select or widen a phase, so existing packages need no schema rewrite. ACP stdio is the current adapter for explicit phase execution. Keep other adapters in legacy mode until their runtime exposes equivalent pre-execution command and external-action mediation.
The delivered phase control plane now includes:
Provider enforcement remains capability-bound. ACP stdio exposes a pre-execution permission path for command and external actions. Adapters that cannot prove equivalent mediation return typed blockers for explicit phases; Veritas does not substitute prompt instructions or post-execution events for enforcement.