2 min read

Operate — run the implementation, produce evidence

WHO THIS IS FOR The Operate pillar is for Operators — operations staff, production teams, and record-keepers who run the implementation in production and produce the .pws/ evidence that auditors will later follow. See Operators.

Operate is the continuous production of evidence. The implementation model, possibly extended by adopted mappings, is run: processes execute, records are written, measurements are taken, approvals are signed. The result is a .pws/ workspace directory holding the actual records.

Output artifact

A .pws/ directory, structured as:

.pws/
├── manifest.yaml                  # workspace identity + registry list
├── BeanLotRegistry/              # one subdirectory per data_registry
│   ├── lot-2026-001.yaml         # one YAML file per record
│   └── lot-2026-002.yaml
├── RoastBatchRegistry/
│   ├── b-2026-001.yaml
│   └── b-2026-002.yaml
└── SupplierRegistry/
    └── sup-001.yaml

Each registry declared in the implementation (and in scope for this workspace) has its own subdirectory. Each record produced by running the implementation is its own YAML file.

Manifest

manifest.yaml ties the workspace to its model:

namespace: AcmeCoffeeProgramme
version: v1.0.0-dev1
registries:
  BeanLotRegistry:
    data_class: BeanLot#data
  RoastBatchRegistry:
    data_class: RoastBatch#data
  SupplierRegistry:
    data_class: SupplierApproval#data

Tooling reads the manifest to know what registries to expect, and which data class shape each record should conform to.

Records

Each record is a YAML file with the shape declared by its data class:

# RoastBatchRegistry/b-2026-001.yaml
id: b-2026-001
name: Batch 2026-001
attributes:
  batch_id: b-2026-001
  lot: lot-2026-001           # → BeanLotRegistry/lot-2026-001.yaml
  roast_level: Medium
  roast_date: 2026-04-12
  moisture_pct: "10.4"

References between records (lot: lot-2026-001 here) point at other files in the workspace, matching the reference(BeanLot#data) type declared on the RoastBatch#data class.

Why YAML and why a directory

A single-file workspace (e.g. one JSON document) is convenient for distribution but inconvenient for change:

  • One record’s update rewrites the whole file. VCS diffs are noisy.
  • Concurrent edits collide.
  • The whole artefact is all-or-nothing.

A directory of YAML files addresses each:

  • Editing one record touches one file. Diffs are surgical.
  • Records can be edited independently; merge conflicts are per-record.
  • The workspace can be read or written one record at a time.

YAML was chosen because it is human-readable, supports comments, and makes typed references (reference(BeanLot#data)) easy to express as natural string values pointing at sibling files.

What triggers a record

The implementation .prl says which processes write which registries:

process AcmeRoastAndLog {
  name "Roast a batch and log it in one combined step"
  actor Roaster
  output {
    RoastBatchRegistry           // ← writes here
  }
}

When that process runs in production, a YAML file lands in RoastBatchRegistry/ with the record’s attributes populated from the process’s inputs.

Where to see it in action

After operating

The workspace is the input to Audit. Auditors need the workspace (or a subset of it) to verify that the mapping the organisation declared actually corresponds to evidence on the ground.