@eir-labs/coltrane 0.24.13 → 0.24.15
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/agents/bandleader.json +5 -5
- package/agents/default-adjudicator.json +39 -0
- package/agents/deploy-agent.json +1 -2
- package/agents/deploy-scout.json +1 -2
- package/agents/lineage-scout-internal.json +14 -4
- package/agents/lineage-scribe.json +6 -6
- package/agents/lineage-weaver.json +8 -8
- package/agents/patent-browser-scout.json +3 -1
- package/agents/proof-composer.json +38 -0
- package/agents/receipt-mapper.json +39 -0
- package/agents/reconciliation-auditor.json +45 -0
- package/dist/src/cli.d.ts +1 -1
- package/dist/src/cli.js +32 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/seal_genome.d.ts +24 -0
- package/dist/src/seal_genome.js +87 -0
- package/dist/src/seal_genome.js.map +1 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/domain_types/alignment-plan.json +9 -3
- package/domain_types/branch-state.json +12 -3
- package/domain_types/change-decision.json +32 -7
- package/domain_types/change-plan.json +41 -12
- package/domain_types/change-request.json +37 -7
- package/domain_types/change-set.json +40 -11
- package/domain_types/change-verdict.json +42 -6
- package/domain_types/deploy-verdict.json +21 -3
- package/domain_types/design-brief.json +48 -9
- package/domain_types/design-concept.json +40 -9
- package/domain_types/design-definition.json +40 -9
- package/domain_types/design-question.json +26 -5
- package/domain_types/design-verdict.json +42 -6
- package/domain_types/draft-agent-profile.json +75 -14
- package/domain_types/draft-domain-type.json +56 -11
- package/domain_types/draft-standard.json +57 -15
- package/domain_types/internal-inventory.json +15 -5
- package/domain_types/lineage-adoption-target.json +4 -1
- package/domain_types/lineage-hit.json +19 -6
- package/domain_types/lineage-map.json +35 -8
- package/domain_types/lineage-question.json +13 -4
- package/domain_types/lineage-record.json +71 -18
- package/domain_types/lineage-verdict.json +9 -3
- package/domain_types/parsed-conversation-trace.json +54 -13
- package/domain_types/pattern-extraction.json +91 -21
- package/domain_types/preview-deployment.json +37 -8
- package/domain_types/project-charter.json +59 -16
- package/domain_types/proof-of-work-contract.json +86 -0
- package/domain_types/reconciliation-map.json +90 -0
- package/domain_types/reconciliation-record.json +52 -0
- package/domain_types/red-spec.json +2 -2
- package/domain_types/repo-survey.json +84 -14
- package/domain_types/seeding-verdict.json +93 -27
- package/domain_types/soft-verdict.json +45 -10
- package/domain_types/user-flow-transcript.json +36 -10
- package/domain_types/user-flow-verdict.json +57 -13
- package/package.json +1 -1
- package/standards/lineage-adopt-v0.json +2 -2
- package/standards/lineage-deepen-v0.json +12 -4
- package/standards/lineage-pass-v1.json +60 -17
- package/standards/lineage-reweave-v0.json +34 -10
- package/standards/patent-triage-v1.json +170 -12
- package/standards/product-design-v1.json +4 -4
- package/standards/reconcile-work-order-v0.json +137 -0
- package/standards/software-change-v1.json +5 -5
- package/standards/user_flow_correctness.json +3 -3
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// WO-F07 Article I — `seal-genome`, the bulk-migration primitive.
|
|
2
|
+
//
|
|
3
|
+
// The WO-F06 orphan invariant (`coltrane validate` fails on a standards/|domain_types/|agents/ file
|
|
4
|
+
// with no `genome_mutation` seal in the git-tracked genome ledger) had no MIGRATION primitive. A
|
|
5
|
+
// pre-sealing genome — every file hand-authored or predating the sealed regime — is all orphans,
|
|
6
|
+
// and there was no command to bring it in-regime in bulk. `sealGenome` is that primitive: it
|
|
7
|
+
// iterates the blessed write path (`sealDefinition`, src/genome_writer.ts:69) over every genome file
|
|
8
|
+
// and, for each file not already sealed, records its `genome_mutation` seal.
|
|
9
|
+
//
|
|
10
|
+
// It seals IDENTITY, it does NOT rewrite content. `sealDefinition` re-serializes the parsed object
|
|
11
|
+
// as `JSON.stringify(def, null, 2) + "\n"`; for a genome already in that on-disk form,
|
|
12
|
+
// `writeGenomeFileVersioned` writes byte-identical content and snapshots no prior version. So a file
|
|
13
|
+
// that was already canonically serialized is byte-unchanged — only the ledger grows.
|
|
14
|
+
import { readdirSync, readFileSync, existsSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { canonJson, sha256Hex } from "./canonical_form.js";
|
|
17
|
+
import { sealDefinition, ORPHAN_SCAN_SUBDIRS } from "./genome_writer.js";
|
|
18
|
+
/** The `genome_mutation` event each genome kind seals under — the MCP-tool-name convention
|
|
19
|
+
* `sealDefinition` already uses (agent_define / standard_compose / type_register). A per-kind event
|
|
20
|
+
* (not a single generic "seal_genome") keeps kind provenance in the audit trail. */
|
|
21
|
+
const KIND_EVENT = {
|
|
22
|
+
standards: "standard_compose",
|
|
23
|
+
domain_types: "type_register",
|
|
24
|
+
agents: "agent_define",
|
|
25
|
+
};
|
|
26
|
+
/** Fold `<slug>@v<n>` back to `<slug>` — a version-producing seal (agent_evolve / type_extend)
|
|
27
|
+
* records the versioned identity while still materialising the flat `<slug>.json`. IDENTICAL to the
|
|
28
|
+
* fold in detectGenomeOrphans (src/genome_writer.ts:260); if it diverged, a versioned-sealed file
|
|
29
|
+
* would read as an orphan here and be re-sealed, breaking idempotency. */
|
|
30
|
+
function baseSlug(subject_slug) {
|
|
31
|
+
return subject_slug.split("@")[0];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Seal every genome file under standards/, domain_types/, agents/ that is not already sealed.
|
|
35
|
+
*
|
|
36
|
+
* A file is ALREADY SEALED when some `genome_mutation` entry carries a matching `content_hash` under
|
|
37
|
+
* a subject_slug that folds to the file's base slug — the same identity `detectGenomeOrphans` reads.
|
|
38
|
+
* Such files are SKIPPED (idempotent: a second run seals nothing). Otherwise the file's parsed def is
|
|
39
|
+
* passed through `sealDefinition`, appending one seal keyed by the per-kind event and re-writing the
|
|
40
|
+
* file byte-identically. Each file is wrapped so a malformed one is reported per-file, not fatal.
|
|
41
|
+
*/
|
|
42
|
+
export function sealGenome(genome_dir, ledger) {
|
|
43
|
+
const report = { sealed: [], skipped: [], errors: [] };
|
|
44
|
+
// The seal index: base slug → the set of content hashes already sealed under it. Queried once —
|
|
45
|
+
// every file this run seals has a distinct slug, so no in-run entry can shadow a later file.
|
|
46
|
+
const sealedHashes = new Map();
|
|
47
|
+
for (const e of ledger.query({ kind: "genome_mutation" })) {
|
|
48
|
+
const entry = e;
|
|
49
|
+
if (typeof entry.subject_slug !== "string")
|
|
50
|
+
continue;
|
|
51
|
+
const slug = baseSlug(entry.subject_slug);
|
|
52
|
+
let set = sealedHashes.get(slug);
|
|
53
|
+
if (!set) {
|
|
54
|
+
set = new Set();
|
|
55
|
+
sealedHashes.set(slug, set);
|
|
56
|
+
}
|
|
57
|
+
if (typeof entry.content_hash === "string")
|
|
58
|
+
set.add(entry.content_hash);
|
|
59
|
+
}
|
|
60
|
+
for (const subdir of ORPHAN_SCAN_SUBDIRS) {
|
|
61
|
+
const dir = join(genome_dir, subdir);
|
|
62
|
+
if (!existsSync(dir))
|
|
63
|
+
continue;
|
|
64
|
+
for (const dirent of readdirSync(dir, { withFileTypes: true })) {
|
|
65
|
+
if (!dirent.isFile() || !dirent.name.endsWith(".json"))
|
|
66
|
+
continue;
|
|
67
|
+
const slug = dirent.name.slice(0, -".json".length);
|
|
68
|
+
const rel = `${subdir}/${dirent.name}`;
|
|
69
|
+
try {
|
|
70
|
+
const def = JSON.parse(readFileSync(join(dir, dirent.name), "utf-8"));
|
|
71
|
+
const content_hash = sha256Hex(canonJson(def));
|
|
72
|
+
// Already sealed: an entry folding to this base slug carries this exact content hash.
|
|
73
|
+
if (sealedHashes.get(slug)?.has(content_hash)) {
|
|
74
|
+
report.skipped.push(rel);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
sealDefinition(KIND_EVENT[subdir], slug, def, ledger, genome_dir, subdir);
|
|
78
|
+
report.sealed.push(rel);
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
report.errors.push({ path: rel, error: e instanceof Error ? e.message : String(e) });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return report;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=seal_genome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seal_genome.js","sourceRoot":"","sources":["../../src/seal_genome.ts"],"names":[],"mappings":"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"}
|
package/dist/src/version.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Engine semver. Keep in lockstep with package.json `version` (enforced by test). */
|
|
2
|
-
export declare const COLTRANE_VERSION = "0.24.
|
|
2
|
+
export declare const COLTRANE_VERSION = "0.24.15";
|
|
3
3
|
/**
|
|
4
4
|
* The commit this engine checkout is sitting on, or null when it can't be determined.
|
|
5
5
|
*
|
package/dist/src/version.js
CHANGED
|
@@ -17,7 +17,7 @@ import { existsSync, readFileSync, statSync } from "node:fs";
|
|
|
17
17
|
import { dirname, join, resolve } from "node:path";
|
|
18
18
|
import { fileURLToPath } from "node:url";
|
|
19
19
|
/** Engine semver. Keep in lockstep with package.json `version` (enforced by test). */
|
|
20
|
-
export const COLTRANE_VERSION = "0.24.
|
|
20
|
+
export const COLTRANE_VERSION = "0.24.15";
|
|
21
21
|
/**
|
|
22
22
|
* The commit this engine checkout is sitting on, or null when it can't be determined.
|
|
23
23
|
*
|
|
@@ -8,9 +8,15 @@
|
|
|
8
8
|
"schema": {
|
|
9
9
|
"type": "object",
|
|
10
10
|
"properties": {
|
|
11
|
-
"gap_summary": {
|
|
12
|
-
|
|
11
|
+
"gap_summary": {
|
|
12
|
+
"type": "string"
|
|
13
|
+
},
|
|
14
|
+
"alignment_recommendation": {
|
|
15
|
+
"type": "string"
|
|
16
|
+
}
|
|
13
17
|
}
|
|
14
18
|
},
|
|
15
|
-
"required_fields": [
|
|
19
|
+
"required_fields": [
|
|
20
|
+
"gap_summary"
|
|
21
|
+
]
|
|
16
22
|
}
|
|
@@ -8,9 +8,18 @@
|
|
|
8
8
|
"schema": {
|
|
9
9
|
"type": "object",
|
|
10
10
|
"properties": {
|
|
11
|
-
"branch":
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
"branch": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"description": "The git branch to deploy to the preview target."
|
|
14
|
+
},
|
|
15
|
+
"commit_sha": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "The branch HEAD commit, sensed directly — the exact commit the preview will build."
|
|
18
|
+
},
|
|
19
|
+
"project_id": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "The Vercel project id the branch belongs to, when known at sense time."
|
|
22
|
+
}
|
|
14
23
|
}
|
|
15
24
|
},
|
|
16
25
|
"required_fields": [
|
|
@@ -8,22 +8,47 @@
|
|
|
8
8
|
"schema": {
|
|
9
9
|
"type": "object",
|
|
10
10
|
"properties": {
|
|
11
|
-
"scope":
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
"scope": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"description": "The observable outcome this change commits to."
|
|
14
|
+
},
|
|
15
|
+
"non_goals": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"items": {
|
|
18
|
+
"type": "string"
|
|
19
|
+
},
|
|
20
|
+
"description": "What this change is NOT, and the neighbouring shapes it must not collapse into."
|
|
21
|
+
},
|
|
22
|
+
"stop_condition": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"description": "The observation at which the work is finished, stated so that someone else could call it."
|
|
25
|
+
},
|
|
14
26
|
"rejected_alternatives": {
|
|
15
27
|
"type": "array",
|
|
16
28
|
"description": "Directions considered and set aside, each with its reason.",
|
|
17
29
|
"items": {
|
|
18
30
|
"type": "object",
|
|
19
31
|
"properties": {
|
|
20
|
-
"alternative": {
|
|
21
|
-
|
|
32
|
+
"alternative": {
|
|
33
|
+
"type": "string"
|
|
34
|
+
},
|
|
35
|
+
"reason": {
|
|
36
|
+
"type": "string"
|
|
37
|
+
}
|
|
22
38
|
},
|
|
23
|
-
"required": [
|
|
39
|
+
"required": [
|
|
40
|
+
"alternative",
|
|
41
|
+
"reason"
|
|
42
|
+
]
|
|
24
43
|
}
|
|
25
44
|
},
|
|
26
|
-
"risks":
|
|
45
|
+
"risks": {
|
|
46
|
+
"type": "array",
|
|
47
|
+
"items": {
|
|
48
|
+
"type": "string"
|
|
49
|
+
},
|
|
50
|
+
"description": "Consequences the direction accepts knowingly."
|
|
51
|
+
}
|
|
27
52
|
}
|
|
28
53
|
},
|
|
29
54
|
"required_fields": [
|
|
@@ -8,34 +8,63 @@
|
|
|
8
8
|
"schema": {
|
|
9
9
|
"type": "object",
|
|
10
10
|
"properties": {
|
|
11
|
-
"test_first":
|
|
11
|
+
"test_first": {
|
|
12
12
|
"type": "array",
|
|
13
13
|
"description": "The checks that land before the change, each with the failure it is expected to show first.",
|
|
14
14
|
"items": {
|
|
15
15
|
"type": "object",
|
|
16
16
|
"properties": {
|
|
17
|
-
"check":
|
|
18
|
-
|
|
17
|
+
"check": {
|
|
18
|
+
"type": "string"
|
|
19
|
+
},
|
|
20
|
+
"expected_before": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"description": "What this check reports while the change is absent."
|
|
23
|
+
}
|
|
19
24
|
},
|
|
20
|
-
"required": [
|
|
25
|
+
"required": [
|
|
26
|
+
"check",
|
|
27
|
+
"expected_before"
|
|
28
|
+
]
|
|
21
29
|
}
|
|
22
30
|
},
|
|
23
|
-
"files_touched":
|
|
24
|
-
|
|
31
|
+
"files_touched": {
|
|
32
|
+
"type": "array",
|
|
33
|
+
"items": {
|
|
34
|
+
"type": "string"
|
|
35
|
+
},
|
|
36
|
+
"description": "Paths the plan commits to changing. A path outside this list is a departure to be recorded, not a silent extension."
|
|
37
|
+
},
|
|
38
|
+
"tradeoffs": {
|
|
25
39
|
"type": "array",
|
|
26
40
|
"description": "Steps where more than one structure would have served, and why this one was taken.",
|
|
27
41
|
"items": {
|
|
28
42
|
"type": "object",
|
|
29
43
|
"properties": {
|
|
30
|
-
"at":
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"
|
|
44
|
+
"at": {
|
|
45
|
+
"type": "string"
|
|
46
|
+
},
|
|
47
|
+
"chosen": {
|
|
48
|
+
"type": "string"
|
|
49
|
+
},
|
|
50
|
+
"over": {
|
|
51
|
+
"type": "string"
|
|
52
|
+
},
|
|
53
|
+
"why": {
|
|
54
|
+
"type": "string"
|
|
55
|
+
}
|
|
34
56
|
},
|
|
35
|
-
"required": [
|
|
57
|
+
"required": [
|
|
58
|
+
"at",
|
|
59
|
+
"chosen",
|
|
60
|
+
"why"
|
|
61
|
+
]
|
|
36
62
|
}
|
|
37
63
|
},
|
|
38
|
-
"rollback":
|
|
64
|
+
"rollback": {
|
|
65
|
+
"type": "string",
|
|
66
|
+
"description": "How the change is undone if the verdict fails."
|
|
67
|
+
}
|
|
39
68
|
}
|
|
40
69
|
},
|
|
41
70
|
"required_fields": [
|
|
@@ -8,13 +8,43 @@
|
|
|
8
8
|
"schema": {
|
|
9
9
|
"type": "object",
|
|
10
10
|
"properties": {
|
|
11
|
-
"request_text":
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
"request_text": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"description": "The change as stated by the requester, unparaphrased."
|
|
14
|
+
},
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "Repository or working-tree identifier the change lands in."
|
|
18
|
+
},
|
|
19
|
+
"target_paths": {
|
|
20
|
+
"type": "array",
|
|
21
|
+
"items": {
|
|
22
|
+
"type": "string"
|
|
23
|
+
},
|
|
24
|
+
"description": "Paths the requester believes are in scope. A belief, not a finding — the reading phase may contradict it."
|
|
25
|
+
},
|
|
26
|
+
"acceptance_criteria": {
|
|
27
|
+
"type": "array",
|
|
28
|
+
"items": {
|
|
29
|
+
"type": "string"
|
|
30
|
+
},
|
|
31
|
+
"description": "Observations that would show the change was made. Each entry must be checkable by someone who did not write the change."
|
|
32
|
+
},
|
|
33
|
+
"out_of_scope": {
|
|
34
|
+
"type": "array",
|
|
35
|
+
"items": {
|
|
36
|
+
"type": "string"
|
|
37
|
+
},
|
|
38
|
+
"description": "Work the requester explicitly excludes."
|
|
39
|
+
},
|
|
40
|
+
"requested_by": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"description": "The requesting party."
|
|
43
|
+
},
|
|
44
|
+
"change_set_branch": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"description": "The change-set branch (changeset/<originating-gig-uuid>[/<slug>]) the implementation run must work on. CARRIED here, never inferred from the working tree. Optional and additive: a request that omits it is refused as branch-absent-but-expected only where a run needs it."
|
|
47
|
+
}
|
|
18
48
|
}
|
|
19
49
|
},
|
|
20
50
|
"required_fields": [
|
|
@@ -8,31 +8,60 @@
|
|
|
8
8
|
"schema": {
|
|
9
9
|
"type": "object",
|
|
10
10
|
"properties": {
|
|
11
|
-
"diffs":
|
|
11
|
+
"diffs": {
|
|
12
12
|
"type": "array",
|
|
13
13
|
"description": "Per-path patch content, in unified-diff form.",
|
|
14
14
|
"items": {
|
|
15
15
|
"type": "object",
|
|
16
16
|
"properties": {
|
|
17
|
-
"path":
|
|
18
|
-
|
|
17
|
+
"path": {
|
|
18
|
+
"type": "string"
|
|
19
|
+
},
|
|
20
|
+
"patch": {
|
|
21
|
+
"type": "string"
|
|
22
|
+
}
|
|
19
23
|
},
|
|
20
|
-
"required": [
|
|
24
|
+
"required": [
|
|
25
|
+
"path",
|
|
26
|
+
"patch"
|
|
27
|
+
]
|
|
21
28
|
}
|
|
22
29
|
},
|
|
23
|
-
"tests_added": {
|
|
24
|
-
|
|
25
|
-
|
|
30
|
+
"tests_added": {
|
|
31
|
+
"type": "array",
|
|
32
|
+
"items": {
|
|
33
|
+
"type": "string"
|
|
34
|
+
},
|
|
35
|
+
"description": "Checks introduced by this change, named so a verifier can run exactly them."
|
|
36
|
+
},
|
|
37
|
+
"rationale": {
|
|
38
|
+
"type": "array",
|
|
39
|
+
"items": {
|
|
40
|
+
"type": "string"
|
|
41
|
+
},
|
|
42
|
+
"description": "The non-obvious choices this change makes, each with the reason it was made."
|
|
43
|
+
},
|
|
44
|
+
"departures": {
|
|
26
45
|
"type": "array",
|
|
27
46
|
"description": "Where the artefact left the plan, and why.",
|
|
28
47
|
"items": {
|
|
29
48
|
"type": "object",
|
|
30
49
|
"properties": {
|
|
31
|
-
"from_step": {
|
|
32
|
-
|
|
33
|
-
|
|
50
|
+
"from_step": {
|
|
51
|
+
"type": "string"
|
|
52
|
+
},
|
|
53
|
+
"instead": {
|
|
54
|
+
"type": "string"
|
|
55
|
+
},
|
|
56
|
+
"why": {
|
|
57
|
+
"type": "string"
|
|
58
|
+
}
|
|
34
59
|
},
|
|
35
|
-
"required": [
|
|
60
|
+
"required": [
|
|
61
|
+
"from_step",
|
|
62
|
+
"instead",
|
|
63
|
+
"why"
|
|
64
|
+
]
|
|
36
65
|
}
|
|
37
66
|
}
|
|
38
67
|
}
|
|
@@ -8,12 +8,48 @@
|
|
|
8
8
|
"schema": {
|
|
9
9
|
"type": "object",
|
|
10
10
|
"properties": {
|
|
11
|
-
"decision_ref":
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"
|
|
16
|
-
|
|
11
|
+
"decision_ref": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"description": "The change-decision this verdict measures against."
|
|
14
|
+
},
|
|
15
|
+
"criteria_unmet": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"items": {
|
|
18
|
+
"type": "string"
|
|
19
|
+
},
|
|
20
|
+
"description": "Acceptance criteria the change does not meet, stated plainly."
|
|
21
|
+
},
|
|
22
|
+
"inferred_not_run": {
|
|
23
|
+
"type": "array",
|
|
24
|
+
"items": {
|
|
25
|
+
"type": "string"
|
|
26
|
+
},
|
|
27
|
+
"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."
|
|
28
|
+
},
|
|
29
|
+
"failures_verbatim": {
|
|
30
|
+
"type": "array",
|
|
31
|
+
"items": {
|
|
32
|
+
"type": "string"
|
|
33
|
+
},
|
|
34
|
+
"description": "Failure output as the tool reported it: messages, counts, names. Not summaries of them."
|
|
35
|
+
},
|
|
36
|
+
"scope_drift": {
|
|
37
|
+
"type": "array",
|
|
38
|
+
"items": {
|
|
39
|
+
"type": "string"
|
|
40
|
+
},
|
|
41
|
+
"description": "Where the change exceeded or fell short of the fixed scope."
|
|
42
|
+
},
|
|
43
|
+
"recommendation": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"enum": [
|
|
46
|
+
"accept",
|
|
47
|
+
"amend",
|
|
48
|
+
"reject",
|
|
49
|
+
"insufficient-evidence"
|
|
50
|
+
],
|
|
51
|
+
"description": "insufficient-evidence is the honest answer when the granted tools could not check what the verdict turns on."
|
|
52
|
+
}
|
|
17
53
|
}
|
|
18
54
|
},
|
|
19
55
|
"required_fields": [
|
|
@@ -8,9 +8,27 @@
|
|
|
8
8
|
"schema": {
|
|
9
9
|
"type": "object",
|
|
10
10
|
"properties": {
|
|
11
|
-
"terminal_state":
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
"terminal_state": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"enum": [
|
|
14
|
+
"READY",
|
|
15
|
+
"ERROR",
|
|
16
|
+
"CANCELED",
|
|
17
|
+
"UNSETTLED"
|
|
18
|
+
],
|
|
19
|
+
"description": "The build's terminal readyState, or UNSETTLED when the poll budget was spent before any terminal state was observed."
|
|
20
|
+
},
|
|
21
|
+
"logs_tail": {
|
|
22
|
+
"type": "array",
|
|
23
|
+
"items": {
|
|
24
|
+
"type": "string"
|
|
25
|
+
},
|
|
26
|
+
"description": "The tail of the build log, present only when terminal_state is not READY."
|
|
27
|
+
},
|
|
28
|
+
"deadline_exceeded": {
|
|
29
|
+
"type": "boolean",
|
|
30
|
+
"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."
|
|
31
|
+
}
|
|
14
32
|
}
|
|
15
33
|
},
|
|
16
34
|
"required_fields": [
|
|
@@ -8,23 +8,62 @@
|
|
|
8
8
|
"schema": {
|
|
9
9
|
"type": "object",
|
|
10
10
|
"properties": {
|
|
11
|
-
"observations":
|
|
11
|
+
"observations": {
|
|
12
12
|
"type": "array",
|
|
13
13
|
"description": "What was found, each with the locator it was found through.",
|
|
14
14
|
"items": {
|
|
15
15
|
"type": "object",
|
|
16
16
|
"properties": {
|
|
17
|
-
"observation": {
|
|
18
|
-
|
|
17
|
+
"observation": {
|
|
18
|
+
"type": "string"
|
|
19
|
+
},
|
|
20
|
+
"locator": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"description": "Tool plus path or query that produced this observation."
|
|
23
|
+
}
|
|
19
24
|
},
|
|
20
|
-
"required": [
|
|
25
|
+
"required": [
|
|
26
|
+
"observation"
|
|
27
|
+
]
|
|
21
28
|
}
|
|
22
29
|
},
|
|
23
|
-
"audience_segments":
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
30
|
+
"audience_segments": {
|
|
31
|
+
"type": "array",
|
|
32
|
+
"items": {
|
|
33
|
+
"type": "string"
|
|
34
|
+
},
|
|
35
|
+
"description": "Distinguishable groups the question lands differently for."
|
|
36
|
+
},
|
|
37
|
+
"unmet_needs": {
|
|
38
|
+
"type": "array",
|
|
39
|
+
"items": {
|
|
40
|
+
"type": "string"
|
|
41
|
+
},
|
|
42
|
+
"description": "Needs the current state does not serve. Findings, not proposals."
|
|
43
|
+
},
|
|
44
|
+
"adjacent_questions": {
|
|
45
|
+
"type": "array",
|
|
46
|
+
"items": {
|
|
47
|
+
"type": "string"
|
|
48
|
+
},
|
|
49
|
+
"description": "Questions the exploration surfaced that the posed question did not contain."
|
|
50
|
+
},
|
|
51
|
+
"divergence_breadth": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"enum": [
|
|
54
|
+
"narrow",
|
|
55
|
+
"moderate",
|
|
56
|
+
"wide"
|
|
57
|
+
],
|
|
58
|
+
"description": "How far the exploration actually reached, judged against the material available rather than against effort spent."
|
|
59
|
+
},
|
|
60
|
+
"unknowns": {
|
|
61
|
+
"type": "array",
|
|
62
|
+
"items": {
|
|
63
|
+
"type": "string"
|
|
64
|
+
},
|
|
65
|
+
"description": "What the exploration could not determine. Required: the honest bound of the divergence."
|
|
66
|
+
}
|
|
28
67
|
}
|
|
29
68
|
},
|
|
30
69
|
"required_fields": [
|
|
@@ -8,23 +8,54 @@
|
|
|
8
8
|
"schema": {
|
|
9
9
|
"type": "object",
|
|
10
10
|
"properties": {
|
|
11
|
-
"concept_name":
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"
|
|
11
|
+
"concept_name": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"description": "Short handle for the concept."
|
|
14
|
+
},
|
|
15
|
+
"description": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "What it is, in the audience's register."
|
|
18
|
+
},
|
|
19
|
+
"mechanism": {
|
|
20
|
+
"type": "array",
|
|
21
|
+
"items": {
|
|
22
|
+
"type": "string"
|
|
23
|
+
},
|
|
24
|
+
"description": "How it works, step by step. The part that distinguishes a concept from a wish."
|
|
25
|
+
},
|
|
26
|
+
"addresses": {
|
|
27
|
+
"type": "array",
|
|
28
|
+
"items": {
|
|
29
|
+
"type": "string"
|
|
30
|
+
},
|
|
31
|
+
"description": "Which success criteria from the definition this concept answers, named individually."
|
|
32
|
+
},
|
|
33
|
+
"tradeoffs": {
|
|
16
34
|
"type": "array",
|
|
17
35
|
"description": "What this concept gives up, and what it buys with it.",
|
|
18
36
|
"items": {
|
|
19
37
|
"type": "object",
|
|
20
38
|
"properties": {
|
|
21
|
-
"gives_up": {
|
|
22
|
-
|
|
39
|
+
"gives_up": {
|
|
40
|
+
"type": "string"
|
|
41
|
+
},
|
|
42
|
+
"buys": {
|
|
43
|
+
"type": "string"
|
|
44
|
+
}
|
|
23
45
|
},
|
|
24
|
-
"required": [
|
|
46
|
+
"required": [
|
|
47
|
+
"gives_up",
|
|
48
|
+
"buys"
|
|
49
|
+
]
|
|
25
50
|
}
|
|
26
51
|
},
|
|
27
|
-
"open_questions":
|
|
52
|
+
"open_questions": {
|
|
53
|
+
"type": "array",
|
|
54
|
+
"items": {
|
|
55
|
+
"type": "string"
|
|
56
|
+
},
|
|
57
|
+
"description": "What remains unresolved in the concept as built."
|
|
58
|
+
}
|
|
28
59
|
}
|
|
29
60
|
},
|
|
30
61
|
"required_fields": [
|