@eir-labs/coltrane 0.5.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- package/agents/bill.json +59 -0
- package/agents/deploy-agent.json +68 -0
- package/agents/deploy-scout.json +40 -0
- package/agents/john.json +42 -0
- package/agents/miles.json +44 -0
- package/charts/software-delivery-v1.json +9 -0
- package/charts/software-delivery-v2.json +39 -0
- package/dist/src/bifrost_invoker.js +5 -3
- package/dist/src/bifrost_invoker.js.map +1 -1
- package/dist/src/canonical_form.d.ts +23 -0
- package/dist/src/canonical_form.js +53 -0
- package/dist/src/canonical_form.js.map +1 -1
- package/dist/src/chart.d.ts +254 -0
- package/dist/src/chart.js +897 -0
- package/dist/src/chart.js.map +1 -0
- package/dist/src/claude_invoker.d.ts +20 -3
- package/dist/src/claude_invoker.js +30 -5
- package/dist/src/claude_invoker.js.map +1 -1
- package/dist/src/cli.d.ts +19 -4
- package/dist/src/cli.js +132 -9
- package/dist/src/cli.js.map +1 -1
- package/dist/src/composition.d.ts +24 -0
- package/dist/src/composition.js +50 -5
- package/dist/src/composition.js.map +1 -1
- package/dist/src/conduct_daemon.d.ts +59 -0
- package/dist/src/conduct_daemon.js +178 -0
- package/dist/src/conduct_daemon.js.map +1 -0
- package/dist/src/genome_schema.d.ts +1476 -146
- package/dist/src/genome_schema.js +438 -32
- package/dist/src/genome_schema.js.map +1 -1
- package/dist/src/genome_store.d.ts +79 -0
- package/dist/src/genome_store.js +503 -0
- package/dist/src/genome_store.js.map +1 -0
- package/dist/src/gig_tracker.d.ts +11 -1
- package/dist/src/gig_tracker.js +5 -0
- package/dist/src/gig_tracker.js.map +1 -1
- package/dist/src/hosted_tools.d.ts +23 -0
- package/dist/src/hosted_tools.js +170 -0
- package/dist/src/hosted_tools.js.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/ledger.d.ts +22 -0
- package/dist/src/ledger.js +4 -0
- package/dist/src/ledger.js.map +1 -1
- package/dist/src/loader.d.ts +9 -1
- package/dist/src/loader.js +105 -5
- package/dist/src/loader.js.map +1 -1
- package/dist/src/mcp.js +52 -5
- package/dist/src/mcp.js.map +1 -1
- package/dist/src/output_mirror.d.ts +70 -0
- package/dist/src/output_mirror.js +381 -0
- package/dist/src/output_mirror.js.map +1 -0
- package/dist/src/outputs.d.ts +77 -1
- package/dist/src/outputs.js +179 -37
- package/dist/src/outputs.js.map +1 -1
- package/dist/src/play_worker.d.ts +24 -0
- package/dist/src/play_worker.js +49 -0
- package/dist/src/play_worker.js.map +1 -0
- package/dist/src/registry.d.ts +2 -0
- package/dist/src/registry.js +63 -33
- package/dist/src/registry.js.map +1 -1
- package/dist/src/reuse.d.ts +56 -0
- package/dist/src/reuse.js +0 -0
- package/dist/src/reuse.js.map +1 -1
- package/dist/src/runtime.d.ts +91 -2
- package/dist/src/runtime.js +236 -18
- package/dist/src/runtime.js.map +1 -1
- package/dist/src/seal_drill.d.ts +32 -0
- package/dist/src/seal_drill.js +138 -0
- package/dist/src/seal_drill.js.map +1 -0
- package/dist/src/server.d.ts +39 -1
- package/dist/src/server.js +760 -68
- package/dist/src/server.js.map +1 -1
- package/dist/src/skill_subprocess.js +12 -4
- package/dist/src/skill_subprocess.js.map +1 -1
- package/dist/src/supabase_genome.d.ts +28 -0
- package/dist/src/supabase_genome.js +49 -0
- package/dist/src/supabase_genome.js.map +1 -0
- package/dist/src/tool_surface.d.ts +5 -0
- package/dist/src/tool_surface.js +15 -0
- package/dist/src/tool_surface.js.map +1 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/worker.d.ts +182 -0
- package/dist/src/worker.js +609 -0
- package/dist/src/worker.js.map +1 -0
- package/domain_types/branch-state.json +21 -0
- package/domain_types/change-context.json +39 -0
- package/domain_types/change-decision.json +36 -0
- package/domain_types/change-plan.json +47 -0
- package/domain_types/change-request.json +24 -0
- package/domain_types/change-set.json +46 -0
- package/domain_types/change-verdict.json +26 -0
- package/domain_types/deploy-verdict.json +23 -0
- package/domain_types/design-brief.json +37 -0
- package/domain_types/design-concept.json +36 -0
- package/domain_types/design-definition.json +37 -0
- package/domain_types/design-question.json +23 -0
- package/domain_types/design-verdict.json +27 -0
- package/domain_types/preview-deployment.json +32 -0
- package/institutions/quartet.json +344 -0
- package/package.json +21 -3
- package/skills/vercel-api/fixtures/error.json +10 -0
- package/skills/vercel-api/fixtures/ready.json +10 -0
- package/skills/vercel-api/fixtures/unsettled.json +10 -0
- package/skills/vercel-api/meta.json +10 -0
- package/skills/vercel-api/skill.mjs +63 -0
- package/standards/preview-deploy-v1.json +89 -0
- package/standards/product-design-v1.json +122 -0
- package/standards/promote-v1.json +41 -0
- package/standards/software-change-v1.json +147 -0
- package/venues/ci-deploy-room-v1.json +28 -0
- package/venues/empty-room-v1.json +19 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "branch-state",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"extends": "Signal",
|
|
5
|
+
"domain": "preview-deploy",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"description": "The sensed state of the branch to deploy: its name and its HEAD commit, read independently of the change-set the run reviewed. The between-movement edge carries a change-set (diffs, tests, rationale) which holds no commit_sha and no branch — software-change-v1's write-change chair emits diffs as content, never an applied commit — so the deploy input is sensed here rather than threaded through the diff. This decouples the deploy from the diff content and keeps the edge honest.",
|
|
8
|
+
"schema": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"branch": { "type": "string", "description": "The git branch to deploy to the preview target." },
|
|
12
|
+
"commit_sha": { "type": "string", "description": "The branch HEAD commit, sensed directly — the exact commit the preview will build." },
|
|
13
|
+
"project_id": { "type": "string", "description": "The Vercel project id the branch belongs to, when known at sense time." }
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"required_fields": [
|
|
17
|
+
"source",
|
|
18
|
+
"branch",
|
|
19
|
+
"commit_sha"
|
|
20
|
+
]
|
|
21
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "change-context",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"extends": "Interpretation",
|
|
5
|
+
"domain": "software-change",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"description": "The exhaustive read of the material a change lands in, produced before any decision is taken. Records what is present AND what is absent: unknowns is required because an incomplete reading that omits its gaps is indistinguishable from a complete one, and every downstream seat would treat it as complete.",
|
|
8
|
+
"schema": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"repository": { "type": "string", "description": "Repository or working-tree the reading covers." },
|
|
12
|
+
"boundary": { "type": "array", "items": { "type": "string" }, "description": "The declared extent of the read: paths and artefacts inside it, and those deliberately outside it." },
|
|
13
|
+
"entry_points": { "type": "array", "items": { "type": "string" }, "description": "Where control or data enters the region under change." },
|
|
14
|
+
"relevant_files": {
|
|
15
|
+
"type": "array",
|
|
16
|
+
"description": "Each file the change plausibly touches, with the reason it is relevant and the locator the reading came from.",
|
|
17
|
+
"items": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"properties": {
|
|
20
|
+
"path": { "type": "string" },
|
|
21
|
+
"why": { "type": "string" },
|
|
22
|
+
"locator": { "type": "string", "description": "Tool plus path or query that produced this finding." }
|
|
23
|
+
},
|
|
24
|
+
"required": ["path", "why"]
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"existing_tests": { "type": "array", "items": { "type": "string" }, "description": "Checks that already cover the region — the baseline a later verdict is measured against." },
|
|
28
|
+
"conventions_observed": { "type": "array", "items": { "type": "string" }, "description": "Prevailing patterns the change is expected to hold to." },
|
|
29
|
+
"unknowns": { "type": "array", "items": { "type": "string" }, "description": "Questions the material does not answer and paths that could not be reached. Required: the honest bound of the read." }
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"required_fields": [
|
|
33
|
+
"claims",
|
|
34
|
+
"input_refs",
|
|
35
|
+
"relevant_files",
|
|
36
|
+
"existing_tests",
|
|
37
|
+
"unknowns"
|
|
38
|
+
]
|
|
39
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "change-decision",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"extends": "Judgment",
|
|
5
|
+
"domain": "software-change",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"description": "The direction, fixed once. Names the three commitments a change is held to — scope, non-goals, stop condition — and records the alternatives that were rejected, because subtraction that leaves no record is indistinguishable from oversight. Downstream seats may append observations; they may not revise these fields.",
|
|
8
|
+
"schema": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"scope": { "type": "string", "description": "The observable outcome this change commits to." },
|
|
12
|
+
"non_goals": { "type": "array", "items": { "type": "string" }, "description": "What this change is NOT, and the neighbouring shapes it must not collapse into." },
|
|
13
|
+
"stop_condition": { "type": "string", "description": "The observation at which the work is finished, stated so that someone else could call it." },
|
|
14
|
+
"rejected_alternatives": {
|
|
15
|
+
"type": "array",
|
|
16
|
+
"description": "Directions considered and set aside, each with its reason.",
|
|
17
|
+
"items": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"properties": {
|
|
20
|
+
"alternative": { "type": "string" },
|
|
21
|
+
"reason": { "type": "string" }
|
|
22
|
+
},
|
|
23
|
+
"required": ["alternative", "reason"]
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"risks": { "type": "array", "items": { "type": "string" }, "description": "Consequences the direction accepts knowingly." }
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"required_fields": [
|
|
30
|
+
"criteria",
|
|
31
|
+
"input_refs",
|
|
32
|
+
"scope",
|
|
33
|
+
"non_goals",
|
|
34
|
+
"stop_condition"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "change-plan",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"extends": "Plan",
|
|
5
|
+
"domain": "software-change",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"description": "The ordered structure a change will be built through, settled before anything is written. test_first is required and separate from steps: a plan that lists the check after the change it checks cannot distinguish a passing check from one written to pass, which is the failure this repository's change discipline exists to close.",
|
|
8
|
+
"schema": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"test_first": {
|
|
12
|
+
"type": "array",
|
|
13
|
+
"description": "The checks that land before the change, each with the failure it is expected to show first.",
|
|
14
|
+
"items": {
|
|
15
|
+
"type": "object",
|
|
16
|
+
"properties": {
|
|
17
|
+
"check": { "type": "string" },
|
|
18
|
+
"expected_before": { "type": "string", "description": "What this check reports while the change is absent." }
|
|
19
|
+
},
|
|
20
|
+
"required": ["check", "expected_before"]
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files_touched": { "type": "array", "items": { "type": "string" }, "description": "Paths the plan commits to changing. A path outside this list is a departure to be recorded, not a silent extension." },
|
|
24
|
+
"tradeoffs": {
|
|
25
|
+
"type": "array",
|
|
26
|
+
"description": "Steps where more than one structure would have served, and why this one was taken.",
|
|
27
|
+
"items": {
|
|
28
|
+
"type": "object",
|
|
29
|
+
"properties": {
|
|
30
|
+
"at": { "type": "string" },
|
|
31
|
+
"chosen": { "type": "string" },
|
|
32
|
+
"over": { "type": "string" },
|
|
33
|
+
"why": { "type": "string" }
|
|
34
|
+
},
|
|
35
|
+
"required": ["at", "chosen", "why"]
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"rollback": { "type": "string", "description": "How the change is undone if the verdict fails." }
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"required_fields": [
|
|
42
|
+
"steps",
|
|
43
|
+
"objective",
|
|
44
|
+
"test_first",
|
|
45
|
+
"files_touched"
|
|
46
|
+
]
|
|
47
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "change-request",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"extends": "Signal",
|
|
5
|
+
"domain": "software-change",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"description": "The seed of a software-change run: the change as it arrives, before anyone has read the codebase it lands in. A request that names no observable acceptance cannot be verified at the end of the run, so acceptance_criteria is required at the boundary rather than discovered at the verdict.",
|
|
8
|
+
"schema": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"request_text": { "type": "string", "description": "The change as stated by the requester, unparaphrased." },
|
|
12
|
+
"repository": { "type": "string", "description": "Repository or working-tree identifier the change lands in." },
|
|
13
|
+
"target_paths": { "type": "array", "items": { "type": "string" }, "description": "Paths the requester believes are in scope. A belief, not a finding — the reading phase may contradict it." },
|
|
14
|
+
"acceptance_criteria": { "type": "array", "items": { "type": "string" }, "description": "Observations that would show the change was made. Each entry must be checkable by someone who did not write the change." },
|
|
15
|
+
"out_of_scope": { "type": "array", "items": { "type": "string" }, "description": "Work the requester explicitly excludes." },
|
|
16
|
+
"requested_by": { "type": "string", "description": "The requesting party." }
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"required_fields": [
|
|
20
|
+
"source",
|
|
21
|
+
"request_text",
|
|
22
|
+
"acceptance_criteria"
|
|
23
|
+
]
|
|
24
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "change-set",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"extends": "Artifact",
|
|
5
|
+
"domain": "software-change",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"description": "The change itself, carried as content rather than applied — the seat that produces it holds a read-only grant, so the artefact is reviewable before anything mutates. departures is separate from rationale on purpose: a change that diverged from its plan and amended the record is honest, and a change that diverged silently is not distinguishable from one that did not.",
|
|
8
|
+
"schema": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"diffs": {
|
|
12
|
+
"type": "array",
|
|
13
|
+
"description": "Per-path patch content, in unified-diff form.",
|
|
14
|
+
"items": {
|
|
15
|
+
"type": "object",
|
|
16
|
+
"properties": {
|
|
17
|
+
"path": { "type": "string" },
|
|
18
|
+
"patch": { "type": "string" }
|
|
19
|
+
},
|
|
20
|
+
"required": ["path", "patch"]
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"tests_added": { "type": "array", "items": { "type": "string" }, "description": "Checks introduced by this change, named so a verifier can run exactly them." },
|
|
24
|
+
"rationale": { "type": "array", "items": { "type": "string" }, "description": "The non-obvious choices this change makes, each with the reason it was made." },
|
|
25
|
+
"departures": {
|
|
26
|
+
"type": "array",
|
|
27
|
+
"description": "Where the artefact left the plan, and why.",
|
|
28
|
+
"items": {
|
|
29
|
+
"type": "object",
|
|
30
|
+
"properties": {
|
|
31
|
+
"from_step": { "type": "string" },
|
|
32
|
+
"instead": { "type": "string" },
|
|
33
|
+
"why": { "type": "string" }
|
|
34
|
+
},
|
|
35
|
+
"required": ["from_step", "instead", "why"]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"required_fields": [
|
|
41
|
+
"validation_criteria",
|
|
42
|
+
"input_refs",
|
|
43
|
+
"diffs",
|
|
44
|
+
"rationale"
|
|
45
|
+
]
|
|
46
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "change-verdict",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"extends": "Verdict",
|
|
5
|
+
"domain": "software-change",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"description": "Whether the change built is the change that was decided, measured against the commitments as fixed and not against a revised memory of them. inferred_not_run is required: a verdict that does not separate what was executed from what was reasoned about reads as evidence while resting on inference, which is the one thing a verdict must never do.",
|
|
8
|
+
"schema": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"decision_ref": { "type": "string", "description": "The change-decision this verdict measures against." },
|
|
12
|
+
"criteria_unmet": { "type": "array", "items": { "type": "string" }, "description": "Acceptance criteria the change does not meet, stated plainly." },
|
|
13
|
+
"inferred_not_run": { "type": "array", "items": { "type": "string" }, "description": "Checks that could NOT be executed under the granted tools and were reasoned about instead. Required — an empty list is a claim that everything ran." },
|
|
14
|
+
"failures_verbatim": { "type": "array", "items": { "type": "string" }, "description": "Failure output as the tool reported it: messages, counts, names. Not summaries of them." },
|
|
15
|
+
"scope_drift": { "type": "array", "items": { "type": "string" }, "description": "Where the change exceeded or fell short of the fixed scope." },
|
|
16
|
+
"recommendation": { "type": "string", "enum": ["accept", "amend", "reject", "insufficient-evidence"], "description": "insufficient-evidence is the honest answer when the granted tools could not check what the verdict turns on." }
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"required_fields": [
|
|
20
|
+
"checks",
|
|
21
|
+
"target_ref",
|
|
22
|
+
"pass",
|
|
23
|
+
"inferred_not_run",
|
|
24
|
+
"recommendation"
|
|
25
|
+
]
|
|
26
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "deploy-verdict",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"extends": "Verdict",
|
|
5
|
+
"domain": "preview-deploy",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"description": "Whether the preview build reached a terminal state, and which one. pass is true only when terminal_state is READY. terminal_state carries the honest never-settled path: when the deploy chair's bounded poll loop exhausts its budget with no READY | ERROR | CANCELED observed, it seals terminal_state UNSETTLED with deadline_exceeded true and pass false — a give-up made visible in the ledger rather than a silent hang. logs_tail is present only on a non-READY terminal, so a failure carries the tail of the build log a human can read.",
|
|
8
|
+
"schema": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"terminal_state": { "type": "string", "enum": ["READY", "ERROR", "CANCELED", "UNSETTLED"], "description": "The build's terminal readyState, or UNSETTLED when the poll budget was spent before any terminal state was observed." },
|
|
12
|
+
"logs_tail": { "type": "array", "items": { "type": "string" }, "description": "The tail of the build log, present only when terminal_state is not READY." },
|
|
13
|
+
"deadline_exceeded": { "type": "boolean", "description": "True when the bounded poll loop reached its max_tool_calls ceiling without a terminal readyState. Pairs with terminal_state UNSETTLED and pass false." }
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"required_fields": [
|
|
17
|
+
"checks",
|
|
18
|
+
"target_ref",
|
|
19
|
+
"pass",
|
|
20
|
+
"terminal_state",
|
|
21
|
+
"deadline_exceeded"
|
|
22
|
+
]
|
|
23
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "design-brief",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"extends": "Interpretation",
|
|
5
|
+
"domain": "product-design",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"description": "The product of the first divergence: what was found when the question was held open, before anything was chosen. divergence_breadth and unknowns are both required — a brief that reports only its findings makes a narrow exploration and an exhaustive one look identical, and the definition phase would converge on the narrow one without knowing it.",
|
|
8
|
+
"schema": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"observations": {
|
|
12
|
+
"type": "array",
|
|
13
|
+
"description": "What was found, each with the locator it was found through.",
|
|
14
|
+
"items": {
|
|
15
|
+
"type": "object",
|
|
16
|
+
"properties": {
|
|
17
|
+
"observation": { "type": "string" },
|
|
18
|
+
"locator": { "type": "string", "description": "Tool plus path or query that produced this observation." }
|
|
19
|
+
},
|
|
20
|
+
"required": ["observation"]
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"audience_segments": { "type": "array", "items": { "type": "string" }, "description": "Distinguishable groups the question lands differently for." },
|
|
24
|
+
"unmet_needs": { "type": "array", "items": { "type": "string" }, "description": "Needs the current state does not serve. Findings, not proposals." },
|
|
25
|
+
"adjacent_questions": { "type": "array", "items": { "type": "string" }, "description": "Questions the exploration surfaced that the posed question did not contain." },
|
|
26
|
+
"divergence_breadth": { "type": "string", "enum": ["narrow", "moderate", "wide"], "description": "How far the exploration actually reached, judged against the material available rather than against effort spent." },
|
|
27
|
+
"unknowns": { "type": "array", "items": { "type": "string" }, "description": "What the exploration could not determine. Required: the honest bound of the divergence." }
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"required_fields": [
|
|
31
|
+
"claims",
|
|
32
|
+
"input_refs",
|
|
33
|
+
"observations",
|
|
34
|
+
"unmet_needs",
|
|
35
|
+
"unknowns"
|
|
36
|
+
]
|
|
37
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "design-concept",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"extends": "Artifact",
|
|
5
|
+
"domain": "product-design",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"description": "The product of the second divergence, built rather than described: a concept stated in enough mechanism that someone else could evaluate it. tradeoffs and open_questions are required — a concept presented without either reads as settled, and the delivery seat would verify it against criteria it has no way to know were contested.",
|
|
8
|
+
"schema": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"concept_name": { "type": "string", "description": "Short handle for the concept." },
|
|
12
|
+
"description": { "type": "string", "description": "What it is, in the audience's register." },
|
|
13
|
+
"mechanism": { "type": "array", "items": { "type": "string" }, "description": "How it works, step by step. The part that distinguishes a concept from a wish." },
|
|
14
|
+
"addresses": { "type": "array", "items": { "type": "string" }, "description": "Which success criteria from the definition this concept answers, named individually." },
|
|
15
|
+
"tradeoffs": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"description": "What this concept gives up, and what it buys with it.",
|
|
18
|
+
"items": {
|
|
19
|
+
"type": "object",
|
|
20
|
+
"properties": {
|
|
21
|
+
"gives_up": { "type": "string" },
|
|
22
|
+
"buys": { "type": "string" }
|
|
23
|
+
},
|
|
24
|
+
"required": ["gives_up", "buys"]
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"open_questions": { "type": "array", "items": { "type": "string" }, "description": "What remains unresolved in the concept as built." }
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"required_fields": [
|
|
31
|
+
"validation_criteria",
|
|
32
|
+
"input_refs",
|
|
33
|
+
"mechanism",
|
|
34
|
+
"tradeoffs"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "design-definition",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"extends": "Plan",
|
|
5
|
+
"domain": "product-design",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"description": "The seam between the two diamonds: the one problem the second diamond is opened on, and the ones it is not. discarded is required because a definition that names only what it kept cannot be audited — the reader cannot tell whether an option was considered and rejected or never seen at all.",
|
|
8
|
+
"schema": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"problem_statement": { "type": "string", "description": "The single problem the run commits to solving, stated so that a solution to a different problem would be visibly off-target." },
|
|
12
|
+
"in_scope": { "type": "array", "items": { "type": "string" }, "description": "What the second diamond may explore." },
|
|
13
|
+
"out_of_scope": { "type": "array", "items": { "type": "string" }, "description": "What it may not, and the neighbouring problems this one must not collapse into." },
|
|
14
|
+
"success_criteria": { "type": "array", "items": { "type": "string" }, "description": "Observations that would confirm the problem was solved. Each checkable by someone who did not do the work." },
|
|
15
|
+
"discarded": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"description": "Problems the brief surfaced and this definition set aside, each with its reason.",
|
|
18
|
+
"items": {
|
|
19
|
+
"type": "object",
|
|
20
|
+
"properties": {
|
|
21
|
+
"problem": { "type": "string" },
|
|
22
|
+
"reason": { "type": "string" }
|
|
23
|
+
},
|
|
24
|
+
"required": ["problem", "reason"]
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"audience": { "type": "string", "description": "Who the delivered answer is for, carried forward from the seed." }
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"required_fields": [
|
|
31
|
+
"steps",
|
|
32
|
+
"objective",
|
|
33
|
+
"problem_statement",
|
|
34
|
+
"out_of_scope",
|
|
35
|
+
"success_criteria"
|
|
36
|
+
]
|
|
37
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "design-question",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"extends": "Signal",
|
|
5
|
+
"domain": "product-design",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"description": "The seed of a product-design run: the question the first diamond is opened on, and for whom. audience is required at the boundary because a divergent exploration with no stated audience converges on whoever the reader imagines, and the definition phase then has nothing external to converge against.",
|
|
8
|
+
"schema": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"question": { "type": "string", "description": "The question as posed, unparaphrased." },
|
|
12
|
+
"audience": { "type": "string", "description": "Who the eventual answer is for." },
|
|
13
|
+
"known_context": { "type": "array", "items": { "type": "string" }, "description": "What the requester already holds as established." },
|
|
14
|
+
"constraints": { "type": "array", "items": { "type": "string" }, "description": "Bounds the answer must respect regardless of what the exploration finds." },
|
|
15
|
+
"success_signal": { "type": "string", "description": "What the requester would observe if the run answered well." }
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"required_fields": [
|
|
19
|
+
"source",
|
|
20
|
+
"question",
|
|
21
|
+
"audience"
|
|
22
|
+
]
|
|
23
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "design-verdict",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"extends": "Verdict",
|
|
5
|
+
"domain": "product-design",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"description": "The second convergence: whether the concept built answers the problem that was defined. Measured against the definition as sealed, criterion by criterion. inferred_not_run is required for the same reason as in software change — most design criteria cannot be executed, so a verdict that does not say which ones were only reasoned about overstates its own evidence.",
|
|
8
|
+
"schema": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"definition_ref": { "type": "string", "description": "The design-definition this verdict measures against." },
|
|
12
|
+
"criteria_met": { "type": "array", "items": { "type": "string" }, "description": "Success criteria the concept satisfies, each with the observation that shows it." },
|
|
13
|
+
"criteria_unmet": { "type": "array", "items": { "type": "string" }, "description": "Success criteria the concept does not satisfy, stated plainly and unsoftened." },
|
|
14
|
+
"inferred_not_run": { "type": "array", "items": { "type": "string" }, "description": "Criteria judged by reasoning because no check could be executed. Required — an empty list is a claim that everything was observed." },
|
|
15
|
+
"scope_drift": { "type": "array", "items": { "type": "string" }, "description": "Where the concept answers a different problem than the one defined." },
|
|
16
|
+
"recommendation": { "type": "string", "enum": ["deliver", "iterate", "redefine", "insufficient-evidence"], "description": "redefine returns the run to the first seam: the concept is sound but the problem was the wrong one." }
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"required_fields": [
|
|
20
|
+
"checks",
|
|
21
|
+
"target_ref",
|
|
22
|
+
"pass",
|
|
23
|
+
"criteria_unmet",
|
|
24
|
+
"inferred_not_run",
|
|
25
|
+
"recommendation"
|
|
26
|
+
]
|
|
27
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "preview-deployment",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"extends": "Artifact",
|
|
5
|
+
"domain": "preview-deploy",
|
|
6
|
+
"status": "active",
|
|
7
|
+
"description": "A branch built to a Vercel preview and sealed as a typed artifact — the terminal record of movement-2 and the typed edge into a promote movement. commit_sha and branch are sensed independently of the change-set the run reviewed: the write-change chair that produces a change-set holds a read-only grant and emits diffs as content, never an applied commit, so the deploy is decoupled from the diff and reads the branch HEAD itself. protection is required because it decides whether the preview URL is reachable from a phone at the approval gate: supabase-auth is reachable by any credentialed app user, vercel-sso requires an active Vercel team SSO session, public needs no login. inspector_url is optional — present only when the deployment response carried it.",
|
|
8
|
+
"schema": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"properties": {
|
|
11
|
+
"preview_url": { "type": "string", "description": "The reachable preview URL from POST /v13/deployments (the deployment's url, https-prefixed)." },
|
|
12
|
+
"commit_sha": { "type": "string", "description": "The exact commit deployed, sensed from branch HEAD — not read out of the change-set." },
|
|
13
|
+
"branch": { "type": "string", "description": "The git branch deployed to the preview target." },
|
|
14
|
+
"project_id": { "type": "string", "description": "The Vercel project id (prj_...) the deployment belongs to." },
|
|
15
|
+
"deployment_id": { "type": "string", "description": "The Vercel deployment id (dpl_...), read later by a promote chair to call the promote API." },
|
|
16
|
+
"build_status": { "type": "string", "description": "The last observed Vercel readyState: QUEUED | INITIALIZING | BUILDING | READY | ERROR | CANCELED." },
|
|
17
|
+
"protection": { "type": "string", "enum": ["vercel-sso", "supabase-auth", "public"], "description": "How the preview URL is gated. supabase-auth is the phone-reachable mode required at the approval gate." },
|
|
18
|
+
"inspector_url": { "type": "string", "description": "The Vercel inspector/dashboard URL for the deployment, when the response carried it." }
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"required_fields": [
|
|
22
|
+
"validation_criteria",
|
|
23
|
+
"input_refs",
|
|
24
|
+
"preview_url",
|
|
25
|
+
"commit_sha",
|
|
26
|
+
"branch",
|
|
27
|
+
"project_id",
|
|
28
|
+
"deployment_id",
|
|
29
|
+
"build_status",
|
|
30
|
+
"protection"
|
|
31
|
+
]
|
|
32
|
+
}
|