CUST-WP-0060 T01-T03: canon ratified active, terminology v0.2, schemas + validator
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 3s

- work-record-types_v0.1.md + autonomy-lanes_v0.1.md: status active
  (founder ratification 2026-07-20, hub decision f4640f9e); registry
  grandfathers legacy task-id variants (-T1, -LEGACY-Txx)
- workplan-terminology-fleet: v0.2 addendum — work-record umbrella,
  kind vocabulary, suggestion as legacy bridge name (T02)
- canon/standards/schemas/work-records/: spine + intake/decision/
  engagement JSON schemas (T03); conditional spine requirements,
  historical grace for terminal records
- tools/validate_work_records.py: registry+schema validator for CI
  (T04); jsonschema with inlined spine refs, fallback checks without;
  proof runs clean: the-custodian 384 records, binky-control 45

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
codex 2026-07-20 02:07:36 +02:00
parent 5ccf5fcd90
commit f4101cdd9a
9 changed files with 378 additions and 7 deletions

View file

@ -3,7 +3,7 @@ id: canon-autonomy-lanes
type: standard
title: "Autonomy Lanes (Fleet) v0.1"
domain: custodian
status: draft
status: active
version: "0.1"
created: "2026-07-20"
updated: "2026-07-20"
@ -16,7 +16,7 @@ origin: binky-control/AutonomyPolicy.md (ratified for Binky 2026-07-16, DEC-2026
# Autonomy Lanes (Fleet) v0.1
> Draft pending founder ratification (CUST-WP-0060-T01). Promotes the
> Ratified by founder 2026-07-20 (CUST-WP-0060-T01, hub decision f4640f9e). Promotes the
> binky-control AutonomyPolicy lane model to fleet canon, unchanged in
> substance. binky-control's `AutonomyPolicy.md` remains the company-level
> policy instance; this standard makes the lane vocabulary and enforcement

View file

@ -0,0 +1,43 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://canon.coulomb.social/schemas/work-records/decision.schema.json",
"title": "Decision",
"description": "Authored YAML block for kind=decision (approval package + resolution). Id: {PREFIX}-DEC-YYYY-NNN; legacy DEC-YYYY-NNN grandfathered. Lifecycle: prepared -> resolved(approved|rejected|revised|deferred). 'deferred' is also accepted as a stored status (legacy binky template).",
"type": "object",
"required": ["id", "title", "status", "lane"],
"properties": {
"id": { "type": "string", "pattern": "^([A-Z]+-)?DEC-[0-9]{4}-[0-9]{3}$" },
"kind": { "const": "decision" },
"title": { "type": "string", "minLength": 5 },
"status": { "enum": ["prepared", "resolved", "deferred"] },
"outcome": {
"type": "string",
"description": "Free text beginning with approved|rejected|revised|deferred; qualifiers allowed (e.g. 'approved with edits')."
},
"lane": { "$ref": "spine.schema.json#/$defs/lane" },
"owner": { "$ref": "spine.schema.json#/$defs/owner" },
"tags": { "$ref": "spine.schema.json#/$defs/tags" },
"created_at": { "$ref": "spine.schema.json#/$defs/date" },
"needed_by": { "type": "string" },
"attention_cost": { "type": "string" },
"agent_recommendation": { "type": "string" },
"evidence": { "type": "array" },
"options": { "type": "array" },
"fallback_if_no_response": { "type": "string" },
"resolved_at": { "$ref": "spine.schema.json#/$defs/date" },
"resolved_by": { "type": "string" },
"consequence": { "type": "string" },
"state_hub_decision_id": { "$ref": "spine.schema.json#/$defs/uuid" }
},
"allOf": [
{
"if": { "properties": { "status": { "const": "resolved" } }, "required": ["status"] },
"then": { "required": ["outcome", "resolved_at", "resolved_by"] }
},
{
"if": { "properties": { "status": { "const": "prepared" } }, "required": ["status"] },
"then": { "required": ["agent_recommendation", "fallback_if_no_response"] }
}
],
"additionalProperties": true
}

View file

@ -0,0 +1,29 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://canon.coulomb.social/schemas/work-records/engagement.schema.json",
"title": "Engagement",
"description": "Authored YAML block for kind=engagement (scheduled external interaction). Id: {PREFIX}-ENG-YYYY-NNN; legacy OH-YYYY-NNN grandfathered. Lifecycle: queued -> prepared -> done.",
"type": "object",
"required": ["id", "title", "status"],
"properties": {
"id": { "type": "string", "pattern": "^([A-Z]+-ENG-[0-9]{4}-[0-9]{3}|OH-[0-9]{4}-[0-9]{3})$" },
"kind": { "const": "engagement" },
"title": { "type": "string", "minLength": 5 },
"status": { "enum": ["queued", "prepared", "done"] },
"counterparty": { "type": "string" },
"lane": { "$ref": "spine.schema.json#/$defs/lane", "description": "Defaults to orange for engagements; explicit value wins." },
"owner": { "$ref": "spine.schema.json#/$defs/owner" },
"tags": { "$ref": "spine.schema.json#/$defs/tags" },
"prepared_material": { "type": "array" },
"deadline_pressure": { "type": "string" },
"origin": { "type": "string" },
"state_hub_engagement_id": { "$ref": "spine.schema.json#/$defs/uuid" }
},
"allOf": [
{
"if": { "properties": { "status": { "const": "prepared" } }, "required": ["status"] },
"then": { "required": ["prepared_material", "counterparty"] }
}
],
"additionalProperties": true
}

View file

@ -0,0 +1,44 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://canon.coulomb.social/schemas/work-records/intake.schema.json",
"title": "Intake Item",
"description": "Authored YAML block for kind=intake. Id: {PREFIX}-IN-NNNN; legacy AWQ-NNN grandfathered. Lifecycle: open -> vetted -> routed -> closed(promoted|declined|absorbed).",
"type": "object",
"required": ["id", "title"],
"properties": {
"id": { "type": "string", "pattern": "^([A-Z]+-IN-[0-9]{4}|AWQ-[0-9]{3})$" },
"kind": { "const": "intake" },
"title": { "type": "string", "minLength": 5 },
"status": { "enum": ["open", "vetted", "routed", "closed"] },
"outcome": { "enum": ["promoted", "declined", "absorbed"] },
"lane": { "$ref": "spine.schema.json#/$defs/lane" },
"owner": { "$ref": "spine.schema.json#/$defs/owner" },
"tags": { "$ref": "spine.schema.json#/$defs/tags" },
"priority": { "enum": ["high", "medium", "low"] },
"pulls_from": { "type": "array" },
"promoted_to": { "type": "string", "description": "Canonical id of the record this intake was promoted to." },
"origin": { "type": "string" },
"notes": { "type": "string" },
"state_hub_intake_id": { "$ref": "spine.schema.json#/$defs/uuid" }
},
"allOf": [
{
"if": { "properties": { "status": { "const": "closed" } }, "required": ["status"] },
"then": { "required": ["outcome"] }
},
{
"if": { "properties": { "outcome": { "const": "promoted" } }, "required": ["outcome"] },
"then": { "required": ["promoted_to"] }
},
{
"if": {
"not": {
"properties": { "status": { "const": "closed" } },
"required": ["status"]
}
},
"then": { "required": ["lane"] }
}
],
"additionalProperties": true
}

View file

@ -0,0 +1,39 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://canon.coulomb.social/schemas/work-records/spine.schema.json",
"title": "Work Record Spine (shared definitions)",
"description": "Shared spine per canon/standards/work-record-types_v0.1.md. Kind schemas $ref these definitions. additionalProperties stays open: kind-specific fields extend the spine, never replace it.",
"$defs": {
"lane": {
"enum": ["green", "blue", "yellow", "orange", "red"]
},
"uuid": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
},
"date": {
"type": "string",
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
},
"tags": {
"type": "array",
"items": { "type": "string", "pattern": "^[a-z0-9-]+$" }
},
"owner": {
"type": "string",
"minLength": 2
},
"spineOpen": {
"type": "object",
"description": "Spine requirements for records in a non-terminal status.",
"required": ["id", "lane"],
"properties": {
"lane": { "$ref": "#/$defs/lane" },
"owner": { "$ref": "#/$defs/owner" },
"tags": { "$ref": "#/$defs/tags" },
"uuid": { "$ref": "#/$defs/uuid" },
"created_at": { "$ref": "#/$defs/date" }
}
}
}
}

View file

@ -2,7 +2,7 @@
# CI and fix-consistency validate id patterns against this file.
# New kinds/prefixes land here by canon PR only.
version: "0.1"
status: draft
status: active
kinds:
- kind: workplan
id_patterns:
@ -13,6 +13,13 @@ kinds:
- "^[A-Z]+-WP-[0-9]{4}-T[0-9]{2,3}$"
- "^ADHOC-[0-9]{4}-[0-9]{2}-[0-9]{2}-T[0-9]{2}$"
lifecycle: [wait, todo, progress, done, cancel]
legacy_patterns:
- pattern: "^[A-Z]+-WP-[0-9]{4}-T[0-9]$"
source: early single-digit task suffixes (pre task-block convention)
grandfathered: true
- pattern: "^[A-Z]+-WP-[0-9]{4}-LEGACY-T[0-9]{2}$"
source: archived-workplan legacy task renumbering
grandfathered: true
- kind: intake
id_patterns:
- "^[A-Z]+-IN-[0-9]{4}$"

View file

@ -3,7 +3,7 @@ id: canon-work-record-types
type: standard
title: "Work Record Types & Identity (Fleet) v0.1"
domain: custodian
status: draft
status: active
version: "0.1"
created: "2026-07-20"
updated: "2026-07-20"
@ -16,7 +16,7 @@ machine_copy: canon/standards/work-record-types.yaml
# Work Record Types & Identity (Fleet) v0.1
> Draft pending founder ratification (CUST-WP-0060-T01). Source:
> Ratified by founder 2026-07-20 (CUST-WP-0060-T01, hub decision f4640f9e). Source:
> `research/WorkOrchestrationArchitectureDraft.md` v0.2 (founder-reviewed
> 2026-07-20). Extends — does not replace —
> `workplan-terminology-fleet_v0.1.md` and ADR-001/ADR-005.

View file

@ -4,14 +4,15 @@ type: standard
title: "Workplan Terminology (Fleet) v0.1"
domain: custodian
status: active
version: "0.1"
version: "0.2"
created: "2026-07-08"
updated: "2026-07-08"
updated: "2026-07-20"
scope: fleet
related_workplans:
- CUST-WP-0055
- STATE-WP-0054
- STATE-WP-0069
- CUST-WP-0060
supersedes: none
---
@ -43,6 +44,21 @@ Authoritative interface matrix for State Hub:
| Hub index row | **workplan** (product term) | DB entity keyed by UUID; may still use legacy column names internally |
| Task within a workplan | **task** | `id: {WP}-TNN` in workplan file blocks |
## Work-record umbrella (v0.2 addendum, CUST-WP-0060)
The workplan and task definitions above are unchanged. Since v0.2 they are
two *kinds* of the fleet umbrella term **work record** — any identified,
lifecycle-bearing coordination artefact. The full kind registry (workplan,
task, **intake item**, **decision**, **engagement**, **register entry**),
the conventional spine, identity layering (UUIDv7 internal, canonical names
external), and grandfathered legacy id schemes (`AWQ-`, `DEC-`, `OH-`) are
normative in `work-record-types_v0.1.md` (+ machine registry
`work-record-types.yaml`). Autonomy-lane vocabulary is normative in
`autonomy-lanes_v0.1.md`. "Suggestion" is a legacy bridge name for the
intake kind (state-hub suggestions table: read-only legacy pending
close-out). This file keeps its `_v0.1` name for reference stability; the
frontmatter `version` field is authoritative.
Use **workplan** in human-facing prose: `SCOPE.md`, `AGENTS.md`, `INTENT.md`,
README, workplan bodies, operator runbooks, and agent session guidance.