Use this section for exact contracts rather than inferred release behavior.
v1.0.0-alpha.5 is the product version; shipped entities continue to use
processkit.projectious.work/v2.
This is the multi-page printable view of this section. Click here to print.
Use this section for exact contracts rather than inferred release behavior.
v1.0.0-alpha.5 is the product version; shipped entities continue to use
processkit.projectious.work/v2.
processkit uses a Kubernetes-style apiVersion field on every entity:
apiVersion: processkit.projectious.work/v2
The group processkit.projectious.work is a reverse-DNS name anchored on
the owning organization (projectious.work) with processkit as a
subcomponent. This prevents name collisions if other organizations fork
or publish compatible primitives under their own domains.
The form <reverse-dns-group>/<version> is the Kubernetes-idiomatic
shape — exactly one slash. Tools that split on / expect exactly two
parts.
| apiVersion | Status | Meaning |
|---|---|---|
| apiVersion | Product line | Status |
| — | — | — |
processkit.projectious.work/v1 | v0.x | Current v0.x entity format |
processkit.projectious.work/v1beta1 | none | Reserved; not used |
processkit.projectious.work/v2 | v1.x | Current v1.x entity format |
The processkit product version, entity API version, schema-source format,
and per-kind schema versions are independent axes. In particular,
processkit v1.x deliberately uses entity API v2.
metadata.id, metadata.created, or other cross-cutting fieldsThe SmoothTiger/SmoothRiver v2 direction is a no-shim contract: v2 schemas and index semantics become authoritative, and processkit does not add hidden dual-read or permissive validation paths for v1 data. Existing v1 contexts remain a migration source, not a long-term compatibility target.
For a v1 context moving to v2:
Migration entity records the affected files, source and target
apiVersion, source and target processkit versions, and the proposed
plan.migration-management, using
dry-run diagnostics before applying changes.applied.No automatic in-place patching — migrations always go through an explicit review and approval step. See the v0.25.0 changelog for the public breaking-change summary.
Entity IDs in processkit have the shape <PREFIX>-<id-body>. The prefix
is determined by the primitive kind and is not configurable. The id-body
has two independent configuration axes: format and slug.
In the consuming project’s aibox.toml:
[context]
id_format = "word" # word | uuid
id_slug = false # true | false
id_format | id_slug | Example | Notes |
|---|---|---|---|
word | false | BACK-calm-fox | Default. Short, memorable, solo-friendly |
word | true | BACK-calm-fox-add-lint | Memorable + descriptive for prose contexts |
uuid | false | BACK-550e8400-e29b-41d4 | Uniqueness guarantees for large teams |
uuid | true | BACK-550e8400-add-lint | UUID + readable context |
| Primitive | Prefix |
|---|---|
| WorkItem | BACK |
| LogEntry | LOG |
| DecisionRecord | DEC |
| Migration | MIG |
| Artifact | ART |
| Note | NOTE |
| Actor | ACTOR |
| Role | ROLE |
| Binding | BIND |
| Scope | SCOPE |
| Category | CAT |
| CrossReference | — |
| Gate | GATE |
| Schedule | SCHED (legacy v1) |
| Constraint | CONST |
| Context | CTX |
| Discussion | DISC |
| Process | PROC (legacy v1) |
| StateMachine | SM (legacy v1) |
Metric, Model, Process, Schedule, and StateMachine do not
reserve first-class primitive prefixes in the v2 contract. The legacy
prefixes remain documented so existing v1 contexts can be migrated and
read correctly.
Word-based IDs come from the petname
algorithm: one adjective + one noun (or two, depending on
id_format_depth — default 2). Collisions are detected at generation
time and a third component is appended if needed.
When id_slug = true, a content-derived slug is appended to the ID body.
For a WorkItem with title “Add release audit check”, the slug would be
add-release-audit-check (first N tokens, kebab-case, truncated).
Slugs are for human readability and do not affect uniqueness — the word or UUID portion still guarantees that.
word + slug: false — shortest, most memorableword + slug: true — readable in proseuuid + slug: true — uniqueness + readabilityuuid + slug: false — machines don’t care about readabilityprocesskit is distributed as versioned releases. Upgrading pinned
versions is deliberate: processkit does not silently rewrite a consuming
project’s context. A version bump should produce a Migration document
under context/migrations/pending/ that the user and agent work through
together.
processkit ships a generic diff script (scripts/processkit-diff.sh) that
compares two tagged versions of any processkit-compatible source — upstream
processkit, a company fork like processkit-acme, or any other downstream.
The script reads src/PROVENANCE.toml at each tag (a single file mapping
every shipped file to the tag in which it last changed) and emits a
structured diff: added, removed, changed, unchanged.
For removed or renamed skills, the JSON and TOML formats also include
cleanup_hints. Installers should treat these as explicit cleanup
instructions for upstream-managed hot files: remove stale skill directories
when remove_skill_directory = true, remove listed generated command
adapters, and surface replacement_path as the canonical successor when
the removal is a rename.
Managed installers can consume this diff model. For example, when
aibox sync notices a new pinned version, it:
Fetches the new tag into ~/.cache/aibox/processkit/<version>/
Calls the diff script (or reimplements its logic) to compare the currently-installed version against the new one
For each affected file, computes three SHAs on the fly:
context/templates/processkit/<current-version>/<file>and uses them to classify the file:
Writes a Migration document to context/migrations/pending/MIG-<id>.md
containing the briefing
Updates context/migrations/INDEX.md with the new pending entry
Reports the result and stops — never auto-applies
The user reads the briefing, approves a project-specific plan, and the
migration moves through pending/ → in-progress/ → applied/. See the
migration-management skill
for the workflow details.
| Where | Git status | Purpose |
|---|---|---|
aibox.lock (project root) | tracked | Pinned source URL + version + resolved commit (Cargo-style) |
context/templates/processkit/<v>/... | tracked | Verbatim reference copy of every shipped file (the “as-installed” reference for diffs) |
context/migrations/pending/MIG-*.md | tracked | Pending migration briefings |
context/migrations/in-progress/MIG-*.md | tracked | Migrations being worked through |
context/migrations/applied/MIG-*.md | tracked | Historical record |
context/migrations/INDEX.md | tracked | Always-loaded summary |
context/.cache/processkit/... | NOT tracked | Per-project runtime cache (e.g. SQLite index) |
~/.cache/aibox/processkit/<v>/... | NOT tracked | aibox’s fetched upstream cache, reproducible from the lock |
A new developer cloning the project gets aibox.lock + the reference
templates + migration documents from git. aibox sync fetches the
upstream cache as needed. Everything is reconstructible from the git
checkout.
# aibox.toml
[processkit]
source = "https://github.com/projectious-work/processkit.git"
version = "v0.4.0" # was: "v0.3.0"
src_path = "src" # default — matches upstream layout
Then:
aibox sync # fetches new tag, generates the migration document
aibox migrate # walks through the pending migration with you
<validator> # structural validation after migration is applied
The v2 deliverable direction is intentionally breaking: processkit does
not provide compatibility shims that let v1 and v2 contracts coexist
inside the same shipped src/ tree. A live v1 project context is valid
only as a migration source until the generated migration is worked
through.
The explicit path is:
aibox sync creates the v2 Migration.source_api_version,
target_api_version, source_processkit_version, and
target_processkit_version.migration-management with dry-run
diagnostics first.This path is the only supported bridge for v1 contexts. v2 schemas and index semantics are authoritative once the migration is applied.
See the v0.25.0 changelog for the public breaking-change summary.
The [processkit] source field accepts any git URL. The default
upstream is https://github.com/projectious-work/processkit.git, but
companies can fork processkit into their own repository, customize it,
and have their projects consume the fork:
[processkit]
source = "https://gitlab.acme.com/platform/processkit-acme.git"
version = "v0.4.0-acme.1"
The fork is responsible for regenerating its own PROVENANCE.toml against
its git history and tagging releases. The diff script and migration model
work identically for forks — they just see the fork’s tags instead of
upstream’s.
For forks pulling from upstream periodically, use the diff script directly:
# Inside the processkit-acme checkout
scripts/processkit-diff.sh --from upstream/v0.4.0 --to upstream/v0.5.0 --format toml > upstream-changes.toml
The maintainer applies the changes to the fork manually, then re-tags as
e.g. v0.5.0-acme.1. ACME’s projects then bump their version and run
aibox sync to pick up the changes.
Versions before v0.4.0 used a simpler model: every project copied the
processkit content into its own files, and aibox migrate produced
text-only migration documents at context/migrations/<from>-to-<to>.md.
This worked but had no concept of provenance, no manifest, and no way to
classify “user-modified vs unchanged” without manual diffing. The v0.4.0
model is a strict superset and is backward-compatible: pre-v0.4.0
migration documents are not touched and remain readable.
aibox sync will not dopending/ or in-progress/ (it tells the user “pending
migration exists, run aibox migrate to work on it”)Downgrading is supported but discouraged. To downgrade:
[processkit]
version = "v0.3.0" # was: "v0.4.0"
then aibox sync. If the downgrade skips past a schema apiVersion bump,
existing entities may become incompatible with the older schemas.
validation should flag the failures. You may need to manually edit or
delete incompatible entities.
processkit recognizes three privacy tiers for entities under context/.
The tier is declared via an optional privacy: field in metadata and
enforced by directory layout + a .gitignore rule.
| Tier | Default? | Git status | Typical use |
|---|---|---|---|
public | no | tracked | identity.md, README, public roadmap |
project-private | yes (default if omitted) | tracked | workitems, decisions, logs, working-style.md |
user-private | no | NOT tracked | team-and-relationships.md, personal scratch notes |
Most entities omit the field entirely and inherit project-private.
user-privateEntities with privacy: user-private MUST live under a directory named
private/ somewhere within context/. Projects should carry a
.gitignore rule like:
context/**/private/
This pattern matches private/ directories at any depth under
context/, including directly under context/ itself. So all of these
are excluded from git:
context/private/context/owner/private/context/foo/bar/private/But NOT directories named private/ outside context/ (e.g.
cli/src/private/ would NOT be ignored by this rule).
Installers and validation tools should verify that any entity with
privacy: user-private lives under a private/ directory under
context/. A user-private entity outside such a directory is invalid.
owner-profiling skill: context/owner/private/team-and-relationships.md
is the canonical example. Notes about coworkers’ communication styles,
sensitivities, and interpersonal dynamics should never be checked into a
shared repository.context/private/ for
personal drafts, half-formed ideas, or session notes that the agent
should see but the team should not.---
apiVersion: processkit.projectious.work/v1
kind: Context
metadata:
id: OWNER-team-and-relationships
privacy: user-private
created: 2026-04-07T00:00:00Z
spec:
description: "Per-person notes about collaborators."
---
# Team and Relationships
> ⚠️ PRIVACY: user-private. This file lives under context/owner/private/
> which is gitignored.
...
A frontmatter declaration alone wouldn’t prevent the file from being
checked into git — git add doesn’t read frontmatter. The directory rule
gives a hard guarantee via .gitignore. The frontmatter declaration is
documentation + lint validation; the directory placement is the actual
safety mechanism.
If you want a user-private file outside any private/ directory, you
have two options:
private/ directory (correct)privacy: public is documentation, not security — anything in a public
git repo is already world-readable. The distinction between public and
project-private only matters when the project is in a private repo: in
that case public files are fine to syndicate to a public mirror or
include in a generated README, while project-private files are not.
For projects in public repos, public and project-private are
functionally identical.
The processkit Hugo site publishes only explicitly curated content under
docs-site/content/en/. It does not mount a project context/ tree.
The local documentation gate also rejects any directory named private
inside the publishable content tree.
Derived projects that mount or generate Hugo content from context/ must
apply the same boundary before invoking Hugo: no private/ directory at
any depth may enter the site’s content or static mounts.
For projects where multiple people work from the same repository, the
current convention is flat context/private/: a single gitignored
directory that is personal to whoever is running the agent locally.
A per-user subdirectory convention (context/private/<username>/) is
not yet standardized. The actor primitive (actor-profile) captures
identity but the privacy directory layout does not yet key on it.
Defer the multi-user convention until a real project asks for it —
at that point, context/private/<username>/ is the natural extension
and requires no schema changes, only a new gitignore pattern.
This decision was recorded in response to aibox DEC-030 / processkit#1 .
SmoothTiger/SmoothRiver v2 keeps durable facts in existing entity primitives and uses projection skills for runtime files. The source of truth remains processkit context; generated files are checked against that source.
Metric, Model, Process, Schedule, and StateMachine are legacy
v1 migration-source kinds, not shipped v2 entity primitives. Model
selection uses model-recommender roster/configuration data. Process
definitions are Artifacts plus process-instance WorkItems. Schedule
semantics use Binding(type=time-window). Runtime state-machine YAML
files remain implementation contracts, not user-authored StateMachine
entities.
Hook inbox items are Notes with spec.inbox. The note-management MCP
server owns the lifecycle:
prepare_hook_inbox_dirscapture_inbox_itemclaim_inbox_itemcomplete_inbox_itemfail_inbox_itemValid injection modes are interrupt, ambient, and next-cycle.
They belong on Binding(type=triage-classification) records.
Agent cards are Artifact-backed projections. Store the canonical source
as an Artifact with spec.kind: agent-card, then use the agent-card
MCP server’s project_agent_card tool to render the public JSON file.
spec.projection_path and spec.projection_checksum let validation
detect missing or stale projections.
The eval-gate-authoring MCP server turns observed run outputs into:
Artifact(spec.kind=eval-spec)GateUse collect_run_outputs, codify_eval, calibrate_judge, and
bind_eval_to_runs. LLM judge eval specs are expected to have a
calibration log before they are treated as enforceable gates.
Security policy sources are Artifacts. The security-projections MCP
server emits runtime policy files from those Artifacts:
project_agent_ids_rule renders Agent-IDS JSON rules.project_tetragon_tracing_policy renders Tetragon-style YAML
tracing policies.Keep the Artifact as the reviewable source and treat generated policy files as projections.
v2_contractspk-doctor includes a v2_contracts check for v2 workflow and
projection guardrails. It currently checks:
conditions.recurrence_rule.Run it through the normal doctor command:
uv run context/skills/processkit/pk-doctor/scripts/doctor.py
Do not edit this page by hand. Its authoritative source is
release/v1-release-facts.json.
| Fact | Value |
|---|---|
| Release | v1.0.0-alpha.5 |
| Status | exact-pin prerelease |
| Signature | Ed25519 |
| Installer protocol | processkit.projectious.work/installer/v1alpha1 |
| Entity API version | processkit.projectious.work/v2 |
processkit-v1.0.0-alpha.5-x86_64-unknown-linux-gnuprocesskit-v1.0.0-alpha.5-aarch64-unknown-linux-gnuprocesskit-v1.0.0-alpha.5-x86_64-apple-darwinprocesskit-v1.0.0-alpha.5-aarch64-apple-darwinEvery published asset has a checksum sidecar and is bound into the signed release envelope. The public release is the authority for final checksums and host provenance.