@ornexus/neocortex 4.60.65 → 4.60.67

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 (51) hide show
  1. package/dist/release-source.json +1 -1
  2. package/dist/sbom.cdx.json +1598 -1640
  3. package/install.ps1 +1 -1
  4. package/install.sh +2 -1
  5. package/package.json +17 -7
  6. package/packages/client/dist/cli.js +15 -2
  7. package/packages/client/dist/commands/architecture-root-binding.js +1 -1
  8. package/packages/client/dist/commands/doctor.d.ts +135 -0
  9. package/packages/client/dist/commands/doctor.js +2 -0
  10. package/packages/client/dist/commands/invoke.d.ts +19 -1
  11. package/packages/client/dist/commands/invoke.js +83 -82
  12. package/packages/client/dist/commands/story-checkpoint.d.ts +3 -1
  13. package/packages/client/dist/commands/story-checkpoint.js +1 -1
  14. package/packages/client/dist/continuity/sqlite-store.js +1 -1
  15. package/packages/client/dist/git/direct-yolo-c01-retry.d.ts +21 -0
  16. package/packages/client/dist/git/direct-yolo-c01-retry.js +4 -0
  17. package/packages/client/dist/git/direct-yolo-checkpoint.d.ts +1 -5
  18. package/packages/client/dist/git/direct-yolo-checkpoint.js +4 -4
  19. package/packages/client/dist/git/git-lifecycle-store.d.ts +0 -2
  20. package/packages/client/dist/git/git-lifecycle-store.js +8 -9
  21. package/packages/client/dist/private-execution/clean-baseline.d.ts +2 -3
  22. package/packages/client/dist/private-execution/clean-baseline.js +2 -2
  23. package/packages/client/dist/private-execution/isolated-admission.d.ts +2 -0
  24. package/packages/client/dist/private-execution/isolated-admission.js +16 -11
  25. package/packages/client/dist/runner/headless/run-yoloop.d.ts +4 -1
  26. package/packages/client/dist/runner/headless/run-yoloop.js +2 -2
  27. package/packages/client/dist/runner-cli.js +0 -0
  28. package/packages/client/dist/yolo/invoke-envelope-capability.d.ts +16 -0
  29. package/packages/client/dist/yolo/invoke-envelope-capability.js +1 -0
  30. package/packages/client/dist/yolo/spec-envelope-collector.d.ts +7 -0
  31. package/packages/client/dist/yolo/spec-envelope-collector.js +3 -3
  32. package/packages/shared/dist/architecture-non-ui-scope.js +22 -0
  33. package/packages/shared/dist/architecture-public-topology.js +11 -0
  34. package/packages/shared/dist/compatibility/index.js +476 -0
  35. package/packages/shared/dist/invocation/index.js +4 -2
  36. package/packages/shared/dist/private-qa-structural-admission.js +14 -0
  37. package/packages/shared/dist/private-yolo-predecessor-decision.js +32 -0
  38. package/packages/shared/dist/project-validation-commands.js +74 -0
  39. package/packages/shared/dist/yolo/spec-envelope.js +2 -0
  40. package/packages/shared/dist/yoloop/release-blocked.js +653 -0
  41. package/targets-stubs/antigravity/gemini.md +1 -1
  42. package/targets-stubs/antigravity/skill/SKILL.md +3 -2
  43. package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
  44. package/targets-stubs/claude-code/neocortex-root.md +5 -5
  45. package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
  46. package/targets-stubs/claude-code/neocortex.md +8 -9
  47. package/targets-stubs/codex/AGENTS.md +3 -3
  48. package/targets-stubs/cursor/agent.md +4 -3
  49. package/targets-stubs/gemini-cli/agent.md +5 -4
  50. package/targets-stubs/opencode/neocortex-root.md +3 -3
  51. package/targets-stubs/vscode/neocortex.agent.md +5 -4
package/install.ps1 CHANGED
@@ -17,7 +17,7 @@ param(
17
17
  [string]$ServerUrl = ('https://{0}.{1}.{2}' -f 'api','neocortex','sh')
18
18
  )
19
19
 
20
- $VERSION = "4.60.65"
20
+ $VERSION = "4.60.67"
21
21
 
22
22
  # =============================================================================
23
23
  # CONFIGURACOES
package/install.sh CHANGED
@@ -4,7 +4,7 @@
4
4
  # Development Orchestrator
5
5
 
6
6
  # Versao do instalador
7
- VERSION="4.60.65"
7
+ VERSION="4.60.67"
8
8
 
9
9
  # Flags
10
10
  MIGRATION_DETECTED=false
@@ -1035,6 +1035,7 @@ EOFCONFIG
1035
1035
  managed_apply_policy "$HOME" || return 1
1036
1036
 
1037
1037
  debug "Thin client config criada: $config_file"
1038
+ return 0
1038
1039
  }
1039
1040
 
1040
1041
  # cleanup_legacy_ip_project() substituida por auto_cleanup_legacy_project()
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ornexus/neocortex",
3
- "version": "4.60.65",
4
- "description": "Neocortex v4.60.65 - Orquestrador de Desenvolvimento de Epics & Stories para Claude Code",
3
+ "version": "4.60.67",
4
+ "description": "Neocortex v4.60.67 - Orquestrador de Desenvolvimento de Epics & Stories para Claude Code",
5
5
  "keywords": [
6
6
  "claude",
7
7
  "claude-code",
@@ -68,6 +68,7 @@
68
68
  "packages/shared/dist/yolo/spec-envelope.js",
69
69
  "packages/shared/dist/yolo/change-evidence.js",
70
70
  "packages/shared/dist/invocation/",
71
+ "packages/shared/dist/compatibility/index.js",
71
72
  "packages/shared/dist/planning/diagnosis-state.js",
72
73
  "packages/shared/dist/merge-readiness/c12-remote-observation.js",
73
74
  "packages/shared/dist/merge-readiness/c12-registry-projection.js",
@@ -78,6 +79,13 @@
78
79
  "packages/shared/dist/generated/invocation-schema.generated.js",
79
80
  "packages/shared/dist/generated/public-projections.generated.js",
80
81
  "packages/shared/dist/executable-graph-catalog/contracts.js",
82
+ "packages/shared/dist/architecture-public-topology.js",
83
+ "packages/shared/dist/architecture-non-ui-scope.js",
84
+ "packages/shared/dist/project-memory-targets.js",
85
+ "packages/shared/dist/project-validation-commands.js",
86
+ "packages/shared/dist/private-yolo-predecessor-decision.js",
87
+ "packages/shared/dist/private-qa-structural-admission.js",
88
+ "packages/shared/dist/yoloop/root-memory-effect.js",
81
89
  "packages/shared/dist/yoloop/branch-unit.js",
82
90
  "packages/shared/dist/yoloop/root-memory-effect.js",
83
91
  "packages/shared/dist/project-memory-targets.js",
@@ -88,6 +96,7 @@
88
96
  "packages/shared/dist/yoloop/planning-graph.js",
89
97
  "packages/shared/dist/yoloop/public-story-write-set.js",
90
98
  "packages/shared/dist/yoloop/recovery-types.js",
99
+ "packages/shared/dist/yoloop/release-blocked.js",
91
100
  "!packages/client/dist/**/*.js.map",
92
101
  "!packages/client/dist/**/*.d.ts.map",
93
102
  "targets-stubs/",
@@ -113,6 +122,7 @@
113
122
  "sync": "node sync-version.js",
114
123
  "validate": "node scripts/validate-pre-publish.js",
115
124
  "validate:pre-publish": "node scripts/validate-pre-publish.js",
125
+ "validate:p223": "node scripts/validate-p223-closure.mjs",
116
126
  "validate:client-artifacts": "node scripts/validate-client-artifacts.mjs",
117
127
  "validate:bash": "bash scripts/validate-pre-publish.sh",
118
128
  "admin:dev": "cd admin && npm run dev",
@@ -156,9 +166,9 @@
156
166
  },
157
167
  "dependencies": {
158
168
  "@babel/parser": "^7.29.7",
159
- "@clack/prompts": "0.11.0",
169
+ "@clack/prompts": "^1.0.1",
160
170
  "@hono/node-server": "1.19.17",
161
- "@modelcontextprotocol/sdk": "1.32.1",
171
+ "@modelcontextprotocol/sdk": "^1.32.2",
162
172
  "axe-core": "^4.14.0",
163
173
  "execa": "^9.6.1",
164
174
  "express": "5.2.1",
@@ -166,16 +176,16 @@
166
176
  "picocolors": "^1.1.1",
167
177
  "playwright-core": "1.55.0",
168
178
  "yaml": "^2.8.3",
169
- "zod": "^4.3.6"
179
+ "zod": "^4.6.7"
170
180
  },
171
181
  "optionalDependencies": {
172
- "better-sqlite3": "11.10.0"
182
+ "better-sqlite3": "^12.11.1"
173
183
  },
174
184
  "overrides": {
175
185
  "qs": "6.16.0"
176
186
  },
177
187
  "devDependencies": {
178
- "@cyclonedx/cyclonedx-npm": "^2.0.0",
188
+ "@cyclonedx/cyclonedx-npm": "^6.0.1",
179
189
  "@remotion/cli": "4.0.499",
180
190
  "@storybook/addon-a11y": "^10.4.6",
181
191
  "@storybook/addon-docs": "^10.4.6",
@@ -29,6 +29,7 @@ Commands:
29
29
  architecture-answers Save explicit Pact decisions in the local private store
30
30
  config Inspect or change managed subagent approval mode
31
31
  cache-status Show cache and circuit breaker status
32
+ doctor Read-only compatibility and release diagnostics
32
33
  update Update to latest version (use 'neocortex update' instead)
33
34
 
34
35
  Options:
@@ -84,6 +85,15 @@ Config Options:
84
85
  --platform-target <id> Explicit host override (default: runtime detection)
85
86
  --json Emit public-safe JSON evidence
86
87
 
88
+ Doctor Options:
89
+ --offline Inspect local identity; remote evidence remains unknown
90
+ --json Emit bounded public-safe JSON
91
+ --project-root <path> Local-only context root (default: cwd; path is never sent)
92
+ --server-url <url> Read-only compatibility endpoint override
93
+ --require <dimension> Block unless implementation, beta, release, or production is true
94
+ Exit 0: healthy or observationally degraded; exit 1: incompatible/malformed/required blocker;
95
+ exit 2: invalid usage. Doctor never repairs, updates, deploys, logs in, or rewrites state.
96
+
87
97
  Activate Options:
88
98
  <license-key> License key (e.g., NX-PRO-ABC-123)
89
99
  --server-url <url> Server URL override
@@ -102,6 +112,9 @@ Examples:
102
112
  neocortex-client invoke --args-file ./synthetic.story.md
103
113
  neocortex-client activate NX-PRO-ABC-123
104
114
  neocortex-client cache-status
115
+ neocortex-client doctor --json
116
+ neocortex-client doctor --offline
117
+ neocortex-client doctor --require release
105
118
  neocortex-client config status
106
119
  neocortex-client config standard --platform-target claude-code
107
120
  neocortex-client story-checkpoint setup --story P174.03.913359 --format json
@@ -201,5 +214,5 @@ Invocation payload boundary:
201
214
 
202
215
  License:
203
216
  Licensed under BSL-1.1 (Business Source License 1.1)
204
- `.trim(),m=new Set(["pm","install","postinstall","preinstall","prepublish","postpublish","preuninstall","postuninstall","preprepare","prepare","postprepare"]);async function d(){const s=process.argv.slice(2),n=s[0];n&&m.has(n.toLowerCase())&&process.exit(0),(!n||n==="--help"||n==="-h")&&(console.log(l),process.exit(0)),(n==="--version"||n==="-v")&&(console.log(p()),process.stderr.write(`Licensed under BSL-1.1 (Business Source License 1.1)
205
- `),process.exit(0));const o=s.slice(1);switch(n){case"invoke":{const{invokeCliHandler:e,flushInvokeCliOutput:t}=await import("./commands/invoke.js"),r=await e(o),i=await t();process.exit(i?r:1);break}case"activate":{const{activate:e}=await import("./commands/activate.js");let t,r,i=!1;for(let a=0;a<o.length;a++){const c=o[a];c==="--server-url"?r=o[++a]:c==="--non-interactive"?i=!0:c==="--help"||c==="-h"?(console.log(l),process.exit(0)):c.startsWith("-")||(t=c)}t||(console.error("Error: License key is required."),console.error("Usage: neocortex-client activate <license-key>"),console.error("Example: neocortex-client activate NX-PRO-ABC-123"),process.exit(1));try{const a=await e({licenseKey:t,serverUrl:r,nonInteractive:i});a.success?(console.log(a.message),process.exit(0)):(console.error(a.message),process.exit(1))}catch(a){const c=a instanceof Error?a.message:String(a);console.error(`Activation failed: ${c}`),process.exit(1)}break}case"cache-status":{console.log("Cache status requires an active client session."),console.log("Use this command within a running Neocortex client context."),process.exit(0);break}case"config":{const{configCliHandler:e}=await import("./commands/config.js"),t=await e(o);process.exit(t);break}case"refresh-memory":{const{refreshMemoryCliHandler:e}=await import("./commands/refresh-memory.js"),t=await e(o);process.exit(t);break}case"architecture-memory":{const{architectureMemoryTerminalCliHandler:e}=await import("./commands/architecture-memory-terminal.js"),t=await e(o);process.exit(t);break}case"planning-diagnosis":{const{planningDiagnosisCliHandler:e}=await import("./commands/planning-diagnosis.js"),t=await e(o);process.exit(t);break}case"planning-research":{const{planningResearchCliHandler:e}=await import("./commands/planning-research.js"),t=await e(o);process.exit(t);break}case"private-session":{const{privateSessionCliHandler:e}=await import("./commands/private-session.js"),t=await e(o);process.exit(t);break}case"planning-memory":{const{planningMemoryCliHandler:e}=await import("./commands/planning-memory.js"),t=await e(o);process.exit(t);break}case"planning-generation":{const{planningGenerationCliHandler:e}=await import("./commands/planning-generation.js"),t=await e(o);process.exit(t);break}case"story-checkpoint":{const{storyCheckpointCliHandler:e}=await import("./commands/story-checkpoint.js"),t=await e(o);process.exit(t);break}case"legacy-story-branch":{const{legacyStoryBranchCliHandler:e}=await import("./commands/legacy-story-branch.js"),t=await e(o);process.exit(t);break}case"legacy-story-pr":{const{legacyStoryPrCliHandler:e}=await import("./commands/legacy-story-pr.js"),t=await e(o);process.exit(t);break}case"legacy-epic-terminal":{const{legacyEpicTerminalCliHandler:e}=await import("./commands/legacy-epic-terminal.js"),t=await e(o);process.exit(t);break}case"mutation-qa":{const{mutationQaCliHandler:e}=await import("./commands/mutation-qa.js"),t=await e(o);process.exit(t);break}case"property-qa":{const{propertyQaCliHandler:e}=await import("./commands/property-qa.js"),t=await e(o);process.exit(t);break}case"qa-synthetic-backend":{const{syntheticBackendCliHandler:e}=await import("./commands/qa-synthetic-backend.js");process.exitCode=await e(s.slice(1));break}case"qa-scan-review":{const{qaScanReviewCliHandler:e}=await import("./commands/qa-scan-review.js"),t=await e(o);process.exit(t);break}case"qa-root":{const{qaControlCliHandler:e}=await import("./commands/qa-control.js");process.exit(await e(o));break}case"refactor-root":{if(o[0]==="control"){const{refactorControlCliHandler:r}=await import("./commands/refactor-control.js");process.exit(await r(o))}if(o[0]==="characterize"){const{refactorCharacterizationCliHandler:r}=await import("./commands/refactor-characterization.js");process.exit(r(o))}if(o[0]==="review-accept"||o[0]==="review-status"){const{refactorReviewCliHandler:r}=await import("./commands/refactor-review.js");process.exit(await r(o))}if(o[0]?.startsWith("commit-")){const{refactorCommitCliHandler:r}=await import("./commands/refactor-commit.js");process.exit(r(o))}const{refactorRootCliHandler:e}=await import("./commands/refactor-root.js"),t=e(o);process.exit(t);break}case"native-agent":{const{nativeAgentCliHandler:e}=await import("./commands/native-agent.js"),t=await e(o);process.exit(t);break}case"architecture-answers":{const{architectureAnswersCliHandler:e}=await import("./commands/architecture-answers.js"),t=await e(o);process.exit(t);break}case"update":{console.log("To update Neocortex, run:"),console.log(" neocortex update"),console.log(""),console.log("Or manually:"),console.log(" npm install -g @ornexus/neocortex@latest"),process.exit(0);break}default:console.error(`Unknown command: ${n}`),console.error('Run "neocortex-client --help" for usage information.'),process.exit(1)}}d().catch(s=>{console.error(`Fatal error: ${s instanceof Error?s.message:String(s)}`),process.exit(1)});
217
+ `.trim(),d=new Set(["pm","install","postinstall","preinstall","prepublish","postpublish","preuninstall","postuninstall","preprepare","prepare","postprepare"]);async function m(){const c=process.argv.slice(2),n=c[0];n&&d.has(n.toLowerCase())&&process.exit(0),(!n||n==="--help"||n==="-h")&&(console.log(l),process.exit(0)),(n==="--version"||n==="-v")&&(console.log(p()),process.stderr.write(`Licensed under BSL-1.1 (Business Source License 1.1)
218
+ `),process.exit(0));const o=c.slice(1);switch(n){case"invoke":{const{invokeCliHandler:e,flushInvokeCliOutput:t}=await import("./commands/invoke.js"),r=await e(o),s=await t();process.exitCode=s?r:1;break}case"activate":{const{activate:e}=await import("./commands/activate.js");let t,r,s=!1;for(let a=0;a<o.length;a++){const i=o[a];i==="--server-url"?r=o[++a]:i==="--non-interactive"?s=!0:i==="--help"||i==="-h"?(console.log(l),process.exit(0)):i.startsWith("-")||(t=i)}t||(console.error("Error: License key is required."),console.error("Usage: neocortex-client activate <license-key>"),console.error("Example: neocortex-client activate NX-PRO-ABC-123"),process.exit(1));try{const a=await e({licenseKey:t,serverUrl:r,nonInteractive:s});a.success?(console.log(a.message),process.exit(0)):(console.error(a.message),process.exit(1))}catch(a){const i=a instanceof Error?a.message:String(a);console.error(`Activation failed: ${i}`),process.exit(1)}break}case"cache-status":{console.log("Cache status requires an active client session."),console.log("Use this command within a running Neocortex client context."),process.exit(0);break}case"doctor":{const{doctorCliHandler:e}=await import("./commands/doctor.js"),t=await e(o);process.exit(t);break}case"config":{const{configCliHandler:e}=await import("./commands/config.js"),t=await e(o);process.exit(t);break}case"refresh-memory":{const{refreshMemoryCliHandler:e}=await import("./commands/refresh-memory.js"),t=await e(o);process.exit(t);break}case"architecture-memory":{const{architectureMemoryTerminalCliHandler:e}=await import("./commands/architecture-memory-terminal.js"),t=await e(o);process.exit(t);break}case"planning-diagnosis":{const{planningDiagnosisCliHandler:e}=await import("./commands/planning-diagnosis.js"),t=await e(o);process.exit(t);break}case"planning-research":{const{planningResearchCliHandler:e}=await import("./commands/planning-research.js"),t=await e(o);process.exit(t);break}case"private-session":{const{privateSessionCliHandler:e}=await import("./commands/private-session.js"),t=await e(o);process.exit(t);break}case"planning-memory":{const{planningMemoryCliHandler:e}=await import("./commands/planning-memory.js"),t=await e(o);process.exit(t);break}case"planning-generation":{const{planningGenerationCliHandler:e}=await import("./commands/planning-generation.js"),t=await e(o);process.exit(t);break}case"story-checkpoint":{const{storyCheckpointCliHandler:e}=await import("./commands/story-checkpoint.js"),t=await e(o);process.exit(t);break}case"legacy-story-branch":{const{legacyStoryBranchCliHandler:e}=await import("./commands/legacy-story-branch.js"),t=await e(o);process.exit(t);break}case"legacy-story-pr":{const{legacyStoryPrCliHandler:e}=await import("./commands/legacy-story-pr.js"),t=await e(o);process.exit(t);break}case"legacy-epic-terminal":{const{legacyEpicTerminalCliHandler:e}=await import("./commands/legacy-epic-terminal.js"),t=await e(o);process.exit(t);break}case"mutation-qa":{const{mutationQaCliHandler:e}=await import("./commands/mutation-qa.js"),t=await e(o);process.exit(t);break}case"property-qa":{const{propertyQaCliHandler:e}=await import("./commands/property-qa.js"),t=await e(o);process.exit(t);break}case"qa-synthetic-backend":{const{syntheticBackendCliHandler:e}=await import("./commands/qa-synthetic-backend.js");process.exitCode=await e(c.slice(1));break}case"qa-scan-review":{const{qaScanReviewCliHandler:e}=await import("./commands/qa-scan-review.js"),t=await e(o);process.exit(t);break}case"qa-root":{const{qaControlCliHandler:e}=await import("./commands/qa-control.js");process.exit(await e(o));break}case"refactor-root":{if(o[0]==="control"){const{refactorControlCliHandler:r}=await import("./commands/refactor-control.js");process.exit(await r(o))}if(o[0]==="characterize"){const{refactorCharacterizationCliHandler:r}=await import("./commands/refactor-characterization.js");process.exit(r(o))}if(o[0]==="review-accept"||o[0]==="review-status"){const{refactorReviewCliHandler:r}=await import("./commands/refactor-review.js");process.exit(await r(o))}if(o[0]?.startsWith("commit-")){const{refactorCommitCliHandler:r}=await import("./commands/refactor-commit.js");process.exit(r(o))}const{refactorRootCliHandler:e}=await import("./commands/refactor-root.js"),t=e(o);process.exit(t);break}case"native-agent":{const{nativeAgentCliHandler:e}=await import("./commands/native-agent.js"),t=await e(o);process.exit(t);break}case"architecture-answers":{const{architectureAnswersCliHandler:e}=await import("./commands/architecture-answers.js"),t=await e(o);process.exit(t);break}case"update":{console.log("To update Neocortex, run:"),console.log(" neocortex update"),console.log(""),console.log("Or manually:"),console.log(" npm install -g @ornexus/neocortex@latest"),process.exit(0);break}default:console.error(`Unknown command: ${n}`),console.error('Run "neocortex-client --help" for usage information.'),process.exit(1)}}m().catch(c=>{console.error(`Fatal error: ${c instanceof Error?c.message:String(c)}`),process.exit(1)});
@@ -1 +1 @@
1
- import{createHash as f}from"node:crypto";import{execFileSync as u}from"node:child_process";import{lstatSync as w,realpathSync as n}from"node:fs";import{join as i,resolve as p}from"node:path";const g=/^P[1-9][0-9]{0,11}$/,v=/^[a-f0-9]{40,64}$/;function x(s){return s.match(/^\s*\*?arch-plan\s+"[^"\n]{1,4096}"\s+@docs\/epics\/epic-(P[1-9][0-9]{0,11})\.md\s*$/)?.[1]}function P(s,r){if(!g.test(r))throw new Error("architecture-root-epic-binding-invalid");const t=p(s),e=`docs/epics/epic-${r}.md`,a=i(t,e);try{if(n(t)!==t)throw new Error("architecture-root-epic-binding-invalid");if(n(i(t,"docs"))!==i(t,"docs")||n(i(t,"docs","epics"))!==i(t,"docs","epics")||n(a)!==a)throw new Error("architecture-root-epic-binding-invalid");const h=w(a);if(!h.isFile()||h.isSymbolicLink()||h.size>256*1024)throw new Error("architecture-root-epic-binding-invalid");const o=l=>u("git",[...l],{cwd:t,encoding:"utf8",stdio:["ignore","pipe","ignore"],maxBuffer:1024*1024}).trim();if(p(o(["rev-parse","--show-toplevel"]))!==t)throw new Error("architecture-root-epic-binding-invalid");const c=o(["rev-parse","--verify",`HEAD:${e}`]),d=o(["hash-object","--",e]),m=o(["ls-files","--stage","--",e]).match(/^100644 ([a-f0-9]{40,64}) 0\t/);if(!v.test(c)||d!==c||m?.[1]!==c)throw new Error("architecture-root-epic-binding-invalid");return f("sha256").update(`architecture-committed-epic-v1\0${r}\0${c}`).digest("hex")}catch{throw new Error("architecture-root-epic-binding-invalid")}}export{P as deriveCommittedArchitectureEpicGraphRevision,x as explicitArchitectureEpicTarget};
1
+ import{createHash as f}from"node:crypto";import{execFileSync as g}from"node:child_process";import{lstatSync as u,realpathSync as n}from"node:fs";import{join as t,resolve as d}from"node:path";import{resolveClientPreFlightTrigger as v}from"../tier/tier-aware-client.js";const w=/^P[1-9][0-9]{0,11}$/,E=/^[a-f0-9]{40,64}$/;function S(s){const r=s.match(/^\s*(\*?[^\s]+)[ \t]+"[^"\n]{1,4096}"[ \t]+@docs\/epics\/epic-(P[1-9][0-9]{0,11})\.md\s*$/);return r&&v(r[1])==="arch-plan"?r[2]:void 0}function A(s,r){if(!w.test(r))throw new Error("architecture-root-epic-binding-invalid");const i=d(s),e=`docs/epics/epic-${r}.md`,a=t(i,e);try{if(n(i)!==i)throw new Error("architecture-root-epic-binding-invalid");if(n(t(i,"docs"))!==t(i,"docs")||n(t(i,"docs","epics"))!==t(i,"docs","epics")||n(a)!==a)throw new Error("architecture-root-epic-binding-invalid");const h=u(a);if(!h.isFile()||h.isSymbolicLink()||h.size>256*1024)throw new Error("architecture-root-epic-binding-invalid");const o=l=>g("git",[...l],{cwd:i,encoding:"utf8",stdio:["ignore","pipe","ignore"],maxBuffer:1024*1024}).trim();if(d(o(["rev-parse","--show-toplevel"]))!==i)throw new Error("architecture-root-epic-binding-invalid");const c=o(["rev-parse","--verify",`HEAD:${e}`]),p=o(["hash-object","--",e]),m=o(["ls-files","--stage","--",e]).match(/^100644 ([a-f0-9]{40,64}) 0\t/);if(!E.test(c)||p!==c||m?.[1]!==c)throw new Error("architecture-root-epic-binding-invalid");return f("sha256").update(`architecture-committed-epic-v1\0${r}\0${c}`).digest("hex")}catch{throw new Error("architecture-root-epic-binding-invalid")}}export{A as deriveCommittedArchitectureEpicGraphRevision,S as explicitArchitectureEpicTarget};
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Read-only compatibility and release doctor (P223.02).
3
+ *
4
+ * The release contract is owned by P223.01. This command intentionally loads
5
+ * that authority through a narrow adapter instead of copying its validator.
6
+ * The dynamic boundary keeps this dependent story buildable while P223.01 is
7
+ * integrated in parallel.
8
+ */
9
+ export declare const DOCTOR_SCHEMA_VERSION: "CompatibilityReleaseDoctor/1.0";
10
+ export declare const DOCTOR_RESPONSE_SCHEMA_VERSION: "CompatibilityDoctorResponse/1.0";
11
+ export declare const DOCTOR_EXIT_CODES: Readonly<{
12
+ readonly SUCCESS: 0;
13
+ readonly BLOCKED: 1;
14
+ readonly USAGE: 2;
15
+ }>;
16
+ export declare const DOCTOR_REASON_CODES: Readonly<{
17
+ readonly HEALTHY: "doctor-healthy";
18
+ readonly OFFLINE: "doctor-offline";
19
+ readonly SERVER_UNREACHABLE: "server-unreachable";
20
+ readonly CLIENT_TOO_OLD: "client-too-old";
21
+ readonly SERVER_TOO_OLD: "server-too-old";
22
+ readonly PROTOCOL_MISMATCH: "protocol-mismatch";
23
+ readonly SCHEMA_MISMATCH: "schema-mismatch";
24
+ readonly CAPABILITY_MISMATCH: "capability-mismatch";
25
+ readonly REGISTRY_DRIFT: "registry-drift";
26
+ readonly MALFORMED_RESPONSE: "malformed-response";
27
+ readonly AUTHORITY_UNAVAILABLE: "compatibility-authority-unavailable";
28
+ readonly RELEASE_LIFECYCLE_UNAVAILABLE: "release-lifecycle-unavailable";
29
+ readonly REQUIRED_DIMENSION_BLOCKED: "required-release-dimension-blocked";
30
+ }>;
31
+ export type DoctorMode = 'online' | 'offline';
32
+ export type DoctorOverallStatus = 'healthy' | 'degraded' | 'incompatible';
33
+ export type DoctorCompatibilityStatus = 'compatible' | 'degraded' | 'incompatible' | 'unknown';
34
+ export type DoctorSeverity = 'error' | 'warning' | 'info';
35
+ export type ReleaseTruth = true | false | 'unknown';
36
+ export type ReleaseFreshness = 'fresh' | 'stale' | 'unknown';
37
+ export type ReleaseDimensionName = 'implementationComplete' | 'betaOperable' | 'releaseReady' | 'productionPromoted';
38
+ export type DoctorAffectedDimension = ReleaseDimensionName | 'compatibility' | 'releaseLifecycle';
39
+ export interface DoctorFinding {
40
+ readonly severity: DoctorSeverity;
41
+ readonly reasonCode: string;
42
+ readonly affectedDimension: DoctorAffectedDimension;
43
+ readonly evidenceRef: string | null;
44
+ readonly remediation: string;
45
+ }
46
+ export interface DoctorReleaseDimension {
47
+ readonly value: ReleaseTruth;
48
+ readonly freshness: ReleaseFreshness;
49
+ readonly reasonCodes: readonly string[];
50
+ readonly evidenceRefs: readonly string[];
51
+ }
52
+ export interface DoctorReport {
53
+ readonly schemaVersion: typeof DOCTOR_SCHEMA_VERSION;
54
+ readonly publicSafe: true;
55
+ readonly readOnly: true;
56
+ readonly mode: DoctorMode;
57
+ readonly overall: DoctorOverallStatus;
58
+ readonly exitCode: 0 | 1;
59
+ readonly compatibility: {
60
+ readonly status: DoctorCompatibilityStatus;
61
+ readonly clientVersion: string;
62
+ readonly serverVersion: string | null;
63
+ readonly protocolVersion: string | null;
64
+ readonly schemaVersions: readonly string[];
65
+ readonly capabilityIds: readonly string[];
66
+ readonly registry: {
67
+ readonly localVersion: string;
68
+ readonly localChecksum: string;
69
+ readonly remoteVersion: string | null;
70
+ readonly remoteChecksum: string | null;
71
+ readonly status: 'matched' | 'mismatched' | 'unknown';
72
+ };
73
+ };
74
+ readonly release: {
75
+ readonly candidateId: string | null;
76
+ readonly lineageSha256: string | null;
77
+ readonly requiredDimension: ReleaseDimensionName | null;
78
+ readonly dimensions: Readonly<Record<ReleaseDimensionName, DoctorReleaseDimension>>;
79
+ };
80
+ readonly findings: readonly DoctorFinding[];
81
+ }
82
+ interface CompatibilityAuthority {
83
+ readonly createCompatibilityOffer: (input: {
84
+ readonly clientVersion: string;
85
+ readonly registryVersion: string;
86
+ readonly registryChecksum: string;
87
+ }) => unknown;
88
+ readonly isCompatibilityResultV1: (value: unknown) => boolean;
89
+ readonly validateReleaseLifecycle: (value: unknown) => {
90
+ readonly accepted: boolean;
91
+ readonly reasonCodes: readonly string[];
92
+ readonly projection?: unknown;
93
+ };
94
+ readonly createReleaseLifecycleContext?: (input: {
95
+ readonly projectId: string;
96
+ readonly candidateId: string;
97
+ readonly lineageSha256: string;
98
+ }) => unknown;
99
+ }
100
+ interface DoctorFetchResponse {
101
+ readonly ok: boolean;
102
+ readonly status: number;
103
+ text(): Promise<string>;
104
+ }
105
+ type DoctorFetch = (url: string, init: RequestInit) => Promise<DoctorFetchResponse>;
106
+ export interface DoctorDependencies {
107
+ readonly fetch?: DoctorFetch;
108
+ readonly loadCompatibilityAuthority?: () => Promise<CompatibilityAuthority | null>;
109
+ readonly getClientVersion?: () => string;
110
+ readonly collectReleaseContext?: (projectRoot: string, authority: CompatibilityAuthority) => unknown | null;
111
+ readonly env?: Readonly<Record<string, string | undefined>>;
112
+ readonly stdout?: (message: string) => void;
113
+ readonly stderr?: (message: string) => void;
114
+ }
115
+ interface ParsedDoctorArgs {
116
+ readonly mode: DoctorMode;
117
+ readonly json: boolean;
118
+ readonly serverUrl: string;
119
+ readonly requiredDimension: ReleaseDimensionName | null;
120
+ /** Local-only selection root. It is never serialized or rendered. */
121
+ readonly projectRoot: string;
122
+ }
123
+ export declare function parseDoctorArgs(args: readonly string[], env?: Readonly<Record<string, string | undefined>>): ParsedDoctorArgs;
124
+ /** P223.01 integration seam. No fallback validator is maintained here. */
125
+ export declare function loadSharedCompatibilityAuthority(): Promise<CompatibilityAuthority | null>;
126
+ /**
127
+ * Resolve the current project to an opaque selector without repairing or
128
+ * writing state. Git output is consumed locally and only domain-separated
129
+ * hashes plus the already-public project ID cross the network boundary.
130
+ */
131
+ export declare function collectLocalReleaseLifecycleContext(projectRoot: string, authority: CompatibilityAuthority): unknown | null;
132
+ export declare function runDoctor(options: ParsedDoctorArgs, dependencies?: DoctorDependencies): Promise<DoctorReport>;
133
+ export declare function renderDoctorReport(report: DoctorReport): string;
134
+ export declare function doctorCliHandler(args: readonly string[], dependencies?: DoctorDependencies): Promise<number>;
135
+ export {};
@@ -0,0 +1,2 @@
1
+ import{Buffer as L}from"node:buffer";import{createHash as M}from"node:crypto";import{execFileSync as B}from"node:child_process";import{readFileSync as P,statSync as Y}from"node:fs";import{join as G,resolve as J}from"node:path";import{COMMAND_REGISTRY_CHECKSUM as A,COMMAND_REGISTRY_VERSION as C}from"../generated/command-registry.generated.js";import{DEFAULT_SERVER_URL as z}from"../constants.js";import{getClientVersion as Z}from"../version.js";const K="CompatibilityReleaseDoctor/1.0",X="CompatibilityDoctorResponse/1.0",I=Object.freeze({SUCCESS:0,BLOCKED:1,USAGE:2}),n=Object.freeze({HEALTHY:"doctor-healthy",OFFLINE:"doctor-offline",SERVER_UNREACHABLE:"server-unreachable",CLIENT_TOO_OLD:"client-too-old",SERVER_TOO_OLD:"server-too-old",PROTOCOL_MISMATCH:"protocol-mismatch",SCHEMA_MISMATCH:"schema-mismatch",CAPABILITY_MISMATCH:"capability-mismatch",REGISTRY_DRIFT:"registry-drift",MALFORMED_RESPONSE:"malformed-response",AUTHORITY_UNAVAILABLE:"compatibility-authority-unavailable",RELEASE_LIFECYCLE_UNAVAILABLE:"release-lifecycle-unavailable",REQUIRED_DIMENSION_BLOCKED:"required-release-dimension-blocked"}),v=Object.freeze(["implementationComplete","betaOperable","releaseReady","productionPromoted"]),Q=64*1024,W=32,ee=5e3,k=/^[a-z][a-z0-9-]{0,63}$/u,D=/^[A-Za-z0-9][A-Za-z0-9._/-]{0,79}$/u,g=/^\d{1,6}\.\d{1,6}\.\d{1,6}(?:[-+][A-Za-z0-9.-]{1,40})?$/u,re=/^[A-Za-z0-9][A-Za-z0-9._-]{0,31}$/u,U=/^[a-f0-9]{64}$/u,te=/^[A-Za-z0-9][A-Za-z0-9_-]{15,127}$/u,ie=/^[a-f0-9]{40}(?:[a-f0-9]{24})?$/u,oe=/^(?:local-gate|beta-receipt|release-gate|promotion-receipt|sha256):[a-f0-9]{64}$/u,l=Object.freeze({healthy:"No compatibility remediation is required.",offline:"Rerun without --offline when read-only server evidence is available.",unreachable:"Check read-only server reachability, then rerun doctor.",clientTooOld:"Run a separately authorized client update, then rerun doctor.",serverTooOld:"Ask an authorized server operator to update the server, then rerun doctor.",protocol:"Align client and server protocol releases before invoking protected operations.",schema:"Use a client and server pair that supports the required public schemas.",capability:"Enable no feature here; use a release pair with the required capability set.",registry:"Install an exact release pair with the same command-registry checksum.",malformed:"Contact support with the reason code only; do not attach raw response data.",authority:"Integrate the P223.01 shared compatibility authority, then rerun doctor.",lifecycle:"Obtain bounded physical release evidence through separately authorized operations.",required:"Satisfy and verify the required physical release dimension through a separately authorized operation."}),F=new Map([[n.MALFORMED_RESPONSE,0],[n.AUTHORITY_UNAVAILABLE,1],[n.CLIENT_TOO_OLD,2],[n.SERVER_TOO_OLD,3],[n.PROTOCOL_MISMATCH,4],[n.SCHEMA_MISMATCH,5],[n.CAPABILITY_MISMATCH,6],[n.REGISTRY_DRIFT,7],[n.SERVER_UNREACHABLE,8],[n.OFFLINE,9],[n.RELEASE_LIFECYCLE_UNAVAILABLE,10],[n.REQUIRED_DIMENSION_BLOCKED,11],[n.HEALTHY,100]]);function q(e="release-evidence-unavailable"){const r=()=>Object.freeze({value:"unknown",freshness:"unknown",reasonCodes:Object.freeze([e]),evidenceRefs:Object.freeze([])});return Object.freeze({implementationComplete:r(),betaOperable:r(),releaseReady:r(),productionPromoted:r()})}function ne(e){const r=Object.freeze({implementation:"implementationComplete","implementation-complete":"implementationComplete",beta:"betaOperable","beta-operable":"betaOperable",release:"releaseReady","release-ready":"releaseReady",production:"productionPromoted","production-promoted":"productionPromoted"});return e?r[e]??null:null}function se(e,r=process.env){let t="online",i=!1,o=r.NEOCORTEX_SERVER_URL??z,c=!1,f=null,u=process.cwd();for(let a=0;a<e.length;a+=1){const s=e[a];if(s==="--offline")t="offline";else if(s==="--json")i=!0;else if(s==="--server-url"){const p=e[a+1];if(!p)throw new Error("doctor-server-url-required");o=p,c=!0,a+=1}else if(s==="--require"){const p=e[a+1],m=ne(p);if(!p||!m)throw new Error("doctor-required-dimension-invalid");f=m,a+=1}else if(s==="--project-root"){const p=e[a+1];if(!p||p.length>4096||p.includes("\0"))throw new Error("doctor-project-root-invalid");u=J(p),a+=1}else throw new Error("doctor-argument-invalid")}if(t==="offline"&&c)throw new Error("doctor-offline-server-url-conflict");if(t==="offline")return Object.freeze({mode:t,json:i,serverUrl:z,requiredDimension:f,projectRoot:u});if(o.length>2048)throw new Error("doctor-server-url-invalid");try{const a=new URL(o);if(a.protocol!=="http:"&&a.protocol!=="https:"||a.username||a.password||a.search||a.hash)throw new Error("url")}catch{throw new Error("doctor-server-url-invalid")}return Object.freeze({mode:t,json:i,serverUrl:o.replace(/\/+$/u,""),requiredDimension:f,projectRoot:u})}function ae(e){if(!e||typeof e!="object")return!1;const r=e;return typeof r.createCompatibilityOffer=="function"&&typeof r.isCompatibilityResultV1=="function"&&typeof r.validateReleaseLifecycle=="function"}async function ce(){const e=["@neocortex/shared/compatibility","../../../shared/dist/compatibility/index.js"];for(const r of e)try{const t=await import(r);if(ae(t))return t}catch{}return null}function le(e,r){if(typeof r.createReleaseLifecycleContext!="function")return null;try{const t=G(e,".neocortex","state.json"),i=Y(t);if(!i.isFile()||i.size<=0||i.size>1024*1024)return null;const o=JSON.parse(P(t,"utf8")),f=(o.config&&typeof o.config=="object"&&!Array.isArray(o.config)?o.config:o.project&&typeof o.project=="object"&&!Array.isArray(o.project)?o.project:null)?.project_id;if(typeof f!="string"||!te.test(f))return null;const u=B("git",["rev-parse","--verify","HEAD"],{cwd:e,encoding:"utf8",timeout:2e3,maxBuffer:1024,stdio:["ignore","pipe","ignore"]}).trim().toLowerCase();if(!ie.test(u))return null;const a=M("sha256").update("git-lineage-v1\0").update(u).digest("hex"),s=`candidate-${M("sha256").update("release-candidate-v1\0").update(f).update("\0").update(u).digest("hex").slice(0,32)}`;return r.createReleaseLifecycleContext({projectId:f,candidateId:s,lineageSha256:a})}catch{return null}}function d(e,r,t,i,o=null){return Object.freeze({severity:e,reasonCode:r,affectedDimension:t,evidenceRef:o,remediation:i})}function de(e,r){if(!g.test(e)||!g.test(r))return null;const t=c=>c.split(/[-+]/u,1)[0].split(".").map(Number),i=t(e),o=t(r);for(let c=0;c<3;c+=1)if(i[c]!==o[c])return i[c]<o[c]?-1:1;return 0}function S(e){return Object.freeze([...new Set(e.filter(r=>k.test(r)))].slice(0,8).sort())}function x(e){return Object.freeze([...new Set(e.filter(r=>D.test(r)))].slice(0,32).sort())}function H(e){return Object.freeze([...new Set(e.filter(r=>oe.test(r)))].slice(0,8).sort())}function fe(e){if(!e||typeof e!="object"||Array.isArray(e))return null;const r=e,t=r.commandRegistry;return!["compatible","degraded","incompatible"].includes(String(r.status))||typeof r.clientVersion!="string"||!g.test(r.clientVersion)||typeof r.serverVersion!="string"||!g.test(r.serverVersion)||!(r.protocolVersion===null||typeof r.protocolVersion=="string"&&D.test(r.protocolVersion))||!Array.isArray(r.schemaVersions)||!r.schemaVersions.every(i=>typeof i=="string")||!Array.isArray(r.capabilityIds)||!r.capabilityIds.every(i=>typeof i=="string")||!Array.isArray(r.reasonCodes)||!r.reasonCodes.every(i=>typeof i=="string")||!t||typeof t.version!="string"||!re.test(t.version)||typeof t.checksum!="string"||!U.test(t.checksum)||!["matched","mismatched","unknown"].includes(String(t.status))?null:r}function ue(e){if(!e||typeof e!="object"||Array.isArray(e))return null;const r=e;if(typeof r.candidateId!="string"||!D.test(r.candidateId)||typeof r.lineageSha256!="string"||!U.test(r.lineageSha256))return null;for(const t of v){const i=r[t];if(!i||typeof i!="object"||Array.isArray(i))return null;const o=i;if(!(typeof o.value=="boolean"||o.value==="unknown")||!["fresh","stale","unknown"].includes(String(o.freshness))||!Array.isArray(o.reasonCodes)||!o.reasonCodes.every(c=>typeof c=="string")||!Array.isArray(o.evidenceRefs)||!o.evidenceRefs.every(c=>typeof c=="string"))return null}return r}function me(e){const r={error:0,warning:1,info:2},t=new Map([["compatibility",0],["releaseLifecycle",1],["implementationComplete",2],["betaOperable",3],["releaseReady",4],["productionPromoted",5]]);return Object.freeze([...e].sort((i,o)=>r[i.severity]-r[o.severity]||(F.get(i.reasonCode)??50)-(F.get(o.reasonCode)??50)||(t.get(i.affectedDimension)??99)-(t.get(o.affectedDimension)??99)||i.reasonCode.localeCompare(o.reasonCode)).slice(0,W))}function pe(e){return Object.freeze({status:"unknown",clientVersion:e,serverVersion:null,protocolVersion:null,schemaVersions:Object.freeze([]),capabilityIds:Object.freeze([]),registry:Object.freeze({localVersion:C,localChecksum:A,remoteVersion:null,remoteChecksum:null,status:"unknown"})})}function E(e){const r=[...e.findings],t=e.dimensions??q();let i=e.incompatible;e.requiredDimension&&t[e.requiredDimension].value!==!0&&(i=!0,r.push(d("error",n.REQUIRED_DIMENSION_BLOCKED,e.requiredDimension,l.required,t[e.requiredDimension].evidenceRefs[0]??null)));const o=me(r),c=i?"incompatible":o.some(f=>f.severity==="warning")?"degraded":"healthy";return Object.freeze({schemaVersion:K,publicSafe:!0,readOnly:!0,mode:e.mode,overall:c,exitCode:i?I.BLOCKED:I.SUCCESS,compatibility:e.compatibility??pe(e.clientVersion),release:Object.freeze({candidateId:e.candidateId??null,lineageSha256:e.lineageSha256??null,requiredDimension:e.requiredDimension,dimensions:t}),findings:o})}function ye(e){if(!e||typeof e!="object"||Array.isArray(e))return null;const r=e;return"compatibility"in r?r.schemaVersion!==void 0&&r.schemaVersion!==X?null:{compatibility:r.compatibility,...r.releaseLifecycle!==void 0?{releaseLifecycle:r.releaseLifecycle}:{}}:{compatibility:e}}async function Ee(e,r,t,i){const o=new AbortController,c=setTimeout(()=>o.abort(),ee);try{const f=L.from(JSON.stringify(t),"utf8").toString("base64url");if(f.length>8192)return{kind:"malformed"};const u=i===null?null:L.from(JSON.stringify(i),"utf8").toString("base64url");if(u&&u.length>2048)return{kind:"malformed"};const a=await e(`${r}/api/v1/compatibility`,{method:"GET",headers:Object.freeze({Accept:"application/json","Cache-Control":"no-store","X-Neocortex-Compatibility-Offer":f,...u?{"X-Neocortex-Release-Context":u}:{}}),signal:o.signal});if(a.status===404||a.status===405||a.status===426)return{kind:"server-too-old"};if(!a.ok)return a.status>=500?{kind:"unreachable"}:{kind:"malformed"};const s=await a.text();if(L.byteLength(s,"utf8")>Q)return{kind:"malformed"};try{return{kind:"ok",value:JSON.parse(s)}}catch{return{kind:"malformed"}}}catch{return{kind:"unreachable"}}finally{clearTimeout(c)}}function he(e,r){return E({mode:"offline",clientVersion:e,requiredDimension:r,incompatible:!1,findings:[d("warning",n.OFFLINE,"compatibility",l.offline),d("warning",n.RELEASE_LIFECYCLE_UNAVAILABLE,"releaseLifecycle",l.lifecycle)]})}async function be(e,r={}){const t=(r.getClientVersion??Z)();if(e.mode==="offline")return he(t,e.requiredDimension);const i=await(r.loadCompatibilityAuthority??ce)();if(!i)return E({mode:"online",clientVersion:t,requiredDimension:e.requiredDimension,incompatible:!0,findings:[d("error",n.AUTHORITY_UNAVAILABLE,"compatibility",l.authority)]});let o;try{o=i.createCompatibilityOffer({clientVersion:t,registryVersion:C,registryChecksum:A})}catch{return E({mode:"online",clientVersion:t,requiredDimension:e.requiredDimension,incompatible:!0,findings:[d("error",n.AUTHORITY_UNAVAILABLE,"compatibility",l.authority)]})}const c=(r.collectReleaseContext??le)(e.projectRoot,i),f=r.fetch??globalThis.fetch,u=await Ee(f,e.serverUrl,o,c);if(u.kind==="unreachable")return E({mode:"online",clientVersion:t,requiredDimension:e.requiredDimension,incompatible:!1,findings:[d("warning",n.SERVER_UNREACHABLE,"compatibility",l.unreachable),d("warning",n.RELEASE_LIFECYCLE_UNAVAILABLE,"releaseLifecycle",l.lifecycle)]});if(u.kind==="server-too-old")return E({mode:"online",clientVersion:t,requiredDimension:e.requiredDimension,incompatible:!0,findings:[d("error",n.SERVER_TOO_OLD,"compatibility",l.serverTooOld),d("warning",n.RELEASE_LIFECYCLE_UNAVAILABLE,"releaseLifecycle",l.lifecycle)]});if(u.kind==="malformed")return E({mode:"online",clientVersion:t,requiredDimension:e.requiredDimension,incompatible:!0,findings:[d("error",n.MALFORMED_RESPONSE,"compatibility",l.malformed)]});const a=ye(u.value);if(!a||!i.isCompatibilityResultV1(a.compatibility))return E({mode:"online",clientVersion:t,requiredDimension:e.requiredDimension,incompatible:!0,findings:[d("error",n.MALFORMED_RESPONSE,"compatibility",l.malformed)]});const s=fe(a.compatibility);if(!s||s.clientVersion!==t)return E({mode:"online",clientVersion:t,requiredDimension:e.requiredDimension,incompatible:!0,findings:[d("error",n.MALFORMED_RESPONSE,"compatibility",l.malformed)]});const p=Object.freeze({status:s.status,clientVersion:t,serverVersion:s.serverVersion,protocolVersion:s.protocolVersion,schemaVersions:x(s.schemaVersions),capabilityIds:x(s.capabilityIds),registry:Object.freeze({localVersion:C,localChecksum:A,remoteVersion:s.commandRegistry.version,remoteChecksum:s.commandRegistry.checksum,status:s.commandRegistry.status})}),m=[],b=S(s.reasonCodes),T=de(t,s.serverVersion);if(s.status==="incompatible"&&T===-1?m.push(d("error",n.CLIENT_TOO_OLD,"compatibility",l.clientTooOld,`client-version:${t}`)):s.status==="incompatible"&&T===1&&m.push(d("error",n.SERVER_TOO_OLD,"compatibility",l.serverTooOld,`server-version:${s.serverVersion}`)),b.some(y=>y.includes("protocol"))&&m.push(d("error",n.PROTOCOL_MISMATCH,"compatibility",l.protocol)),b.some(y=>y.includes("schema"))&&m.push(d("error",n.SCHEMA_MISMATCH,"compatibility",l.schema)),b.some(y=>y.includes("capability"))&&m.push(d("error",n.CAPABILITY_MISMATCH,"compatibility",l.capability)),(s.commandRegistry.status==="mismatched"||s.commandRegistry.version!==C||s.commandRegistry.checksum!==A)&&m.push(d("error",n.REGISTRY_DRIFT,"compatibility",l.registry,`sha256:${s.commandRegistry.checksum}`)),s.status==="incompatible"&&m.length===0)m.push(d("error",n.MALFORMED_RESPONSE,"compatibility",l.malformed));else if(s.status==="degraded")for(const y of b)m.push(d("warning",y,"compatibility",l.lifecycle));let V=q(),N=null,w=null,j=!1;if(a.releaseLifecycle===void 0)m.push(d("warning",n.RELEASE_LIFECYCLE_UNAVAILABLE,"releaseLifecycle",l.lifecycle));else{const y=i.validateReleaseLifecycle(a.releaseLifecycle),O=y.accepted?ue(y.projection):null;if(O){N=O.candidateId,w=O.lineageSha256;const R={};for(const _ of v){const h=O[_];if(R[_]=Object.freeze({value:h.value,freshness:h.freshness,reasonCodes:S(h.reasonCodes),evidenceRefs:H(h.evidenceRefs)}),h.value!==!0||h.freshness!=="fresh")for(const $ of S(h.reasonCodes))m.push(d("warning",$,_,l.lifecycle,H(h.evidenceRefs)[0]??null))}V=Object.freeze(R)}else{j=!0,m.push(d("error",n.MALFORMED_RESPONSE,"releaseLifecycle",l.malformed));for(const R of S(y.reasonCodes))m.push(d("error",R,"releaseLifecycle",l.lifecycle))}}return m.length===0&&m.push(d("info",n.HEALTHY,"compatibility",l.healthy)),E({mode:"online",clientVersion:t,compatibility:p,dimensions:V,candidateId:N,lineageSha256:w,requiredDimension:e.requiredDimension,findings:m,incompatible:s.status==="incompatible"||j})}function Oe(e){const r=["Neocortex compatibility and release doctor (read-only)",`Result: ${e.overall} (exit ${e.exitCode})`,`Mode: ${e.mode}`,`Compatibility: ${e.compatibility.status}`,`Client: ${e.compatibility.clientVersion}`,`Server: ${e.compatibility.serverVersion??"unknown"}`,`Registry: ${e.compatibility.registry.status}`,"","Release lifecycle:"];for(const t of v){const i=e.release.dimensions[t];r.push(` ${t}: ${String(i.value)} (${i.freshness}) [${i.reasonCodes.join(",")||"none"}]`)}r.push("","Ordered findings:");for(const t of e.findings)r.push(` ${t.severity.toUpperCase()} ${t.reasonCode} dimension=${t.affectedDimension} evidence=${t.evidenceRef??"none"}`),r.push(` ${t.remediation}`);return r.push("","Doctor made no repairs or state changes."),r.join(`
2
+ `)}async function ve(e,r={}){const t=r.stdout??console.log,i=r.stderr??console.error;let o;try{o=se(e,r.env??process.env)}catch(f){const u=f instanceof Error&&k.test(f.message)?f.message:"doctor-argument-invalid";return i(`Error: ${u}`),I.USAGE}const c=await be(o,r);return t(o.json?JSON.stringify(c,null,2):Oe(c)),c.exitCode}export{I as DOCTOR_EXIT_CODES,n as DOCTOR_REASON_CODES,X as DOCTOR_RESPONSE_SCHEMA_VERSION,K as DOCTOR_SCHEMA_VERSION,le as collectLocalReleaseLifecycleContext,ve as doctorCliHandler,ce as loadSharedCompatibilityAuthority,se as parseDoctorArgs,Oe as renderDoctorReport,be as runDoctor};
@@ -6,10 +6,12 @@ import { observeRunnerOperationalStatus, type RunnerSchedulerBootstrapOptions, t
6
6
  import { type ContinuityProcessingSummaryCursorTarget } from '../continuity/continuity-client-state-store.js';
7
7
  import type { ProjectEvidenceEnvelope } from '../evidence/types.js';
8
8
  import { detectNativeHostAttestation } from '../adapters/platform-detector.js';
9
- import type { YoloSpecEnvelopeV1 } from '../../../shared/dist/yolo/spec-envelope.js';
9
+ import { type YoloSpecEnvelopeV1 } from '../../../shared/dist/yolo/spec-envelope.js';
10
10
  import type { YoloChangeEvidence } from '../../../shared/dist/yolo/change-evidence.js';
11
+ import { type ReleaseGateRequestV1 } from '../../../shared/dist/yoloop/release-blocked.js';
11
12
  import { type InvokeEffectContext, type StrictReadOnlyInvokeEnvelope } from '../../../shared/dist/strict-readonly.js';
12
13
  import { type InvokeInputEvidenceV1, type InvokeInputEnvelopeV2, type InvokeInputSourceV2, type InvocationMalformedInputReasonV1, type InvocationAdmissionResultV1, type ProjectIdentityMigrationRequestV1 } from '../../../shared/dist/invocation/index.js';
14
+ import { type CompatibilityOfferV1, type CompatibilityResultV1 } from '../../../shared/dist/compatibility/index.js';
13
15
  import { type P205TransientExecutionAuthority } from '../git/git-lifecycle-store.js';
14
16
  export declare const INVOKE_PAYLOAD_LIMIT_BYTES: number;
15
17
  export declare const INVOKE_PAYLOAD_WARNING_THRESHOLD_BYTES: number;
@@ -53,6 +55,8 @@ export interface InvokeOptions {
53
55
  readonly onPrivateExecutionWorkspaceFailure?: (observation: import('../private-execution/codex-executor.js').PrivateCodexWorkspaceEffectFailureV1) => void;
54
56
  /** Test-only parent for root-owned private YOLO/planning clones; CLI leaves unset. */
55
57
  readonly privateExecutionWorkspaceParent?: string;
58
+ /** Explicit typed P223 release gate input from an authorized local producer. */
59
+ readonly releaseGate?: ReleaseGateRequestV1;
56
60
  }
57
61
  /**
58
62
  * Normalize the project root received from wrappers/CLI flags.
@@ -74,6 +78,11 @@ export interface InvokeResult {
74
78
  readonly errorCode?: string;
75
79
  readonly exitCode: number;
76
80
  }
81
+ /** P223.03 -- convert a valid server terminal into a non-zero CLI/API result. */
82
+ export declare function projectReleaseBlockedInvokeResult(response: {
83
+ readonly instructions?: string;
84
+ readonly metadata?: Record<string, unknown>;
85
+ }): InvokeResult | undefined;
77
86
  /** P205.07 client parity guard. Pure and deliberately exported for driver tests. */
78
87
  export declare function admitClientInvocation(args: string): InvocationAdmissionResultV1;
79
88
  type InvokeWatchFormat = 'plain' | 'json';
@@ -530,6 +539,9 @@ interface InvokeRequestBodyBase {
530
539
  readonly idempotencyKey?: string;
531
540
  readonly registryVersion: string;
532
541
  readonly registryChecksum: string;
542
+ /** P223.01 bounded public negotiation offer; never execution authority. */
543
+ readonly compatibility?: CompatibilityOfferV1;
544
+ readonly releaseGate?: ReleaseGateRequestV1;
533
545
  readonly strictReadOnly?: StrictReadOnlyInvokeEnvelope;
534
546
  readonly yoloSpecEnvelope?: YoloSpecEnvelopeV1;
535
547
  readonly yoloChangeEvidence?: YoloChangeEvidence;
@@ -541,6 +553,7 @@ export type InvokeRequestBody = InvokeRequestBodyBase & ({
541
553
  readonly args?: never;
542
554
  readonly argsRef: InvokeArgsRef;
543
555
  });
556
+ export declare function buildInvokeCompatibilityOffer(): CompatibilityOfferV1;
544
557
  export interface InvokePayloadTelemetry {
545
558
  readonly schemaVersion: 1;
546
559
  readonly payloadBytes: number;
@@ -644,6 +657,7 @@ interface SendResult {
644
657
  readonly data?: InvokeResponse;
645
658
  readonly error?: string;
646
659
  readonly errorBody?: Record<string, unknown>;
660
+ readonly compatibility?: CompatibilityResultV1;
647
661
  }
648
662
  /**
649
663
  * Preserve the server's public error authority across the transport boundary.
@@ -663,6 +677,10 @@ export interface InvokePhysicalRetryOptions {
663
677
  readonly sleep?: (milliseconds: number) => Promise<void>;
664
678
  readonly maxAttempts?: number;
665
679
  readonly allowReplayRetry?: boolean;
680
+ /** Runs before response.text()/JSON.parse(); false prevents body consumption. */
681
+ readonly admitResponseBeforeBodyRead?: (response: Response) => boolean;
682
+ /** Allows a caller to finish compatibility admission before successful JSON parsing. */
683
+ readonly deferSuccessfulJsonParsing?: boolean;
666
684
  }
667
685
  export declare function buildSignedInvokeAttempt(path: string, body: Record<string, unknown>, authToken: string, options?: {
668
686
  readonly nowSeconds?: number;