docs: raise the format specification to revision 0.9 and land the reconciliation

Revision 0.9 adds section 20, the cadence and event subsystems contract, and
carries two corrections the implementation forced. Section 6.1 now states that a
duration is the authored literal or a non-negative finite number already in
milliseconds, since a DurationSpec may be the resolved output of a ValueSpec or
a bounded TimeSpec, with the one documented exception of an automation track's
`at`, which 19.1 keeps literal-only so that point ordering stays decidable at
import. Section 20.11 documents the rejection of an undeclared input name in an
event action's `with` map as ERR_UNKNOWN_FIELD — the section's own convention
for that shape of error, replacing an invented code that appeared nowhere in the
registry.

The review record is committed with the code it describes: the two code triages
that found these defects, the reconciliation plan that sequenced the fixes, and
a follow-up debt record listing what was deliberately left open — the unchecked
JSON Schema artifact, degenerate path arcs, post-effect transient allocation,
the window-traffic fixture's per-copy wrap bounds, and the unstated
`ownership: "persistent"` value on a sound action. None of the five blocks phase
6; all five are written down rather than dropped.

Devlog entries are backfilled for the two milestones that had none: phase 3c
slice 2, the audio lifecycle and voice ceilings, and slice 4d, the renderer
core. The implementation status summary now reflects the reconciled state rather
than the in-flight one.

231 tests pass. tools/verify-spec-contract.py reports 46 declared diagnostic
codes with every used code resolving and its two long-standing unresolved
cross-references unchanged.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01ShxxFqFmCUDQnQvFNm4TKy
This commit is contained in:
2026-09-06 21:54:09 +00:00
co-authored by Claude Opus 5
parent 3db1df058f
commit c4332363a9
30 changed files with 7892 additions and 137 deletions
+204 -36
View File
@@ -346,14 +346,32 @@
},
"cadence": {
"type": "object",
"description": "Procedural rhythm clocks and pulse pools.",
"description": "Procedural rhythm clocks, intensity, and automatic one-shot sound policies (sections 20.3-20.7).",
"additionalProperties": false,
"properties": {
"clocks": {
"type": "object"
"intensity": {
"$ref": "#/definitions/ValueSpec"
},
"pools": {
"type": "object"
"minGap": {
"$ref": "#/definitions/DurationSpec"
},
"clocks": {
"type": "object",
"additionalProperties": false,
"properties": {
"routine": {
"$ref": "#/definitions/CadenceClockRange"
},
"intermittent": {
"$ref": "#/definitions/CadenceClockRange"
},
"occasional": {
"$ref": "#/definitions/CadenceClockRange"
},
"rare": {
"$ref": "#/definitions/CadenceClockRange"
}
}
}
}
},
@@ -376,13 +394,13 @@
},
"events": {
"type": "object",
"description": "Discrete lifecycle and state change event triggers.",
"patternProperties": {
"^[a-z][a-z0-9_-]*$": {
"type": "object"
}
"description": "Discrete lifecycle and state change event triggers (section 20.10, PRD 90).",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": false
"additionalProperties": {
"$ref": "#/definitions/EventDefinition"
}
},
"scenarios": {
"type": "object",
@@ -1969,7 +1987,7 @@
}
},
"cadence": {
"type": "object"
"$ref": "#/definitions/SoundCadence"
},
"bus": {
"type": "string",
@@ -1980,6 +1998,178 @@
}
}
},
"CadenceClockRange": {
"type": "object",
"description": "Interval range for a cadence clock class (section 20.3).",
"required": [
"min",
"max"
],
"additionalProperties": false,
"properties": {
"min": {
"$ref": "#/definitions/DurationSpec"
},
"max": {
"$ref": "#/definitions/DurationSpec"
}
}
},
"SoundCadence": {
"type": "object",
"description": "Cadence configuration for a sound definition (section 20.4).",
"required": [
"class"
],
"additionalProperties": false,
"properties": {
"class": {
"type": "string",
"enum": [
"ambient",
"routine",
"intermittent",
"occasional",
"rare",
"scenario"
]
},
"weight": {
"$ref": "#/definitions/ValueSpec"
},
"cooldown": {
"$ref": "#/definitions/DurationSpec"
},
"overlap": {
"type": "boolean"
},
"when": {
"$ref": "#/definitions/ConditionSpec"
}
}
},
"ActionSpec": {
"type": "object",
"description": "An Action Model 0.1 action (sections 22-30, 20.11-20.12).",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"enum": [
"set",
"override",
"sound",
"event",
"spawn",
"remove",
"control"
]
},
"id": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"when": {
"$ref": "#/definitions/ConditionSpec"
},
"chance": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"critical": {
"type": "boolean"
},
"target": {
"type": "string"
},
"value": {
"$ref": "#/definitions/ValueSpec"
},
"sound": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"event": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"command": {
"type": "string",
"enum": [
"start",
"stop",
"enable",
"disable",
"pause",
"resume",
"reset"
]
},
"with": {
"type": "object"
},
"scope": {
"type": "string",
"enum": [
"scenario",
"duration"
]
},
"duration": {
"$ref": "#/definitions/DurationSpec"
},
"lifetime": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"$ref": "#/definitions/ValueSpec"
}
]
},
"ownership": {
"type": "string",
"enum": [
"performance",
"scenario",
"persistent"
]
},
"transition": {
"type": "object"
}
}
},
"EventDefinition": {
"type": "object",
"description": "A reusable named action bundle (section 20.10, PRD 90).",
"required": [
"actions"
],
"additionalProperties": false,
"properties": {
"inputs": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/ParameterSpec"
}
},
"actions": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/definitions/ActionSpec"
}
}
}
},
"VisualPoint": {
"type": "object",
"additionalProperties": false,
@@ -2899,10 +3089,6 @@
"spawn": {
"$ref": "#/definitions/VisualSpawn"
},
"release": false,
"ownership": false,
"inputs": false,
"cancelWithScenario": false,
"content": {
"$ref": "#/definitions/VisualObjectMap"
}
@@ -2941,10 +3127,6 @@
"spawn": {
"$ref": "#/definitions/VisualSpawn"
},
"release": false,
"ownership": false,
"inputs": false,
"cancelWithScenario": false,
"position": {
"type": "object",
"additionalProperties": false,
@@ -3102,10 +3284,6 @@
"spawn": {
"$ref": "#/definitions/VisualSpawn"
},
"release": false,
"ownership": false,
"inputs": false,
"cancelWithScenario": false,
"position": {
"type": "object",
"additionalProperties": false,
@@ -3212,8 +3390,7 @@
},
"trail": {
"$ref": "#/definitions/VisualTrail"
},
"links": false
}
}
},
{
@@ -3250,10 +3427,6 @@
"spawn": {
"$ref": "#/definitions/VisualSpawn"
},
"release": false,
"ownership": false,
"inputs": false,
"cancelWithScenario": false,
"repeat": {
"$ref": "#/definitions/VisualObject"
},
@@ -3292,12 +3465,7 @@
},
"links": {
"$ref": "#/definitions/VisualLinks"
},
"rate": false,
"burst": false,
"limit": false,
"capacity": false,
"lifetime": false
}
}
}
]