ultimate-pi 0.20.0 → 0.22.0

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 (130) hide show
  1. package/.agents/skills/harness-decisions/SKILL.md +68 -2
  2. package/.agents/skills/harness-git-commit/SKILL.md +72 -0
  3. package/.agents/skills/harness-governor/SKILL.md +2 -2
  4. package/.agents/skills/harness-ls-lint-setup/SKILL.md +59 -0
  5. package/.agents/skills/harness-plan/SKILL.md +13 -11
  6. package/.agents/skills/harness-review/SKILL.md +1 -1
  7. package/.agents/skills/harness-sentrux-repair/SKILL.md +48 -0
  8. package/.agents/skills/sentrux/SKILL.md +4 -2
  9. package/.agents/skills/wiki-save/SKILL.md +1 -1
  10. package/.pi/PACKAGING.md +6 -0
  11. package/.pi/SYSTEM.md +21 -3
  12. package/.pi/agents/harness/ls-lint-steward.md +49 -0
  13. package/.pi/agents/harness/planning/decompose.md +4 -4
  14. package/.pi/agents/harness/reviewing/evaluator.md +1 -1
  15. package/.pi/agents/harness/running/executor.md +1 -1
  16. package/.pi/agents/harness/sentrux-repair-advisor.md +50 -0
  17. package/.pi/agents/pi-pi/prompt-expert.md +17 -2
  18. package/.pi/auto-commit.json +9 -2
  19. package/.pi/extensions/debate-orchestrator.ts +3 -0
  20. package/.pi/extensions/harness-anchored-edit.ts +7 -9
  21. package/.pi/extensions/harness-ask-user.ts +13 -34
  22. package/.pi/extensions/harness-debate-tools.ts +43 -4
  23. package/.pi/extensions/harness-live-widget.ts +28 -19
  24. package/.pi/extensions/harness-run-context.ts +278 -115
  25. package/.pi/extensions/harness-web-tools.ts +598 -471
  26. package/.pi/extensions/ls-lint-rules-sync.ts +103 -0
  27. package/.pi/extensions/observation-bus.ts +4 -0
  28. package/.pi/extensions/policy-gate.ts +270 -229
  29. package/.pi/extensions/sentrux-rules-sync.ts +2 -0
  30. package/.pi/extensions/soundboard.ts +48 -48
  31. package/.pi/harness/README.md +4 -0
  32. package/.pi/harness/agents.manifest.json +15 -7
  33. package/.pi/harness/agents.policy.yaml +49 -82
  34. package/.pi/harness/docs/adrs/0052-ls-lint-naming-lifecycle.md +45 -0
  35. package/.pi/harness/docs/adrs/0052-sentrux-structured-repair.md +38 -0
  36. package/.pi/harness/docs/adrs/0053-plan-task-clarification-gate.md +39 -0
  37. package/.pi/harness/docs/adrs/0054-harness-native-ask-user.md +40 -0
  38. package/.pi/harness/docs/adrs/0055-auto-commit-coauthor-lifecycle.md +40 -0
  39. package/.pi/harness/docs/adrs/README.md +5 -0
  40. package/.pi/harness/docs/practice-map.md +10 -5
  41. package/.pi/harness/evals/smoke/ls-lint-stub.json +10 -0
  42. package/.pi/harness/evolution/self-healing-rules.json +16 -0
  43. package/.pi/harness/ls-lint/naming.manifest.json +128 -0
  44. package/.pi/harness/sentrux/architecture.manifest.json +1 -1
  45. package/.pi/harness/specs/auto-commit.schema.json +63 -0
  46. package/.pi/harness/specs/ls-lint-manifest-proposal.schema.json +80 -0
  47. package/.pi/harness/specs/ls-lint-signal.schema.json +47 -0
  48. package/.pi/harness/specs/naming-manifest.schema.json +54 -0
  49. package/.pi/harness/specs/plan-task-clarification.schema.json +88 -0
  50. package/.pi/harness/specs/sentrux-diagnostics.schema.json +173 -0
  51. package/.pi/harness/specs/sentrux-repair-plan.schema.json +133 -0
  52. package/.pi/harness/specs/sentrux-report.schema.json +119 -0
  53. package/.pi/harness/specs/sentrux-signal.schema.json +34 -1
  54. package/.pi/lib/agents-policy.d.mts +26 -51
  55. package/.pi/lib/agents-policy.mjs +41 -28
  56. package/.pi/lib/agt/build-evaluation-context.ts +136 -64
  57. package/.pi/lib/ask-user/constants.mjs +3 -0
  58. package/.pi/lib/ask-user/constants.ts +4 -0
  59. package/.pi/lib/ask-user/contracts/glimpse-parse.ts +56 -0
  60. package/.pi/lib/ask-user/contracts/glimpse-payload-build.ts +58 -0
  61. package/.pi/lib/ask-user/contracts/glimpse-payload.ts +38 -0
  62. package/.pi/lib/ask-user/core/questionnaire.ts +74 -0
  63. package/.pi/lib/ask-user/dialog.ts +2 -314
  64. package/.pi/lib/ask-user/fallback.ts +2 -78
  65. package/.pi/lib/ask-user/format.ts +85 -0
  66. package/.pi/lib/ask-user/glimpseui.d.ts +10 -0
  67. package/.pi/lib/ask-user/index.ts +114 -0
  68. package/.pi/lib/ask-user/merge-task-clarification.ts +98 -0
  69. package/.pi/lib/ask-user/policy.mjs +43 -0
  70. package/.pi/lib/ask-user/policy.ts +104 -0
  71. package/.pi/lib/ask-user/presenters/glimpse.ts +130 -0
  72. package/.pi/lib/ask-user/presenters/headless.ts +131 -0
  73. package/.pi/lib/ask-user/presenters/select.ts +60 -0
  74. package/.pi/lib/ask-user/presenters/tui.ts +373 -0
  75. package/.pi/lib/ask-user/presenters/types.ts +13 -0
  76. package/.pi/lib/ask-user/render.ts +40 -9
  77. package/.pi/lib/ask-user/schema.ts +66 -13
  78. package/.pi/lib/ask-user/types.ts +60 -3
  79. package/.pi/lib/ask-user/validate-core.mjs +193 -7
  80. package/.pi/lib/ask-user/validate.ts +53 -34
  81. package/.pi/lib/harness-anchored-edit/package.json +3 -0
  82. package/.pi/lib/harness-artifact-gate.ts +75 -21
  83. package/.pi/lib/harness-auto-commit-config.mjs +321 -0
  84. package/.pi/lib/harness-lens/clients/lsp/client.ts +62 -39
  85. package/.pi/lib/harness-lens/clients/tool-policy.ts +73 -181
  86. package/.pi/lib/harness-lens/index.ts +241 -108
  87. package/.pi/lib/harness-lens/tools/lsp-navigation.ts +10 -8
  88. package/.pi/lib/harness-repair-brief.ts +84 -25
  89. package/.pi/lib/harness-run-context.ts +42 -52
  90. package/.pi/lib/harness-sentrux-parse.mjs +272 -0
  91. package/.pi/lib/harness-sentrux-root.mjs +78 -0
  92. package/.pi/lib/harness-slash-completions.ts +116 -0
  93. package/.pi/lib/harness-spawn-topology.ts +121 -87
  94. package/.pi/lib/harness-subagent-submit-registry.ts +10 -0
  95. package/.pi/lib/harness-subagents-bridge.ts +4 -1
  96. package/.pi/lib/harness-ui-state.ts +95 -48
  97. package/.pi/lib/plan-approval/dialog.ts +5 -0
  98. package/.pi/lib/plan-approval/validate.ts +1 -1
  99. package/.pi/lib/plan-approval-readiness.ts +32 -0
  100. package/.pi/lib/plan-debate-gate.ts +154 -114
  101. package/.pi/lib/plan-task-clarification.ts +158 -0
  102. package/.pi/prompts/harness-auto.md +2 -2
  103. package/.pi/prompts/harness-ls-lint-steward.md +43 -0
  104. package/.pi/prompts/harness-plan.md +58 -8
  105. package/.pi/prompts/harness-review.md +40 -6
  106. package/.pi/prompts/harness-run.md +33 -11
  107. package/.pi/prompts/harness-setup.md +72 -3
  108. package/.pi/prompts/harness-steer.md +2 -1
  109. package/.pi/prompts/wiki-save.md +5 -4
  110. package/.pi/scripts/README.md +8 -0
  111. package/.pi/scripts/generate-agents-policy-yaml.mjs +14 -2
  112. package/.pi/scripts/harness-auto-commit-bootstrap.mjs +96 -0
  113. package/.pi/scripts/harness-cli-verify.sh +47 -0
  114. package/.pi/scripts/harness-git-churn.mjs +77 -0
  115. package/.pi/scripts/harness-git-commit.mjs +173 -0
  116. package/.pi/scripts/harness-ls-lint-bootstrap.mjs +142 -0
  117. package/.pi/scripts/harness-ls-lint-cli.mjs +184 -0
  118. package/.pi/scripts/harness-seed-project-contracts.mjs +47 -0
  119. package/.pi/scripts/harness-sentrux-diagnostics.mjs +230 -0
  120. package/.pi/scripts/harness-sentrux-report.mjs +256 -0
  121. package/.pi/scripts/harness-verify.mjs +288 -125
  122. package/.pi/scripts/ls-lint-rules-sync.mjs +265 -0
  123. package/.pi/scripts/run-tests.mjs +1 -0
  124. package/.pi/settings.example.json +1 -0
  125. package/.sentrux/rules.toml +1 -1
  126. package/AGENTS.md +1 -0
  127. package/CHANGELOG.md +25 -0
  128. package/README.md +13 -4
  129. package/package.json +5 -1
  130. package/vendor/pi-vcc/src/hooks/before-compact.ts +86 -60
@@ -0,0 +1,128 @@
1
+ {
2
+ "schema_version": "1.0.0",
3
+ "project": "ultimate-pi",
4
+ "global_rules": {
5
+ ".*": "regex:^[a-z]+(?:-[a-z]+)*$",
6
+ ".md": "regex:^[a-z]+(?:-[a-z]+)*$",
7
+ ".ts": "regex:^[a-z]+(?:-[a-z]+)*$",
8
+ ".tsx": "regex:^[a-z]+(?:-[a-z]+)*$",
9
+ ".mjs": "regex:^[a-z]+(?:-[a-z]+)*$",
10
+ ".js": "regex:^[a-z]+(?:-[a-z]+)*$",
11
+ ".json": "regex:^[a-z]+(?:-[a-z]+)*$",
12
+ ".yaml": "regex:^[a-z]+(?:-[a-z]+)*$",
13
+ ".yml": "regex:^[a-z]+(?:-[a-z]+)*$",
14
+ ".toml": "regex:^[a-z]+(?:-[a-z]+)*$",
15
+ ".py": "regex:^[a-z]+(?:-[a-z]+)*$",
16
+ ".sh": "regex:^[a-z]+(?:-[a-z]+)*$",
17
+ ".css": "regex:^[a-z]+(?:-[a-z]+)*$",
18
+ ".html": "regex:^[a-z]+(?:-[a-z]+)*$"
19
+ },
20
+ "scoped_rules": [
21
+ {
22
+ "path": ".pi/harness/docs/adrs",
23
+ "rules": {
24
+ ".md": "regex:^\\d{4}-[a-z-]+$|^template$"
25
+ }
26
+ },
27
+ {
28
+ "path": ".agents/skills",
29
+ "rules": {
30
+ ".dir": "kebab-case",
31
+ ".md": "regex:^SKILL\\.md$"
32
+ }
33
+ },
34
+ {
35
+ "path": "scripts",
36
+ "rules": {
37
+ ".dir": "kebab-case"
38
+ }
39
+ },
40
+ {
41
+ "path": "docs",
42
+ "rules": {
43
+ ".dir": "kebab-case"
44
+ }
45
+ },
46
+ {
47
+ "path": ".pi/scripts",
48
+ "rules": {
49
+ ".dir": "snake_case"
50
+ }
51
+ },
52
+ {
53
+ "path": ".pi/agents",
54
+ "rules": {
55
+ ".dir": "kebab-case"
56
+ }
57
+ }
58
+ ],
59
+ "ignores": [
60
+ ".git",
61
+ "node_modules",
62
+ "graphify-out",
63
+ "graphify-books-out",
64
+ "vendor",
65
+ "dist",
66
+ "build",
67
+ "coverage",
68
+ ".web",
69
+ ".cursor",
70
+ ".github",
71
+ ".agents",
72
+ ".pi/npm",
73
+ ".pi/harness/runs",
74
+ ".pi/harness/debates",
75
+ ".pi/harness/.lens",
76
+ ".pi/wiki-search",
77
+ ".cocoindex_code",
78
+ ".sentrux",
79
+ ".ls-lint",
80
+ ".searxng",
81
+ ".vault-meta",
82
+ ".raw",
83
+ "raw",
84
+ "data",
85
+ "**/__pycache__/**",
86
+ "submissions",
87
+ "jobs",
88
+ "pl",
89
+ "**/*.png",
90
+ "**/*.jpg",
91
+ "**/*.jpeg",
92
+ "**/*.gif",
93
+ "**/*.webp",
94
+ "**/*.ico",
95
+ "**/*.svg",
96
+ "package-lock.json",
97
+ "pnpm-lock.yaml",
98
+ "yarn.lock",
99
+ "*.lock",
100
+ "README.md",
101
+ "**/README.md",
102
+ "SKILL.md",
103
+ "**/SKILL.md",
104
+ "CHANGELOG.md",
105
+ "LICENSE",
106
+ "AGENTS.md",
107
+ "CONTRIBUTING.md",
108
+ "THIRD_PARTY_NOTICES.md",
109
+ ".env.example",
110
+ "skills-lock.json",
111
+ ".fallow-baseline.json",
112
+ ".graphify_detect.json",
113
+ ".graphify_python",
114
+ ".graphify_root",
115
+ ".graphify_incremental.json",
116
+ ".pi/SYSTEM.md",
117
+ ".pi/PACKAGING.md",
118
+ "**/.*",
119
+ ".pi/sounds",
120
+ ".pi/harness/evals",
121
+ ".pi/extensions/00-harness-project-control.ts",
122
+ "DOCS_BY_AUDIENCE.md",
123
+ "GLOSSARY.md",
124
+ "REPO_MAP.md",
125
+ "START_HERE.md",
126
+ "WORKFLOW_CHEAT_SHEET.md"
127
+ ]
128
+ }
@@ -4,7 +4,7 @@
4
4
  "constraints": {
5
5
  "max_cycles": 0,
6
6
  "max_coupling": "B",
7
- "max_cc": 35,
7
+ "max_cc": 25,
8
8
  "no_god_files": true
9
9
  },
10
10
  "layers": [
@@ -0,0 +1,63 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ultimate-pi.local/.pi/harness/specs/auto-commit.schema.json",
4
+ "title": "AutoCommitConfig",
5
+ "description": "Harness auto-commit: co-author trailers, message templates, branch/push hints.",
6
+ "type": "object",
7
+ "additionalProperties": true,
8
+ "properties": {
9
+ "dryRun": { "type": "boolean" },
10
+ "coAuthor": {
11
+ "type": "object",
12
+ "additionalProperties": false,
13
+ "required": ["login", "email"],
14
+ "properties": {
15
+ "login": { "type": "string", "minLength": 1 },
16
+ "email": { "type": "string", "minLength": 3 },
17
+ "required": { "type": "boolean" }
18
+ }
19
+ },
20
+ "branch": {
21
+ "type": "object",
22
+ "additionalProperties": true,
23
+ "properties": {
24
+ "strategy": { "type": "string" },
25
+ "protected": {
26
+ "type": "array",
27
+ "items": { "type": "string" }
28
+ }
29
+ }
30
+ },
31
+ "push": {
32
+ "type": "object",
33
+ "additionalProperties": true,
34
+ "properties": {
35
+ "allowedRemotes": {
36
+ "type": "array",
37
+ "items": { "type": "string" }
38
+ }
39
+ }
40
+ },
41
+ "submodules": {
42
+ "type": "object",
43
+ "additionalProperties": true,
44
+ "properties": {
45
+ "ignore": { "type": "boolean" }
46
+ }
47
+ },
48
+ "message": {
49
+ "type": "object",
50
+ "additionalProperties": false,
51
+ "required": ["template", "coAuthorTrailer"],
52
+ "properties": {
53
+ "template": { "type": "string", "minLength": 1 },
54
+ "templateNoScope": { "type": "string", "minLength": 1 },
55
+ "typeDefault": { "type": "string", "minLength": 1 },
56
+ "scopeDefault": { "type": "string" },
57
+ "bodySeparator": { "type": "string" },
58
+ "coAuthorTrailer": { "type": "string", "minLength": 1 },
59
+ "maxSubjectLength": { "type": "integer", "minimum": 20, "maximum": 200 }
60
+ }
61
+ }
62
+ }
63
+ }
@@ -0,0 +1,80 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ultimate-pi.local/.pi/harness/specs/ls-lint-manifest-proposal.schema.json",
4
+ "title": "LsLintManifestProposal",
5
+ "description": "Graphify-grounded proposal to evolve naming.manifest.json (intent layer). Chair applies after approval.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema_version",
10
+ "change_class",
11
+ "summary",
12
+ "evidence",
13
+ "manifest_patch",
14
+ "adr_required",
15
+ "human_required"
16
+ ],
17
+ "properties": {
18
+ "schema_version": {
19
+ "type": "string",
20
+ "const": "1.0.0"
21
+ },
22
+ "change_class": {
23
+ "type": "string",
24
+ "enum": [
25
+ "none",
26
+ "tune_rule",
27
+ "add_scoped_rule",
28
+ "add_ignore",
29
+ "change_global"
30
+ ]
31
+ },
32
+ "summary": {
33
+ "type": "string",
34
+ "minLength": 1
35
+ },
36
+ "evidence": {
37
+ "type": "array",
38
+ "items": {
39
+ "type": "object",
40
+ "additionalProperties": false,
41
+ "required": ["source", "ref", "summary"],
42
+ "properties": {
43
+ "source": {
44
+ "type": "string",
45
+ "enum": ["graphify", "sg", "ls-lint", "plan", "manifest"]
46
+ },
47
+ "ref": {
48
+ "type": "string",
49
+ "minLength": 1
50
+ },
51
+ "summary": {
52
+ "type": "string",
53
+ "minLength": 1
54
+ }
55
+ }
56
+ }
57
+ },
58
+ "manifest_patch": {
59
+ "type": "object",
60
+ "description": "JSON Merge Patch (RFC 7396) ops against naming.manifest.json",
61
+ "additionalProperties": true
62
+ },
63
+ "adr_required": {
64
+ "type": "boolean"
65
+ },
66
+ "adr_draft": {
67
+ "type": "string"
68
+ },
69
+ "human_required": {
70
+ "type": "boolean"
71
+ },
72
+ "open_questions": {
73
+ "type": "array",
74
+ "items": {
75
+ "type": "string",
76
+ "minLength": 1
77
+ }
78
+ }
79
+ }
80
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ultimate-pi.local/.pi/harness/specs/ls-lint-signal.schema.json",
4
+ "title": "LsLintSignal",
5
+ "description": "Per-run ls-lint CLI observation for evaluator and harness-verify promotion.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema_version",
10
+ "run_id",
11
+ "lint_pass",
12
+ "status",
13
+ "recorded_at"
14
+ ],
15
+ "properties": {
16
+ "schema_version": {
17
+ "type": "string",
18
+ "const": "1.0.0"
19
+ },
20
+ "run_id": {
21
+ "type": "string",
22
+ "minLength": 1
23
+ },
24
+ "lint_pass": {
25
+ "type": "boolean"
26
+ },
27
+ "violation_count": {
28
+ "type": "integer",
29
+ "minimum": 0
30
+ },
31
+ "status": {
32
+ "type": "string",
33
+ "enum": ["pass", "fail", "skipped", "not_installed"]
34
+ },
35
+ "quality_signal_summary": {
36
+ "type": "string"
37
+ },
38
+ "recorded_at": {
39
+ "type": "string",
40
+ "format": "date-time"
41
+ },
42
+ "phase": {
43
+ "type": "string",
44
+ "enum": ["execute", "evaluate", "review"]
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ultimate-pi.local/.pi/harness/specs/naming-manifest.schema.json",
4
+ "title": "NamingManifest",
5
+ "description": "Canonical harness source for .ls-lint.yml (filename and directory naming).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["schema_version", "project", "global_rules", "ignores"],
9
+ "properties": {
10
+ "schema_version": {
11
+ "type": "string",
12
+ "const": "1.0.0"
13
+ },
14
+ "project": {
15
+ "type": "string",
16
+ "minLength": 1
17
+ },
18
+ "global_rules": {
19
+ "type": "object",
20
+ "additionalProperties": {
21
+ "type": "string",
22
+ "minLength": 1
23
+ }
24
+ },
25
+ "scoped_rules": {
26
+ "type": "array",
27
+ "items": {
28
+ "type": "object",
29
+ "additionalProperties": false,
30
+ "required": ["path", "rules"],
31
+ "properties": {
32
+ "path": {
33
+ "type": "string",
34
+ "minLength": 1
35
+ },
36
+ "rules": {
37
+ "type": "object",
38
+ "additionalProperties": {
39
+ "type": "string",
40
+ "minLength": 1
41
+ }
42
+ }
43
+ }
44
+ }
45
+ },
46
+ "ignores": {
47
+ "type": "array",
48
+ "items": {
49
+ "type": "string",
50
+ "minLength": 1
51
+ }
52
+ }
53
+ }
54
+ }
@@ -0,0 +1,88 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ultimate-pi.local/.pi/harness/specs/plan-task-clarification.schema.json",
4
+ "title": "PlanTaskClarification",
5
+ "description": "Upfront task contract before harness plan reconnaissance (Phase 0).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema_version",
10
+ "status",
11
+ "source_task",
12
+ "clarified_task",
13
+ "success_definition",
14
+ "in_scope",
15
+ "out_of_scope",
16
+ "acceptance_checks_draft",
17
+ "assumptions",
18
+ "risk_level",
19
+ "unresolved_questions",
20
+ "clarification_rounds",
21
+ "task_input_hash"
22
+ ],
23
+ "properties": {
24
+ "schema_version": { "type": "string", "const": "1.0.0" },
25
+ "status": {
26
+ "type": "string",
27
+ "enum": ["draft", "needs_user", "ready"]
28
+ },
29
+ "source_task": { "type": "string", "minLength": 1 },
30
+ "clarified_task": { "type": "string", "minLength": 1 },
31
+ "success_definition": { "type": "string", "minLength": 1 },
32
+ "in_scope": {
33
+ "type": "array",
34
+ "items": { "type": "string", "minLength": 1 }
35
+ },
36
+ "out_of_scope": {
37
+ "type": "array",
38
+ "items": { "type": "string", "minLength": 1 }
39
+ },
40
+ "acceptance_checks_draft": {
41
+ "type": "array",
42
+ "minItems": 1,
43
+ "items": { "type": "string", "minLength": 1 }
44
+ },
45
+ "assumptions": {
46
+ "type": "array",
47
+ "items": { "type": "string" }
48
+ },
49
+ "risk_level": {
50
+ "type": "string",
51
+ "enum": ["low", "med", "high"]
52
+ },
53
+ "constraints": {
54
+ "type": "object",
55
+ "properties": {
56
+ "hard": { "type": "array", "items": { "type": "string" } },
57
+ "soft": { "type": "array", "items": { "type": "string" } }
58
+ },
59
+ "additionalProperties": true
60
+ },
61
+ "unresolved_questions": {
62
+ "type": "array",
63
+ "items": { "type": "string" }
64
+ },
65
+ "clarification_rounds": { "type": "integer", "minimum": 0 },
66
+ "task_input_hash": { "type": "string", "minLength": 1 },
67
+ "evidence_refs": {
68
+ "type": "array",
69
+ "items": { "type": "string" }
70
+ },
71
+ "grounding": {
72
+ "type": "object",
73
+ "properties": {
74
+ "repo_mentions": {
75
+ "type": "array",
76
+ "items": { "type": "string" }
77
+ },
78
+ "urls": { "type": "array", "items": { "type": "string" } },
79
+ "tools_used": {
80
+ "type": "array",
81
+ "items": { "type": "string" }
82
+ },
83
+ "summary": { "type": "string" }
84
+ },
85
+ "additionalProperties": true
86
+ }
87
+ }
88
+ }
@@ -0,0 +1,173 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ultimate-pi.local/.pi/harness/specs/sentrux-diagnostics.schema.json",
4
+ "title": "SentruxDiagnostics",
5
+ "description": "Pro-shaped repair-oriented diagnostics synthesized from OSS Sentrux report (no MCP/Pro).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "schema_version",
10
+ "synthesized_at",
11
+ "project_root",
12
+ "quality_signal",
13
+ "bottleneck",
14
+ "bottleneck_inferred",
15
+ "root_causes",
16
+ "diagnostics"
17
+ ],
18
+ "properties": {
19
+ "schema_version": {
20
+ "type": "string",
21
+ "const": "1.0.0"
22
+ },
23
+ "synthesized_at": {
24
+ "type": "string",
25
+ "format": "date-time"
26
+ },
27
+ "project_root": {
28
+ "type": "string",
29
+ "minLength": 1
30
+ },
31
+ "report_sha256": {
32
+ "type": "string"
33
+ },
34
+ "quality_signal": {
35
+ "type": ["integer", "null"]
36
+ },
37
+ "gate_status": {
38
+ "type": "string",
39
+ "enum": ["pass", "degraded", "unknown"]
40
+ },
41
+ "bottleneck": {
42
+ "type": "string",
43
+ "enum": [
44
+ "modularity",
45
+ "equality",
46
+ "acyclicity",
47
+ "stability",
48
+ "abstraction"
49
+ ]
50
+ },
51
+ "bottleneck_inferred": {
52
+ "type": "boolean"
53
+ },
54
+ "root_causes": {
55
+ "type": "array",
56
+ "items": { "type": "string", "minLength": 1 },
57
+ "minItems": 1
58
+ },
59
+ "diagnostics": {
60
+ "type": "object",
61
+ "additionalProperties": false,
62
+ "required": [
63
+ "god_files",
64
+ "hotspots",
65
+ "complex_functions",
66
+ "cycles",
67
+ "violations_summary"
68
+ ],
69
+ "properties": {
70
+ "god_files": {
71
+ "type": "array",
72
+ "items": { "$ref": "#/$defs/god_file" }
73
+ },
74
+ "hotspots": {
75
+ "type": "array",
76
+ "items": { "$ref": "#/$defs/hotspot" }
77
+ },
78
+ "complex_functions": {
79
+ "type": "array",
80
+ "items": { "$ref": "#/$defs/complex_function" }
81
+ },
82
+ "cycles": {
83
+ "type": "array",
84
+ "items": { "$ref": "#/$defs/cycle" }
85
+ },
86
+ "violations_summary": {
87
+ "type": "array",
88
+ "items": { "$ref": "#/$defs/violation_summary" }
89
+ },
90
+ "gate_degraded_reasons": {
91
+ "type": "array",
92
+ "items": { "type": "string" }
93
+ }
94
+ }
95
+ },
96
+ "graphify_refs": {
97
+ "type": "array",
98
+ "items": {
99
+ "type": "object",
100
+ "additionalProperties": false,
101
+ "required": ["path", "summary"],
102
+ "properties": {
103
+ "path": { "type": "string" },
104
+ "summary": { "type": "string" }
105
+ }
106
+ }
107
+ }
108
+ },
109
+ "$defs": {
110
+ "god_file": {
111
+ "type": "object",
112
+ "additionalProperties": false,
113
+ "required": ["path"],
114
+ "properties": {
115
+ "path": { "type": "string" },
116
+ "fan_out": { "type": ["integer", "null"] },
117
+ "reason": { "type": "string" }
118
+ }
119
+ },
120
+ "hotspot": {
121
+ "type": "object",
122
+ "additionalProperties": false,
123
+ "required": ["path", "score"],
124
+ "properties": {
125
+ "path": { "type": "string" },
126
+ "score": { "type": "number" },
127
+ "churn_14d": { "type": ["integer", "null"] },
128
+ "reason": { "type": "string" }
129
+ }
130
+ },
131
+ "complex_function": {
132
+ "type": "object",
133
+ "additionalProperties": false,
134
+ "required": ["file", "func", "cc"],
135
+ "properties": {
136
+ "file": { "type": "string" },
137
+ "func": { "type": "string" },
138
+ "cc": { "type": "integer" },
139
+ "priority": {
140
+ "type": "string",
141
+ "enum": ["critical", "high", "medium", "low"]
142
+ }
143
+ }
144
+ },
145
+ "cycle": {
146
+ "type": "object",
147
+ "additionalProperties": false,
148
+ "required": ["members"],
149
+ "properties": {
150
+ "members": {
151
+ "type": "array",
152
+ "items": { "type": "string" }
153
+ },
154
+ "reason": { "type": "string" }
155
+ }
156
+ },
157
+ "violation_summary": {
158
+ "type": "object",
159
+ "additionalProperties": false,
160
+ "required": ["rule", "count", "severity"],
161
+ "properties": {
162
+ "rule": { "type": "string" },
163
+ "count": { "type": "integer", "minimum": 0 },
164
+ "severity": { "type": "string" },
165
+ "sample_files": {
166
+ "type": "array",
167
+ "items": { "type": "string" },
168
+ "maxItems": 5
169
+ }
170
+ }
171
+ }
172
+ }
173
+ }