target-revenue/schemas/phase_manifest.schema.json
tegwick 55a1756f7c Merge spec/ into specs/: one specs directory for the whole repo
Moves TargetRevenueLicenseConcept.md from the separate singular spec/
directory into specs/ (git mv, preserving history) and updates every live
cross-reference (README, CONTRIBUTING, all specs/*.md, workplans, schema
comments, source docstrings, test file) to the new path.

This resolves the spec/ vs specs/ split that history/260728-SWOT-Assessment.md
flagged as a "perpetual footgun" and recommended deciding on. The historical
record of that split and the recommendation itself are left unedited in
history/ (a dated assessment, not a living document) — only README and TSD
now document the merge as resolved, with a pointer back to that history file
for context.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-29 10:22:14 +02:00

108 lines
3.9 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://target-revenue.example/schemas/phase_manifest.schema.json",
"title": "Phase Manifest",
"description": "Stage 0 schema per specs/TechnicalSpecificationDocument.md §3.1 and specs/OpenQuestions-WorkingDefaults.md Q3/Q6/Q8. Field names and semantics are authoritative from specs/TargetRevenueLicenseConcept.md §16.",
"type": "object",
"required": ["framework", "license", "phase"],
"additionalProperties": false,
"properties": {
"framework": {
"type": "string",
"description": "Framework version tag, e.g. TRF-0.1."
},
"license": {
"type": "string",
"description": "TRSL version tag, e.g. TRSL-0.1."
},
"phase": {
"type": "object",
"required": [
"id",
"milestone_release",
"initial_target",
"future_license",
"degeneration_policy",
"longstop_at",
"ledger"
],
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^trsl:phase:[a-zA-Z0-9._-]+$",
"description": "Globally unique, immutable once published."
},
"milestone_release": {
"type": "object",
"required": ["name", "source_revision"],
"additionalProperties": false,
"properties": {
"name": { "type": "string" },
"source_revision": { "type": "string" },
"artifact_sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$",
"description": "Recommended; required if a built artifact (not just source) is governed."
}
}
},
"initial_target": {
"type": "object",
"required": ["amount", "currency"],
"additionalProperties": false,
"properties": {
"amount": { "type": "number", "exclusiveMinimum": 0 },
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"description": "ISO 4217 code. Working default Q6: one native currency per Phase."
}
}
},
"target_basis": {
"type": "object",
"description": "Recommended transparency metadata (working default Q5), not legally required.",
"additionalProperties": false,
"properties": {
"estimated_effort_days": { "type": "number", "minimum": 0 },
"daily_rate": { "type": "number", "minimum": 0 },
"approved_direct_costs": { "type": "number", "minimum": 0 },
"target_multiple": {
"type": "number",
"minimum": 0,
"description": "Open decimal per working default Q4. Guidance classes {0,1,10,100,1000} are not a closed enum."
}
}
},
"future_license": {
"type": "string",
"enum": ["MIT", "Apache-2.0"],
"description": "Working default Q3: closed enum for Stage 0."
},
"degeneration_policy": {
"type": "string",
"pattern": "^trsl:policy:[a-zA-Z0-9._-]+@[0-9]+(\\.[0-9]+)*$",
"description": "e.g. trsl:policy:linear-longstop-v0@1.0 (working default Q7)."
},
"longstop_at": {
"type": "string",
"format": "date-time",
"description": "Required for Stage 0 per working default Q8. Full-remission / maximum-protection instant."
},
"ledger": {
"type": "string",
"description": "URL or relative path URI to the authoritative Target Ledger for this Phase."
}
}
},
"extensions": {
"type": "array",
"items": {
"type": "string",
"pattern": "^trsl:extension:[a-zA-Z0-9._-]+@[0-9]+(\\.[0-9]+)*$"
},
"description": "Optional. Applicable monetization profiles/extensions for this Phase."
}
}
}