CUST-WP-0060 T01-T03: canon ratified active, terminology v0.2, schemas + validator
- 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:
parent
5ccf5fcd90
commit
f4101cdd9a
9 changed files with 378 additions and 7 deletions
43
canon/standards/schemas/work-records/decision.schema.json
Normal file
43
canon/standards/schemas/work-records/decision.schema.json
Normal 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
|
||||
}
|
||||
29
canon/standards/schemas/work-records/engagement.schema.json
Normal file
29
canon/standards/schemas/work-records/engagement.schema.json
Normal 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
|
||||
}
|
||||
44
canon/standards/schemas/work-records/intake.schema.json
Normal file
44
canon/standards/schemas/work-records/intake.schema.json
Normal 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
|
||||
}
|
||||
39
canon/standards/schemas/work-records/spine.schema.json
Normal file
39
canon/standards/schemas/work-records/spine.schema.json
Normal 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" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue