@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.
Files changed (65) hide show
  1. package/agents/bandleader.json +5 -5
  2. package/agents/default-adjudicator.json +39 -0
  3. package/agents/deploy-agent.json +1 -2
  4. package/agents/deploy-scout.json +1 -2
  5. package/agents/lineage-scout-internal.json +14 -4
  6. package/agents/lineage-scribe.json +6 -6
  7. package/agents/lineage-weaver.json +8 -8
  8. package/agents/patent-browser-scout.json +3 -1
  9. package/agents/proof-composer.json +38 -0
  10. package/agents/receipt-mapper.json +39 -0
  11. package/agents/reconciliation-auditor.json +45 -0
  12. package/dist/src/cli.d.ts +1 -1
  13. package/dist/src/cli.js +32 -1
  14. package/dist/src/cli.js.map +1 -1
  15. package/dist/src/seal_genome.d.ts +24 -0
  16. package/dist/src/seal_genome.js +87 -0
  17. package/dist/src/seal_genome.js.map +1 -0
  18. package/dist/src/version.d.ts +1 -1
  19. package/dist/src/version.js +1 -1
  20. package/domain_types/alignment-plan.json +9 -3
  21. package/domain_types/branch-state.json +12 -3
  22. package/domain_types/change-decision.json +32 -7
  23. package/domain_types/change-plan.json +41 -12
  24. package/domain_types/change-request.json +37 -7
  25. package/domain_types/change-set.json +40 -11
  26. package/domain_types/change-verdict.json +42 -6
  27. package/domain_types/deploy-verdict.json +21 -3
  28. package/domain_types/design-brief.json +48 -9
  29. package/domain_types/design-concept.json +40 -9
  30. package/domain_types/design-definition.json +40 -9
  31. package/domain_types/design-question.json +26 -5
  32. package/domain_types/design-verdict.json +42 -6
  33. package/domain_types/draft-agent-profile.json +75 -14
  34. package/domain_types/draft-domain-type.json +56 -11
  35. package/domain_types/draft-standard.json +57 -15
  36. package/domain_types/internal-inventory.json +15 -5
  37. package/domain_types/lineage-adoption-target.json +4 -1
  38. package/domain_types/lineage-hit.json +19 -6
  39. package/domain_types/lineage-map.json +35 -8
  40. package/domain_types/lineage-question.json +13 -4
  41. package/domain_types/lineage-record.json +71 -18
  42. package/domain_types/lineage-verdict.json +9 -3
  43. package/domain_types/parsed-conversation-trace.json +54 -13
  44. package/domain_types/pattern-extraction.json +91 -21
  45. package/domain_types/preview-deployment.json +37 -8
  46. package/domain_types/project-charter.json +59 -16
  47. package/domain_types/proof-of-work-contract.json +86 -0
  48. package/domain_types/reconciliation-map.json +90 -0
  49. package/domain_types/reconciliation-record.json +52 -0
  50. package/domain_types/red-spec.json +2 -2
  51. package/domain_types/repo-survey.json +84 -14
  52. package/domain_types/seeding-verdict.json +93 -27
  53. package/domain_types/soft-verdict.json +45 -10
  54. package/domain_types/user-flow-transcript.json +36 -10
  55. package/domain_types/user-flow-verdict.json +57 -13
  56. package/package.json +1 -1
  57. package/standards/lineage-adopt-v0.json +2 -2
  58. package/standards/lineage-deepen-v0.json +12 -4
  59. package/standards/lineage-pass-v1.json +60 -17
  60. package/standards/lineage-reweave-v0.json +34 -10
  61. package/standards/patent-triage-v1.json +170 -12
  62. package/standards/product-design-v1.json +4 -4
  63. package/standards/reconcile-work-order-v0.json +137 -0
  64. package/standards/software-change-v1.json +5 -5
  65. package/standards/user_flow_correctness.json +3 -3
@@ -0,0 +1,90 @@
1
+ {
2
+ "slug": "reconciliation-map",
3
+ "version": 1,
4
+ "extends": "Interpretation",
5
+ "domain": "software-change",
6
+ "status": "active",
7
+ "description": "The COLD MAP of a work order's reconciliation (WO-F02, Documenso #1917537): every clause of the order — each article, each terminal, each receipts_due type — matched deterministically against the receipts actually landed (chancery_work_order_receipt rows and the completed_output_id FK into the sealed output chain). A clause with no receipt is listed ABSENT, never omitted. This is clerical work: no model judgment, no spend against the reconciliation budget — the map restates rows, it does not evaluate them.",
8
+ "schema": {
9
+ "type": "object",
10
+ "properties": {
11
+ "work_order_id": {
12
+ "type": "string",
13
+ "description": "The chancery_work_order.id this map reconciles."
14
+ },
15
+ "reconciliation_owner": {
16
+ "type": "string",
17
+ "description": "chancery_work_order.reconciliation_owner — who reconciles: the bond's bonded_party or a named agent/chair."
18
+ },
19
+ "reconciliation_budget": {
20
+ "type": "number",
21
+ "description": "chancery_work_order.reconciliation_budget — the declared heat cap the hot audit must spend within."
22
+ },
23
+ "reconciliation_due_at": {
24
+ "type": "string",
25
+ "description": "chancery_work_order.reconciliation_due_at (ISO-8601) — the committed date the sweep fires at regardless of any completion signal."
26
+ },
27
+ "past_due": {
28
+ "type": "boolean",
29
+ "description": "Whether the mapping ran after reconciliation_due_at. Deterministic: map time vs the due timestamp."
30
+ },
31
+ "clauses": {
32
+ "type": "array",
33
+ "minItems": 1,
34
+ "description": "One row per clause of the order — every article, terminal, and receipts_due type. Nothing is skipped: an unmatched clause appears with status 'absent'.",
35
+ "items": {
36
+ "type": "object",
37
+ "properties": {
38
+ "clause_ref": {
39
+ "type": "string",
40
+ "description": "Which clause: an article title/index, a terminal role, or a receipts_due type name."
41
+ },
42
+ "clause_kind": {
43
+ "type": "string",
44
+ "enum": [
45
+ "article",
46
+ "terminal",
47
+ "receipt_due"
48
+ ]
49
+ },
50
+ "receipt_output_ids": {
51
+ "type": "array",
52
+ "items": {
53
+ "type": "string"
54
+ },
55
+ "description": "The coltrane_outputs ids (via chancery_work_order_receipt.output_id or completed_output_id) matched to this clause. Empty when absent."
56
+ },
57
+ "status": {
58
+ "type": "string",
59
+ "enum": [
60
+ "receipted",
61
+ "absent"
62
+ ],
63
+ "description": "receipted: at least one sealed receipt matches. absent: no receipt exists — stated plainly, never inferred away."
64
+ },
65
+ "locator": {
66
+ "type": "string",
67
+ "description": "Where the matching rows were read from (table/view + key), so the map is re-runnable."
68
+ }
69
+ },
70
+ "required": [
71
+ "clause_ref",
72
+ "clause_kind",
73
+ "status"
74
+ ]
75
+ }
76
+ },
77
+ "absent_count": {
78
+ "type": "number",
79
+ "description": "The number of clauses with status 'absent'. Zero is a claim like any other: it must equal the count in clauses."
80
+ }
81
+ }
82
+ },
83
+ "required_fields": [
84
+ "work_order_id",
85
+ "clauses",
86
+ "absent_count",
87
+ "input_refs",
88
+ "claims"
89
+ ]
90
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "slug": "reconciliation-record",
3
+ "version": 1,
4
+ "extends": "Judgment",
5
+ "domain": "software-change",
6
+ "status": "active",
7
+ "description": "The adjudicated (and, at the human seat, settled) reconciliation of a work order — the record whose reconciliation_state lands in chancery_work_order.reconciliation_state. Its state vocabulary is EXACTLY the DB check constraint ('pending' | 'satisfied' | 'defaulted'): the default-adjudicator seals 'defaulted' (past reconciliation_due_at with clauses unreceipted) or 'pending' (awaiting the sovereign); only the human settling seal records 'satisfied'. A defaulted record cites the absences that defaulted it — abandonment is shown, not summarized.",
8
+ "schema": {
9
+ "type": "object",
10
+ "properties": {
11
+ "work_order_id": {
12
+ "type": "string",
13
+ "description": "The chancery_work_order.id this record reconciles."
14
+ },
15
+ "reconciliation_state": {
16
+ "type": "string",
17
+ "enum": [
18
+ "pending",
19
+ "satisfied",
20
+ "defaulted"
21
+ ],
22
+ "description": "Mirrors the chancery_work_order.reconciliation_state check constraint, byte for byte."
23
+ },
24
+ "proof_of_work_ref": {
25
+ "type": "string",
26
+ "description": "content_sha (or output id) of the sealed proof-of-work-contract this record rules on."
27
+ },
28
+ "basis": {
29
+ "type": "string",
30
+ "description": "The deterministic rule applied, restated with its inputs: past_due (yes/no), absent_count, and — for 'satisfied' — the settling seat."
31
+ },
32
+ "defaulted_clauses": {
33
+ "type": "array",
34
+ "items": {
35
+ "type": "string"
36
+ },
37
+ "description": "For a 'defaulted' record: the clause_refs still absent at ruling time, copied from the cold map. Empty for other states."
38
+ },
39
+ "settled_by": {
40
+ "type": "string",
41
+ "description": "For a 'satisfied' record: the human seat that settled — the reconciliation_owner (or the governor, where the order names that terminal)."
42
+ }
43
+ }
44
+ },
45
+ "required_fields": [
46
+ "work_order_id",
47
+ "reconciliation_state",
48
+ "proof_of_work_ref",
49
+ "basis",
50
+ "input_refs"
51
+ ]
52
+ }
@@ -22,7 +22,7 @@
22
22
  },
23
23
  "patch": {
24
24
  "type": "string",
25
- "description": "The unified diff itself, not a description of it. The spec-drafting review chair reads test bodies OUT OF THIS FIELD ('read each red test in the diffs'), so this is the evidence the gate adjudicates, not documentation of the change. Observed on gig 34ff466b: every patch sealed as a one-line summary ('full unified diff captured from git diff --cached ... content present verbatim in the working tree at this path') \u2014 true, and useless as evidence. The reviewer refused, correctly, marking NON-TAUTOLOGY and REDNESS 'NOT RUN'. The gate was not failed, it was STARVED, and the seal accepted that silently because the type asked only for a string.",
25
+ "description": "The unified diff itself, not a description of it. The spec-drafting review chair reads test bodies OUT OF THIS FIELD ('read each red test in the diffs'), so this is the evidence the gate adjudicates, not documentation of the change. Observed on gig 34ff466b: every patch sealed as a one-line summary ('full unified diff captured from git diff --cached ... content present verbatim in the working tree at this path') true, and useless as evidence. The reviewer refused, correctly, marking NON-TAUTOLOGY and REDNESS 'NOT RUN'. The gate was not failed, it was STARVED, and the seal accepted that silently because the type asked only for a string.",
26
26
  "pattern": "(^|\\n)[+-]"
27
27
  }
28
28
  },
@@ -61,7 +61,7 @@
61
61
  },
62
62
  "uncovered": {
63
63
  "type": "array",
64
- "description": "Contract invariants with no red test \u2014 MUST be empty.",
64
+ "description": "Contract invariants with no red test MUST be empty.",
65
65
  "items": {
66
66
  "type": "string"
67
67
  }
@@ -8,21 +8,91 @@
8
8
  "schema": {
9
9
  "type": "object",
10
10
  "properties": {
11
- "repo_path": { "type": "string", "description": "Absolute path to the repo on disk." },
12
- "repo_name": { "type": "string", "description": "Basename of the repo directory." },
13
- "primary_language": { "type": ["string", "null"], "description": "Inferred from file-extension distribution + manifest files. Null if mixed/unclear." },
14
- "manifest_files": { "type": "array", "items": { "type": "string" }, "description": "Detected manifest files: package.json, pyproject.toml, Cargo.toml, go.mod, etc." },
15
- "readme_h1": { "type": ["string", "null"], "description": "First H1 line of README (≤200 chars), if present." },
16
- "readme_first_lines": { "type": ["string", "null"], "description": "First 200 chars of README body for context." },
17
- "has_claude_md": { "type": "boolean", "description": "Whether the repo has a CLAUDE.md." },
18
- "has_dot_claude": { "type": "boolean", "description": "Whether the repo has a .claude/ directory (subagents, commands, hooks)." },
19
- "has_dot_coltrane": { "type": "boolean", "description": "Whether the repo has a .coltrane/ directory (already coltrane-flavored)." },
20
- "commit_rhythm_30d": { "type": ["integer", "null"], "description": "Number of commits in the last 30 days." },
21
- "last_commit_at": { "type": ["string", "null"], "format": "date-time" },
22
- "top_directories": { "type": "array", "items": { "type": "string" }, "description": "Top-level subdirectory names (e.g. src/, tests/, docs/) — structural hint." },
23
- "survey_completeness": { "type": "string", "enum": ["complete", "partial", "shallow"], "description": "Honest signal-bound: did we hit the scan limits or get clean reads on every channel?" }
11
+ "repo_path": {
12
+ "type": "string",
13
+ "description": "Absolute path to the repo on disk."
14
+ },
15
+ "repo_name": {
16
+ "type": "string",
17
+ "description": "Basename of the repo directory."
18
+ },
19
+ "primary_language": {
20
+ "type": [
21
+ "string",
22
+ "null"
23
+ ],
24
+ "description": "Inferred from file-extension distribution + manifest files. Null if mixed/unclear."
25
+ },
26
+ "manifest_files": {
27
+ "type": "array",
28
+ "items": {
29
+ "type": "string"
30
+ },
31
+ "description": "Detected manifest files: package.json, pyproject.toml, Cargo.toml, go.mod, etc."
32
+ },
33
+ "readme_h1": {
34
+ "type": [
35
+ "string",
36
+ "null"
37
+ ],
38
+ "description": "First H1 line of README (≤200 chars), if present."
39
+ },
40
+ "readme_first_lines": {
41
+ "type": [
42
+ "string",
43
+ "null"
44
+ ],
45
+ "description": "First 200 chars of README body for context."
46
+ },
47
+ "has_claude_md": {
48
+ "type": "boolean",
49
+ "description": "Whether the repo has a CLAUDE.md."
50
+ },
51
+ "has_dot_claude": {
52
+ "type": "boolean",
53
+ "description": "Whether the repo has a .claude/ directory (subagents, commands, hooks)."
54
+ },
55
+ "has_dot_coltrane": {
56
+ "type": "boolean",
57
+ "description": "Whether the repo has a .coltrane/ directory (already coltrane-flavored)."
58
+ },
59
+ "commit_rhythm_30d": {
60
+ "type": [
61
+ "integer",
62
+ "null"
63
+ ],
64
+ "description": "Number of commits in the last 30 days."
65
+ },
66
+ "last_commit_at": {
67
+ "type": [
68
+ "string",
69
+ "null"
70
+ ],
71
+ "format": "date-time"
72
+ },
73
+ "top_directories": {
74
+ "type": "array",
75
+ "items": {
76
+ "type": "string"
77
+ },
78
+ "description": "Top-level subdirectory names (e.g. src/, tests/, docs/) — structural hint."
79
+ },
80
+ "survey_completeness": {
81
+ "type": "string",
82
+ "enum": [
83
+ "complete",
84
+ "partial",
85
+ "shallow"
86
+ ],
87
+ "description": "Honest signal-bound: did we hit the scan limits or get clean reads on every channel?"
88
+ }
24
89
  },
25
- "required": ["repo_path", "repo_name", "survey_completeness", "source"]
90
+ "required": [
91
+ "repo_path",
92
+ "repo_name",
93
+ "survey_completeness",
94
+ "source"
95
+ ]
26
96
  },
27
97
  "required_fields": []
28
98
  }
@@ -8,63 +8,129 @@
8
8
  "schema": {
9
9
  "type": "object",
10
10
  "properties": {
11
- "input_refs": { "type": "array", "items": { "type": "string" }, "description": "References to all draft-* outputs this verdict resolves." },
12
- "repos_surveyed": { "type": "integer", "description": "Total repo-survey signals consumed." },
13
- "patterns_extracted": { "type": "integer", "description": "Total pattern-extraction interpretations produced." },
14
-
11
+ "input_refs": {
12
+ "type": "array",
13
+ "items": {
14
+ "type": "string"
15
+ },
16
+ "description": "References to all draft-* outputs this verdict resolves."
17
+ },
18
+ "repos_surveyed": {
19
+ "type": "integer",
20
+ "description": "Total repo-survey signals consumed."
21
+ },
22
+ "patterns_extracted": {
23
+ "type": "integer",
24
+ "description": "Total pattern-extraction interpretations produced."
25
+ },
15
26
  "drafts_proposed": {
16
27
  "type": "object",
17
28
  "properties": {
18
- "agents": { "type": "integer" },
19
- "standards": { "type": "integer" },
20
- "domain_types": { "type": "integer" }
29
+ "agents": {
30
+ "type": "integer"
31
+ },
32
+ "standards": {
33
+ "type": "integer"
34
+ },
35
+ "domain_types": {
36
+ "type": "integer"
37
+ }
21
38
  }
22
39
  },
23
40
  "drafts_accepted": {
24
41
  "type": "object",
25
42
  "properties": {
26
- "agents": { "type": "integer" },
27
- "standards": { "type": "integer" },
28
- "domain_types": { "type": "integer" }
43
+ "agents": {
44
+ "type": "integer"
45
+ },
46
+ "standards": {
47
+ "type": "integer"
48
+ },
49
+ "domain_types": {
50
+ "type": "integer"
51
+ }
29
52
  }
30
53
  },
31
54
  "drafts_rejected": {
32
55
  "type": "object",
33
56
  "properties": {
34
- "agents": { "type": "integer" },
35
- "standards": { "type": "integer" },
36
- "domain_types": { "type": "integer" }
57
+ "agents": {
58
+ "type": "integer"
59
+ },
60
+ "standards": {
61
+ "type": "integer"
62
+ },
63
+ "domain_types": {
64
+ "type": "integer"
65
+ }
37
66
  }
38
67
  },
39
68
  "drafts_refined": {
40
69
  "type": "object",
41
70
  "description": "Drafts the user edited before accepting — re-proposed and adopted in modified form.",
42
71
  "properties": {
43
- "agents": { "type": "integer" },
44
- "standards": { "type": "integer" },
45
- "domain_types": { "type": "integer" }
72
+ "agents": {
73
+ "type": "integer"
74
+ },
75
+ "standards": {
76
+ "type": "integer"
77
+ },
78
+ "domain_types": {
79
+ "type": "integer"
80
+ }
46
81
  }
47
82
  },
48
-
49
- "pass": { "type": "boolean", "description": "True if ≥1 draft of each kind (agent/standard/type) was accepted, OR the user explicitly approves the empty-result verdict." },
83
+ "pass": {
84
+ "type": "boolean",
85
+ "description": "True if ≥1 draft of each kind (agent/standard/type) was accepted, OR the user explicitly approves the empty-result verdict."
86
+ },
50
87
  "checks": {
51
88
  "type": "array",
52
89
  "items": {
53
90
  "type": "object",
54
91
  "properties": {
55
- "name": { "type": "string" },
56
- "method": { "type": "string", "description": "How the check was performed. Required by the Verdict core invariant (#227/#228) — this item schema previously omitted it, so a maximally schema-valid seeding-verdict was unsealable." },
57
- "passed": { "type": "boolean" },
58
- "note": { "type": "string" }
92
+ "name": {
93
+ "type": "string"
94
+ },
95
+ "method": {
96
+ "type": "string",
97
+ "description": "How the check was performed. Required by the Verdict core invariant (#227/#228) — this item schema previously omitted it, so a maximally schema-valid seeding-verdict was unsealable."
98
+ },
99
+ "passed": {
100
+ "type": "boolean"
101
+ },
102
+ "note": {
103
+ "type": "string"
104
+ }
59
105
  },
60
- "required": ["name", "method", "passed"]
106
+ "required": [
107
+ "name",
108
+ "method",
109
+ "passed"
110
+ ]
61
111
  }
62
112
  },
63
-
64
- "outcome": { "type": "string", "enum": ["completed", "partial", "refined", "aborted"] },
65
- "next_step_hint": { "type": "string", "description": "What to run next." }
113
+ "outcome": {
114
+ "type": "string",
115
+ "enum": [
116
+ "completed",
117
+ "partial",
118
+ "refined",
119
+ "aborted"
120
+ ]
121
+ },
122
+ "next_step_hint": {
123
+ "type": "string",
124
+ "description": "What to run next."
125
+ }
66
126
  },
67
- "required": ["input_refs", "repos_surveyed", "pass", "checks", "outcome"]
127
+ "required": [
128
+ "input_refs",
129
+ "repos_surveyed",
130
+ "pass",
131
+ "checks",
132
+ "outcome"
133
+ ]
68
134
  },
69
135
  "required_fields": []
70
136
  }
@@ -13,38 +13,73 @@
13
13
  "parent_context_preservation": {
14
14
  "type": "object",
15
15
  "properties": {
16
- "score": { "type": ["number", "null"] },
17
- "rationale": { "type": "string" }
16
+ "score": {
17
+ "type": [
18
+ "number",
19
+ "null"
20
+ ]
21
+ },
22
+ "rationale": {
23
+ "type": "string"
24
+ }
18
25
  }
19
26
  },
20
27
  "child_stay_on_task": {
21
28
  "type": "object",
22
29
  "properties": {
23
- "score": { "type": ["number", "null"] },
24
- "rationale": { "type": "string" }
30
+ "score": {
31
+ "type": [
32
+ "number",
33
+ "null"
34
+ ]
35
+ },
36
+ "rationale": {
37
+ "type": "string"
38
+ }
25
39
  }
26
40
  },
27
41
  "inter_turn_coherence": {
28
42
  "type": "object",
29
43
  "properties": {
30
- "score": { "type": ["number", "null"] },
31
- "rationale": { "type": "string" }
44
+ "score": {
45
+ "type": [
46
+ "number",
47
+ "null"
48
+ ]
49
+ },
50
+ "rationale": {
51
+ "type": "string"
52
+ }
32
53
  }
33
54
  },
34
55
  "graceful_degradation": {
35
56
  "type": "object",
36
57
  "properties": {
37
- "score": { "type": ["number", "null"] },
38
- "rationale": { "type": "string" }
58
+ "score": {
59
+ "type": [
60
+ "number",
61
+ "null"
62
+ ]
63
+ },
64
+ "rationale": {
65
+ "type": "string"
66
+ }
39
67
  }
40
68
  }
41
69
  }
42
70
  },
43
71
  "overall_verdict_shade": {
44
72
  "type": "string",
45
- "enum": ["pass", "mixed", "fail", "not-judgeable"]
73
+ "enum": [
74
+ "pass",
75
+ "mixed",
76
+ "fail",
77
+ "not-judgeable"
78
+ ]
46
79
  },
47
- "top_insight": { "type": "string" }
80
+ "top_insight": {
81
+ "type": "string"
82
+ }
48
83
  }
49
84
  },
50
85
  "required_fields": [
@@ -7,32 +7,58 @@
7
7
  "schema": {
8
8
  "type": "object",
9
9
  "properties": {
10
- "transcript_present": { "type": "boolean" },
11
- "turn_count": { "type": "number" },
10
+ "transcript_present": {
11
+ "type": "boolean"
12
+ },
13
+ "turn_count": {
14
+ "type": "number"
15
+ },
12
16
  "turns": {
13
17
  "type": "array",
14
18
  "items": {
15
19
  "type": "object",
16
20
  "properties": {
17
- "turn_idx": { "type": "number" },
18
- "user_intent": { "type": "string" },
19
- "claude_response": { "type": "string" },
21
+ "turn_idx": {
22
+ "type": "number"
23
+ },
24
+ "user_intent": {
25
+ "type": "string"
26
+ },
27
+ "claude_response": {
28
+ "type": "string"
29
+ },
20
30
  "tool_calls": {
21
31
  "type": "array",
22
32
  "items": {
23
33
  "type": "object",
24
34
  "properties": {
25
- "tool_name": { "type": "string" },
26
- "args": { "type": ["object", "null"] }
35
+ "tool_name": {
36
+ "type": "string"
37
+ },
38
+ "args": {
39
+ "type": [
40
+ "object",
41
+ "null"
42
+ ]
43
+ }
27
44
  }
28
45
  }
29
46
  },
30
- "post_turn_genome_state": { "type": ["object", "null"] },
31
- "malformed_input": { "type": "boolean" }
47
+ "post_turn_genome_state": {
48
+ "type": [
49
+ "object",
50
+ "null"
51
+ ]
52
+ },
53
+ "malformed_input": {
54
+ "type": "boolean"
55
+ }
32
56
  }
33
57
  }
34
58
  },
35
- "notes": { "type": "string" }
59
+ "notes": {
60
+ "type": "string"
61
+ }
36
62
  }
37
63
  },
38
64
  "required_fields": [