Skip to content

GRACE Protocol Specification v1.0

Official Title: Verifiable Agentic Prompt Architecture (VAPA)
Status: Published
Version: 1.0
Date: 2026-04-07
Reference Implementation: STRATT (Stratum) v2.0+


GRACE defines the discipline of constructing, versioning, fingerprinting, and auditing prompt units such that every execution is cryptographically traceable to an approved, immutable specification. This specification consists of five normative layers:

LayerNamePurposeImplementation
SPEC-01Prompt Contract SpecificationUnit types, typed contracts, change classification@stratt/schema
SPEC-02Blake3 Fingerprint & Tamper DetectionCryptographic integrity verification@stratt/fingerprint
SPEC-03Dependency Graph SpecificationImport DAG, blast radius, cycle detection@stratt/graph
SPEC-04Gate Checkpoint ProtocolSynchronisation primitives, audit records@stratt/graph + @stratt/cli
SPEC-05Execution Trace & Audit SpecificationMandatory traces, quality scoring, DSPy export(design phase)

SPEC-01 addresses silent contract drift: units change output shapes without detection, causing downstream failures in autonomous chains. This specification defines five unit types with typed input/output contracts, failure mode declarations, and automated change classification.

Five canonical unit types exist in the GRACE protocol. All units are identified by the URI format: stratt://{domain}/{type}/{slug}@{version}.

A role defines the persona and capabilities of an agent within a chain.

Schema (packages/schema/src/types/role.ts):

type: "role"
domain: Domains (15 values)
slug: string (lowercase, alphanumeric + hyphens)
version: semver
summary: string
read_when: string (optional)
lens: string (required) — Agent's perspective/viewpoint
tone: string (required) — Communication style
behaviours: string[] (required) — Specific actions the role takes
output_format: string (required) — Expected output structure
fingerprint: blake3:{64 hex}

Example: stratt://dev/role/code-reviewer@1.2.3 — A code review agent with specific lens, tone, and output expectations.

A rule defines a constraint or policy that applies within a specific scope.

Schema (packages/schema/src/types/rule.ts):

type: "rule"
domain: Domains
slug: string
version: semver
summary: string
read_when: string (optional)
polarity: "always" | "never" (required)
statement: string (required) — The constraint condition
scope: "global" | "domain" | "chain" | "session" (required)
protected: boolean (optional)
fingerprint: blake3:{64 hex}

Example: stratt://dev/rule/no-hardcoded-secrets@1.0.0 with polarity: "never" and scope: "global".

A task defines a discrete unit of work with a typed contract and execution context.

Schema (packages/schema/src/types/task.ts):

type: "task"
domain: Domains
slug: string
version: semver
summary: string
read_when: string (optional)
contract: Contract (required)
council: string (required) — Council authority
prompt_body: string (required) — Prompt text
fingerprint: blake3:{64 hex}

Example: stratt://ops/task/health-check@2.1.0 with inputs {service: string} and outputs {status: "ok"|"error", message: string}.

A chain composes multiple units into an orchestrated workflow.

Schema (packages/schema/src/types/chain.ts):

type: "chain"
domain: Domains
slug: string
version: semver
summary: string
read_when: string (optional)
contract: Contract (required)
council: string (required)
composition: Composition[] (required) — Ordered steps
fingerprint: blake3:{64 hex} (Merkle root of step fingerprints)

Example: stratt://dev/chain/code-review-workflow@1.5.0 with steps for analysis, review, approval.

A supply provides external data or configuration to chains.

Schema (packages/schema/src/types/supply.ts):

type: "supply"
domain: Domains
slug: string
version: semver
summary: string
read_when: string (optional)
supply_body: string (required) — Data payload
fingerprint: blake3:{64 hex}

Example: stratt://shared/supply/security-policies@1.0.0.

All tasks and chains define typed input/output contracts to prevent silent drift.

Schema (packages/schema/src/types/contract.ts):

Contract {
inputs: Input[] where Input = {
name: string
type: InputType (7 values: string, integer, float, boolean, document, array, object)
required: boolean
description: string
}
outputs: Output[] where Output = {
name: string
type: OutputType
description: string
}
failure_modes: FailureMode[] where FailureMode = {
code: string
handler: "gate" | "retry" | "abort" | "fallback"
description: string
escalation: string (optional)
}
}

Conformance: Contract modifications that add outputs or make inputs optional are non-breaking (minor/patch). Removals or type changes are breaking (major).

Units progress through a 9-state lifecycle with explicit state transitions and merge ordering (CRDT).

States (packages/schema/src/constants.ts):

  1. draft — Under development, not shared
  2. review — Submitted for peer review
  3. approved — Review passed, ready to publish
  4. published — Published to R2 registry
  5. active — Production use enabled
  6. deprecated — Superseded but still usable
  7. archived — No longer usable, retained for audit
  8. tombstoned — Deleted, cannot be imported
  9. tampered — Failure state (fingerprint mismatch)

Valid Transitions (packages/schema/src/lifecycle.ts lines 57-100):

draft → review, draft
review → draft, approved, review
approved → review, published
published → active, deprecated, published
active → deprecated, active
deprecated → published, archived, tombstoned, deprecated
archived → deprecated, tombstoned, archived
tombstoned → tombstoned
tampered → draft

Gate-Required Transitions (Frozen transitions requiring SPEC-04 approval):

  • approved → published
  • active → deprecated
  • archived → tombstoned
  • deprecated → tombstoned

A unit in draft status can only import units also in draft status. This prevents immature work from polluting approved chains.

Import Permission Matrix (packages/schema/src/lifecycle.ts lines 129-173):

Importer Status | Can Import drafts? | Can Import review? | Can Import approved+ ?
draft | YES | NO | NO
review | YES | YES | NO
approved+ | NO | NO | YES
deprecated | NO | NO | YES
archived | NO (always blocked)

Units in tombstoned or tampered status can never be imported.

Fifteen domains segment the unit ecosystem:

Core Domains (4): dev, ops, docs, shared
Professional Domains (11): neuro, finance, nutrition, legal, film, artist, security, product, data, marketing, core

Cross-Domain Import Rule: Non-shared domains may only import from core/ or shared/ except within their own domain.

Units must pass a 6-step validation pipeline before acceptance:

  1. Zod Schema Validation: All fields conform to type schema
  2. URI Validation: stratt://{domain}/{type}/{slug}@{version} format, domain and type must exist
  3. Import Validation: All imported units exist and are addressable
  4. Draft Isolation (FM-07): Importer status permits imported unit status
  5. Lifecycle Validation: Current status has valid transitions available
  6. Forbidden Block Detection: Detects and prevents problematic patterns (e.g., cycles via imports)

Implementation: packages/schema/src/validate.ts lines 1-122.

Units are stewarded by councils that grant execution permissions.

Council Schema (packages/schema/src/types/council.ts):

Council {
name: string (dev, ops, docs, security, product, data, marketing)
gate_authority: Agent — Single agent with approval power
protected_agents: Agent[] — Agents that cannot be bypassed
agents: Agent[] where Agent = {
designation: string (e.g., "LEWIS-06")
role: string
capabilities: Capabilities[] (11 values: analysis, architecture, audit, code, data, domain, gates, memory, operations, planning, write)
protected: boolean
}
}

7 Active Councils:

CouncilGate AuthorityProtected Agent(s)Domain
PathfinderLEWIS-06BECK-02dev
HermesRETRO-04EECOM-02ops
AthenaEDITOR-04CURATOR-02docs
BastionCOMMANDER-05ANALYST-03security
CompassCOURSE-05MERIDIAN-03product
HeraldCROWN-05GAZETTE-03marketing
TerraMANTLE-05SPRING-03data

SPEC-02: Blake3 Fingerprint & Tamper Detection

Section titled “SPEC-02: Blake3 Fingerprint & Tamper Detection”

SPEC-02 addresses unverifiable execution: no way to verify that the prompt executing in production is the one that was authored, reviewed, and approved. This specification defines cryptographic fingerprinting via Blake3 hashing over canonical YAML serialisation.

The fingerprinting process follows a strict 5-stage pipeline to ensure deterministic hashes regardless of YAML encoding variations.

Parse input as YAML 1.2 core schema with:

version: 1.2
schema: core
merge: true
uniqueKeys: true

Source: CANONICAL-SERIALISATION-SPEC.md lines 88-143.

Three sequential sub-stages:

2a. Field Exclusion: Remove the fingerprint key from all objects (it is stored separately).

2b. Null Removal: Recursively remove all null values from objects. Preserve empty arrays [] and empty objects {}.

2c. Unicode NFC Normalisation: Normalise all strings to NFC (composed form) using Unicode canonical composition. This prevents equivalent but differently-encoded strings from producing different hashes.

Source: packages/fingerprint/src/canonicalise.ts lines 5-46.

Produce compact JSON with recursive key sorting in UTF-16 order:

  1. Recursively sort all object keys in UTF-16 lexicographic order
  2. Serialize to JSON without whitespace
  3. No trailing newline

Source: packages/fingerprint/src/canonicalise.ts lines 34-46.

Encode the canonical JSON string as UTF-8 bytes:

  • No BOM
  • No trailing newline
  • 1 byte per ASCII character

Source: packages/fingerprint/src/canonicalise.ts line 65.

Hash the UTF-8 bytes using Blake3:

  • Algorithm: Blake3 (256-bit hash)
  • Output: 64 hexadecimal lowercase characters
  • Storage format: blake3:{hex} (the blake3: prefix is metadata; only the hex is stored in SPUH)

Source: packages/fingerprint/src/hash.ts lines 10-15.

Chain fingerprints are computed as Merkle tree roots of step fingerprints:

chain_fingerprint = blake3(
sorted_step_fingerprints +
chain_metadata
)

This ensures that modifying any step changes the chain fingerprint, enabling blast radius detection.

The verification process compares stored vs. computed fingerprints.

Verification States:

export type VerifyStatus =
| "verified" — Computed matches stored
| "tampered" — Computed differs from stored
| "error" — Parsing or hashing failed

Verification Algorithm (packages/fingerprint/src/verify.ts lines 10-54):

  1. Extract stored fingerprint from object
  2. Compute fingerprint over object (without the fingerprint field)
  3. Compare stored to computed
  4. If equal, return { status: "verified", ... }
  5. If not equal, return { status: "tampered", ... } with mismatch position
  6. If any error occurs, return { status: "error", ... }

This specification intentionally diverges from RFC 8785 in 4 areas:

DivergenceRFC 8785GRACERationale
Input FormatJSON onlyYAML then convertYAML is author-friendly; conversion is deterministic
Pre-processingNone required3-stage transformationNull removal + NFC prevent encoding ambiguity
Unicode HandlingNFD (decomposed)NFC (composed)NFC is more common; neither affects semantics
Null Handlingnull → "null" stringnull → removedEmpty structures [] {} are semantically distinct from null

Complete analysis: CANONICAL-SERIALISATION-SPEC.md lines 329-356.

Fourteen normative test vectors validate canonical serialisation implementations.

Vector Categories:

  • TV-01 to TV-05: Minimal units (one of each type: role, rule, task, chain, supply)
  • TV-06 to TV-10: Edge cases (empty arrays, block scalars, unicode, absent fields)
  • TV-11 to TV-14: Complex (nested imports, 6-step chain, NFC equivalence, key sort stress)

Format of Each Vector:

input:
# Original YAML
canonical_json: |
# Expected canonical JSON (no whitespace, keys sorted)
blake3_digest: blake3:...

Location: CANONICAL-SERIALISATION-SPEC.md lines 456-1087.

Conformance Requirement: All 14 vectors must be processed identically by any GRACE implementation.

  • YAML parser with 1.2 core schema, merge enabled
  • Recursive null removal (preserve [] and {})
  • NFC normalisation for all strings
  • Recursive key sorting (UTF-16 order)
  • Compact JSON serialisation
  • Blake3 hashing (blake3-wasm v2.1.5 pinned)
  • Stored vs. computed comparison
  • All 14 test vectors pass

SPEC-03 addresses cascade failures: modifying a core unit without knowing it’s imported by dozens of other units causes silent failures. This specification defines a directed acyclic graph (DAG) model for unit imports, cycle detection, and blast radius computation.

Units declare imports using URI references: stratt://domain/type/slug@version or choco://namespace/path@version.

In Task/Chain Composition:

type: chain
composition:
- id: "step_1"
unit: stratt://dev/role/code-reviewer@1.2.3
agent: LEWIS-06
depends_on: []
- id: "step_2"
unit: stratt://dev/task/review-code@1.0.0
agent: BECK-02
depends_on: ["step_1"]

In Rules/Roles/Supplies:

imports:
- stratt://core/rule/no-secrets@1.0.0
- stratt://shared/supply/policies@2.0.0
- choco://neuro-research/protocol/ethics@3.1.0

The dependency graph is built by:

  1. Enumerating all units in the registry
  2. For each unit, parsing its imports
  3. Creating directed edges: unit → imported_unit
  4. Running cycle detection (Kahn’s algorithm)

Cycle Detection (packages/graph/src/dag.ts):

function hasCycle(edges: Set<[from, to]>): boolean {
const inDegree = computeInDegrees(edges)
const queue = [all nodes with inDegree 0]
while (queue.length > 0):
current = queue.shift()
for each edge (current → neighbor):
inDegree[neighbor]--
if inDegree[neighbor] == 0:
queue.push(neighbor)
return (unvisited nodes with inDegree > 0) ? true : false
}

Failure Mode FM-03 is triggered if cycles are detected.

The blast radius of a unit is the set of all units that transitively depend on it.

Algorithm:

function blastRadius(unit: Unit): Set<Unit> {
result = { unit }
visited = {}
queue = [unit]
while queue not empty:
current = queue.shift()
visited.add(current)
for each unit u that imports current:
if u not in visited:
result.add(u)
queue.push(u)
return result
}

Use: When publishing unit v2.0.0 with breaking changes, blast radius tells you which units must also be re-published.

Cross-domain imports are restricted to prevent tight coupling:

Rule: Non-shared domains may only import from core/ or shared/ unless importing within their own domain.

dev/task/* → can import from: dev/*, core/*, shared/*
ops/role/* → can import from: ops/*, core/*, shared/*
docs/chain/* → can import from: docs/*, core/*, shared/*

Violations trigger a validation error.

The choco:// URI scheme enables imports from the Choco HQ documentation engine (cross-namespace):

stratt://dev/task/extract-docs@1.0.0 imports:
- choco://security/standards/data-handling@2.1.0

Resolution: ChocoBridgeResolver (packages/graph/src/choco-resolver.ts) maps choco:// URIs to HTTP endpoints.

CodeNameTriggerHandler
FM-02Broken ImportsImported unit doesn’t existValidation error, reject publish
FM-03DAG CyclesCircular dependency detectedValidation error, reject publish
FM-07Draft IsolationDraft imports non-draftValidation error (SPEC-01)

SPEC-04 addresses undetectable degradation: autonomous chains produce plausible-looking output that is subtly wrong, with no detection mechanism. This specification defines synchronisation primitives (hard gates) that halt execution, requiring explicit human or agent approval.

Gates are synchronisation checkpoints that halt chain execution completely until resolved.

Gate Resolution States:

PENDING (default)
├── APPROVED (by gate authority)
├── REJECTED (by gate authority)
├── TIMEOUT (24h default, escalates to Veritas)
└── ESCALATED (to higher council)

Gate Authority: Each council has a single gate authority agent (e.g., LEWIS-06 for Pathfinder).

Protected Agents: Some agents cannot be bypassed by gates. Their steps always execute if contract is satisfied. Protected agents per council:

  • Pathfinder: BECK-02
  • Hermes: EECOM-02
  • Athena: CURATOR-02
  • Bastion: ANALYST-03
  • Compass: MERIDIAN-03
  • Herald: GAZETTE-03
  • Terra: SPRING-03

Composition steps can be marked with gate: true:

composition:
- id: "analyze"
unit: stratt://dev/task/analyze-code@1.0.0
agent: LEWIS-06
gate: false
- id: "approve_changes"
unit: stratt://dev/task/approve-changes@2.0.0
agent: LEWIS-06
gate: true # Requires approval
depends_on: ["analyze"]

Four lifecycle transitions require gate approval (SPEC-04 enforcement):

  • approved → published (promotion to production readiness)
  • active → deprecated (removal from production)
  • archived → tombstoned (permanent deletion)
  • deprecated → tombstoned (permanent deletion from deprecated)

Audit Record: Every gate resolution is recorded with timestamp, resolver agent, and reason.

Seven councils govern different domains:

Pathfinder:
domain: dev
gate_authority: LEWIS-06
protected: [BECK-02]
agents: [LEWIS-06, BECK-02, ALPHA-01, GAMMA-03, ...]
Hermes:
domain: ops
gate_authority: RETRO-04
protected: [EECOM-02]
agents: [RETRO-04, EECOM-02, ...]
[5 more councils]

Configuration: councils/{name}/council.yaml (verified to exist for all 7).

CodeNameTriggerHandler
FM-04Protected Agent MissingUnit assigned to protected agent, but agent doesn’t exist in councilValidation error, reject step
FM-05Gate RemovalGate-required transition attempted without gate authority approvalValidation error, block transition
FM-09Capability CheckAgent lacks required capability for stepValidation error, reject assignment

SPEC-05: Execution Trace & Audit Specification

Section titled “SPEC-05: Execution Trace & Audit Specification”

SPEC-05 addresses unquantified improvement: after months of running chains, no way to answer which units improved, which degraded, which gates fired most often. This specification defines mandatory trace creation, quality scoring, and automated regression detection.

Status: Design phase. Implementation in grace/automation/trace-protocol.md. Not yet in STRATT packages.

Every chain execution produces a trace record.

Chain-Level Trace:

trace_id: string (UUID)
chain_address: stratt://domain/chain/slug@version
version: semver
fingerprint: blake3:...
session_id: string (optional, groups related executions)
created_at: ISO8601 timestamp
completed_at: ISO8601 timestamp
status: "success" | "partial" | "failed" | "timeout"
quality_score: number (0.0–1.0)
token_count:
input: integer
output: integer
total: integer

Step-Level Trace (array):

steps:
- unit_address: stratt://...
agent: string (e.g., LEWIS-06)
prompts_sent: number
responses_received: number
tokens_in: integer
tokens_out: integer
status: "pending" | "in_flight" | "completed" | "error" | "gated"
gate_resolution: "approved" | "rejected" | "timeout" | "escalated" (optional)
quality_delta: number (-1.0–1.0, relative to baseline)

Quality is computed via a pluggable scorer interface with a heuristic default.

Heuristic Scorer (grace/automation/trace-protocol.md):

quality_score = (
0.5 * conformance_score + // Does output match contract?
0.3 * completeness_score + // Are all required fields present?
0.2 * efficiency_score // Tokens per unit output
)

Traces are exported as JSONL for DSPy optimization:

{"example": "input", "prediction": "output", "score": 0.92, "trace_id": "..."}

Filtering by:

  • Minimum score (e.g., score ≥ 0.8)
  • Date range
  • Version range
  • Unit address pattern

Automated detection when quality score degrades by > 5% (configurable):

if (new_score - baseline_score) < -0.05:
trigger Veritas gate for manual review

Failure Modes Reference (FM-01 through FM-09)

Section titled “Failure Modes Reference (FM-01 through FM-09)”

All failure modes are enumerated and traceable to implementation files.

CodeNameSpecTrigger ConditionImplementationHandler
FM-01Fingerprint TamperSPEC-02Stored fingerprint ≠ computed fingerprintpackages/fingerprint/src/verify.tsReject execution, alert ops
FM-02Broken ImportsSPEC-03Referenced unit doesn’t exist or is unresolvablepackages/graph/src/resolve.tsValidation error, block publish
FM-03DAG CyclesSPEC-03Circular dependency detectedpackages/graph/src/dag.tsValidation error, block publish
FM-04Protected Agent MissingSPEC-04Step assigned to protected agent not in councilpackages/graph/src/protect.tsValidation error, block step
FM-05Gate RemovalSPEC-04Gate-required transition without approvalpackages/graph/src/protect.tsValidation error, block transition
FM-06Contract Breaking ChangeSPEC-01Required input removed or type changed without major bumppackages/graph/src/protect.tsValidation error, block publish
FM-07Draft IsolationSPEC-01 + SPEC-03Draft imports non-draft unitpackages/schema/src/lifecycle.ts + packages/graph/src/protect.tsValidation error, block import
FM-08R2 Infrastructure Failure(Infrastructure)Registry unavailable, network error, auth failure(R2 layer)Publish fails, rollback
FM-09Capability CheckSPEC-01Agent lacks required capability for steppackages/graph/src/protect.tsValidation error, block assignment

Format: stratt://{domain}/{type}/{slug}@{version}

Components:

PartPatternExampleNotes
schemestratt://stratt://Literal prefix
domain(dev|ops|docs|...)dev15 valid domains
type(role|rule|task|chain|supply)task5 unit types
slug[a-z0-9-]+code-reviewerLowercase, hyphens allowed
version\d+\.\d+\.\d+1.2.3Semantic versioning

Full Regex:

^stratt://(dev|ops|docs|neuro|finance|nutrition|legal|film|artist|security|product|data|marketing|core|shared)/(role|rule|task|chain|supply)/([a-z0-9-]+)@(\d+\.\d+\.\d+)$

Format: choco://{namespace}/{path}@{version}

Used for cross-namespace imports from Choco HQ documentation engine.

Example: choco://security/standards/data-handling@2.1.0


Three conformance levels define implementation completeness:

Mandatory for any GRACE implementation:

  • SPEC-01 unit types and contracts
  • SPEC-02 fingerprinting (Blake3)
  • SPEC-03 DAG cycle detection
  • Validation pipeline (all 6 steps)

Reference: @stratt/schema + @stratt/fingerprint + @stratt/graph (basic cycle detection)

For production deployments:

  • All of Level 1
  • SPEC-04 gate checkpoint protocol
  • Blast radius computation
  • Domain isolation enforcement
  • Audit record creation for all mutations

Reference: Full STRATT implementation (@stratt/cli, @stratt/graph with all modules)

For organisations requiring complete observability:

  • All of Level 1 + 2
  • SPEC-05 execution traces
  • Quality scoring
  • DSPy export pipeline
  • Automated regression detection

Reference: STRATT + SPEC-05 implementation (future).


All cryptographic operations must be deterministic. Given identical input, implementations must produce identical output. The 5-stage fingerprint pipeline enforces this through canonical serialisation.

Published units (status ≥ published) are immutable. Modification requires publishing a new version. This enables reliable dependency tracking and blast radius computation.

Every mutation, gate resolution, and state transition is recorded with timestamp and resolver. No silent changes.

When in doubt, reject. All 9 failure modes result in explicit rejection with clear error messages, never silent acceptance.

Implementation is strictly layered. Lower layers (fingerprint, schema) have zero knowledge of higher layers (CLI, IR, N8n exporters). Enables independent development and testing.


PackageLayerPurposeNormative Specs
@stratt/fingerprintL0Canonical serialisation, Blake3 hashingSPEC-02
@stratt/schemaL1Zod validators, URI parsing, SPUH encodingSPEC-01
@stratt/crdtL2CRDT merge strategies (7 strategies)
@stratt/graphL3DAG, blast radius, CI pipeline, gatesSPEC-03, SPEC-04
@stratt/irL4Execution IR, portable compilation
@stratt/n8n-exporterL3.5Chain → n8n workflow compiler
@stratt/cliL521 commands, orchestrationAll specs
MERIDIANL6Astro documentation site

  • All SPEC-01 components verified to exist (base.ts, lifecycle.ts, validate.ts, etc.)
  • All SPEC-02 test vectors (TV-01–TV-14) produce expected Blake3 digests
  • All 9 failure modes (FM-01–FM-09) are detected and handled
  • Lifecycle state machine enforces all 28 valid transitions
  • Draft isolation matrix blocks invalid imports
  • DAG cycle detection rejects circular dependencies
  • Gate approval workflow enforces 4 gate-required transitions
  • All 7 councils defined and agents exist
  • Domain isolation blocks cross-domain imports (except core/shared)
  • 15 domains enumerated
  • SPUH binary encoding includes Blake3 prefix extraction

Primary sources (all locations verified as of 2026-04-07):

  • SPEC-01: ~/code/workspace/stratt-hq/packages/schema/src/ (14 files, 673 lines)
  • SPEC-02: ~/code/workspace/stratt-hq/CANONICAL-SERIALISATION-SPEC.md (1,215 lines)
  • SPEC-03: ~/code/workspace/stratt-hq/packages/graph/src/ (dag.ts, resolve.ts, blast.ts, protect.ts, choco-resolver.ts)
  • SPEC-04: ~/code/workspace/stratt-hq/councils/ (7 YAML files), packages/graph/src/protect.ts
  • SPEC-05: ~/code/workspace/grace/automation/trace-protocol.md (design phase)

Related documents:

  • GRACE Protocol Overview: ~/code/workspace/grace/architecture/GRACE-PROTOCOL-OVERVIEW.md
  • CLAUDE.md (workspace guide): ~/code/workspace/grace/CLAUDE.md

VersionDateChangesAuthor
1.02026-04-07Initial publication (reverse-engineered from STRATT v2.0+)OpenCode Agent

This specification is published under the VAPA (Verifiable Agentic Prompt Architecture) protocol. Reference implementation is STRATT.

Published: grace.devarno.cloud/protocol/specification