@jterrats/open-orchestra 1.0.17 → 1.1.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 (235) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/CLAUDE.md +1 -0
  3. package/dist/active-runtime-store.d.ts +18 -0
  4. package/dist/active-runtime-store.js +75 -0
  5. package/dist/active-runtime-store.js.map +1 -0
  6. package/dist/chat-api-errors.d.ts +7 -0
  7. package/dist/chat-api-errors.js +15 -0
  8. package/dist/chat-api-errors.js.map +1 -0
  9. package/dist/chat-api-message-persistence.d.ts +12 -0
  10. package/dist/chat-api-message-persistence.js +125 -0
  11. package/dist/chat-api-message-persistence.js.map +1 -0
  12. package/dist/chat-api-records.d.ts +35 -0
  13. package/dist/chat-api-records.js +94 -0
  14. package/dist/chat-api-records.js.map +1 -0
  15. package/dist/chat-api-service.d.ts +32 -0
  16. package/dist/chat-api-service.js +120 -0
  17. package/dist/chat-api-service.js.map +1 -0
  18. package/dist/chat-api-storage.d.ts +1 -0
  19. package/dist/chat-api-storage.js +14 -0
  20. package/dist/chat-api-storage.js.map +1 -0
  21. package/dist/chat-api-types.d.ts +81 -0
  22. package/dist/chat-api-types.js +2 -0
  23. package/dist/chat-api-types.js.map +1 -0
  24. package/dist/chat-compliance-service.d.ts +60 -0
  25. package/dist/chat-compliance-service.js +241 -0
  26. package/dist/chat-compliance-service.js.map +1 -0
  27. package/dist/chat-event-stream.d.ts +13 -0
  28. package/dist/chat-event-stream.js +124 -0
  29. package/dist/chat-event-stream.js.map +1 -0
  30. package/dist/chat-pagination.d.ts +6 -0
  31. package/dist/chat-pagination.js +64 -0
  32. package/dist/chat-pagination.js.map +1 -0
  33. package/dist/chat-storage-actor-validation.d.ts +4 -0
  34. package/dist/chat-storage-actor-validation.js +65 -0
  35. package/dist/chat-storage-actor-validation.js.map +1 -0
  36. package/dist/chat-storage-content-policy.d.ts +6 -0
  37. package/dist/chat-storage-content-policy.js +84 -0
  38. package/dist/chat-storage-content-policy.js.map +1 -0
  39. package/dist/chat-storage-errors.d.ts +20 -0
  40. package/dist/chat-storage-errors.js +17 -0
  41. package/dist/chat-storage-errors.js.map +1 -0
  42. package/dist/chat-storage-local-files.d.ts +17 -0
  43. package/dist/chat-storage-local-files.js +78 -0
  44. package/dist/chat-storage-local-files.js.map +1 -0
  45. package/dist/chat-storage-local-paths.d.ts +6 -0
  46. package/dist/chat-storage-local-paths.js +124 -0
  47. package/dist/chat-storage-local-paths.js.map +1 -0
  48. package/dist/chat-storage-local-projection.d.ts +10 -0
  49. package/dist/chat-storage-local-projection.js +55 -0
  50. package/dist/chat-storage-local-projection.js.map +1 -0
  51. package/dist/chat-storage-local-records.d.ts +13 -0
  52. package/dist/chat-storage-local-records.js +56 -0
  53. package/dist/chat-storage-local-records.js.map +1 -0
  54. package/dist/chat-storage-local.d.ts +6 -0
  55. package/dist/chat-storage-local.js +114 -0
  56. package/dist/chat-storage-local.js.map +1 -0
  57. package/dist/chat-storage-validation.d.ts +10 -0
  58. package/dist/chat-storage-validation.js +100 -0
  59. package/dist/chat-storage-validation.js.map +1 -0
  60. package/dist/chat-storage.d.ts +16 -0
  61. package/dist/chat-storage.js +4 -0
  62. package/dist/chat-storage.js.map +1 -0
  63. package/dist/chat-workflow-timeline.d.ts +17 -0
  64. package/dist/chat-workflow-timeline.js +210 -0
  65. package/dist/chat-workflow-timeline.js.map +1 -0
  66. package/dist/{workspace-claude-settings.d.ts → claude-settings.d.ts} +22 -3
  67. package/dist/{workspace-claude-settings.js → claude-settings.js} +28 -9
  68. package/dist/claude-settings.js.map +1 -0
  69. package/dist/command-init.d.ts +2 -0
  70. package/dist/command-init.js +150 -0
  71. package/dist/command-init.js.map +1 -0
  72. package/dist/command-manifest.js +1 -1
  73. package/dist/command-manifest.js.map +1 -1
  74. package/dist/commands.d.ts +1 -1
  75. package/dist/commands.js +1 -140
  76. package/dist/commands.js.map +1 -1
  77. package/dist/constants.d.ts +1 -0
  78. package/dist/constants.js +1 -0
  79. package/dist/constants.js.map +1 -1
  80. package/dist/context-runtime-preprocessor.d.ts +41 -0
  81. package/dist/context-runtime-preprocessor.js +199 -0
  82. package/dist/context-runtime-preprocessor.js.map +1 -0
  83. package/dist/cursor-settings.d.ts +25 -0
  84. package/dist/cursor-settings.js +72 -0
  85. package/dist/cursor-settings.js.map +1 -0
  86. package/dist/health-commands.js +43 -3
  87. package/dist/health-commands.js.map +1 -1
  88. package/dist/model-aliases.d.ts +5 -0
  89. package/dist/model-aliases.js +37 -0
  90. package/dist/model-aliases.js.map +1 -0
  91. package/dist/ollama-provider.js +25 -0
  92. package/dist/ollama-provider.js.map +1 -1
  93. package/dist/phase-playbooks.js +11 -0
  94. package/dist/phase-playbooks.js.map +1 -1
  95. package/dist/provider-agent-wrapper.js +14 -0
  96. package/dist/provider-agent-wrapper.js.map +1 -1
  97. package/dist/qa-e2e-artifacts.js +71 -3
  98. package/dist/qa-e2e-artifacts.js.map +1 -1
  99. package/dist/runtime-adapters.js +56 -0
  100. package/dist/runtime-adapters.js.map +1 -1
  101. package/dist/runtime-bootstrap.js +32 -22
  102. package/dist/runtime-bootstrap.js.map +1 -1
  103. package/dist/runtime-child-prompt.js +8 -0
  104. package/dist/runtime-child-prompt.js.map +1 -1
  105. package/dist/runtime-context-manifest.d.ts +4 -1
  106. package/dist/runtime-context-manifest.js +59 -3
  107. package/dist/runtime-context-manifest.js.map +1 -1
  108. package/dist/runtime-execution-adapters.js +19 -0
  109. package/dist/runtime-execution-adapters.js.map +1 -1
  110. package/dist/runtime-execution-renderer.js +4 -0
  111. package/dist/runtime-execution-renderer.js.map +1 -1
  112. package/dist/runtime-execution.js +13 -82
  113. package/dist/runtime-execution.js.map +1 -1
  114. package/dist/runtime-hooks.d.ts +46 -0
  115. package/dist/runtime-hooks.js +95 -0
  116. package/dist/runtime-hooks.js.map +1 -0
  117. package/dist/runtime-parent-actions.js +5 -0
  118. package/dist/runtime-parent-actions.js.map +1 -1
  119. package/dist/runtime-spawn-bridge.js +1 -0
  120. package/dist/runtime-spawn-bridge.js.map +1 -1
  121. package/dist/runtime-spawn-guidance.js +15 -61
  122. package/dist/runtime-spawn-guidance.js.map +1 -1
  123. package/dist/security/chat-guardrail-policy.d.ts +7 -0
  124. package/dist/security/chat-guardrail-policy.js +61 -0
  125. package/dist/security/chat-guardrail-policy.js.map +1 -0
  126. package/dist/security/chat-guardrail-types.d.ts +65 -0
  127. package/dist/security/chat-guardrail-types.js +2 -0
  128. package/dist/security/chat-guardrail-types.js.map +1 -0
  129. package/dist/security/chat-guardrail-validation.d.ts +9 -0
  130. package/dist/security/chat-guardrail-validation.js +64 -0
  131. package/dist/security/chat-guardrail-validation.js.map +1 -0
  132. package/dist/security/chat-guardrails.d.ts +3 -0
  133. package/dist/security/chat-guardrails.js +136 -0
  134. package/dist/security/chat-guardrails.js.map +1 -0
  135. package/dist/security/content-classifier.js +33 -1
  136. package/dist/security/content-classifier.js.map +1 -1
  137. package/dist/security/payment-card-detection.d.ts +3 -0
  138. package/dist/security/payment-card-detection.js +48 -0
  139. package/dist/security/payment-card-detection.js.map +1 -0
  140. package/dist/security/policy-types.d.ts +1 -1
  141. package/dist/security/provider-egress-policy.d.ts +27 -0
  142. package/dist/security/provider-egress-policy.js +72 -0
  143. package/dist/security/provider-egress-policy.js.map +1 -0
  144. package/dist/security/public-api-auth.d.ts +20 -0
  145. package/dist/security/public-api-auth.js +55 -0
  146. package/dist/security/public-api-auth.js.map +1 -0
  147. package/dist/security/public-api-policy.d.ts +8 -0
  148. package/dist/security/public-api-policy.js +40 -0
  149. package/dist/security/public-api-policy.js.map +1 -0
  150. package/dist/security/redaction.js +44 -13
  151. package/dist/security/redaction.js.map +1 -1
  152. package/dist/security/restricted-content-quarantine.d.ts +17 -0
  153. package/dist/security/restricted-content-quarantine.js +50 -0
  154. package/dist/security/restricted-content-quarantine.js.map +1 -0
  155. package/dist/security/restricted-data-classifier.d.ts +9 -0
  156. package/dist/security/restricted-data-classifier.js +358 -0
  157. package/dist/security/restricted-data-classifier.js.map +1 -0
  158. package/dist/skills-render.js +7 -14
  159. package/dist/skills-render.js.map +1 -1
  160. package/dist/telemetry-redaction.d.ts +2 -0
  161. package/dist/telemetry-redaction.js +25 -2
  162. package/dist/telemetry-redaction.js.map +1 -1
  163. package/dist/types/chat.d.ts +203 -0
  164. package/dist/types/chat.js +10 -0
  165. package/dist/types/chat.js.map +1 -0
  166. package/dist/types/model-config.d.ts +4 -0
  167. package/dist/types/public-api.d.ts +75 -0
  168. package/dist/types/public-api.js +2 -0
  169. package/dist/types/public-api.js.map +1 -0
  170. package/dist/types/restricted-data.d.ts +69 -0
  171. package/dist/types/restricted-data.js +8 -0
  172. package/dist/types/restricted-data.js.map +1 -0
  173. package/dist/types/restricted-fragment.d.ts +82 -0
  174. package/dist/types/restricted-fragment.js +14 -0
  175. package/dist/types/restricted-fragment.js.map +1 -0
  176. package/dist/types/runtime.d.ts +12 -0
  177. package/dist/types.d.ts +6 -0
  178. package/dist/types.js.map +1 -1
  179. package/dist/web-api.js +24 -0
  180. package/dist/web-api.js.map +1 -1
  181. package/dist/web-artifact-parsers.d.ts +6 -0
  182. package/dist/web-artifact-parsers.js +266 -0
  183. package/dist/web-artifact-parsers.js.map +1 -0
  184. package/dist/web-artifact-types.d.ts +76 -0
  185. package/dist/web-artifact-types.js +2 -0
  186. package/dist/web-artifact-types.js.map +1 -0
  187. package/dist/web-artifacts.d.ts +2 -43
  188. package/dist/web-artifacts.js +106 -57
  189. package/dist/web-artifacts.js.map +1 -1
  190. package/dist/web-chat-route-inputs.d.ts +11 -0
  191. package/dist/web-chat-route-inputs.js +156 -0
  192. package/dist/web-chat-route-inputs.js.map +1 -0
  193. package/dist/web-chat-routes.d.ts +7 -0
  194. package/dist/web-chat-routes.js +213 -0
  195. package/dist/web-chat-routes.js.map +1 -0
  196. package/dist/web-console/assets/index-CJup1cIA.css +1 -0
  197. package/dist/web-console/assets/index-CVDOfipu.js +11 -0
  198. package/dist/web-console/index.html +2 -2
  199. package/dist/web-evidence.d.ts +1 -1
  200. package/dist/web-evidence.js +9 -2
  201. package/dist/web-evidence.js.map +1 -1
  202. package/dist/web-public-route-inputs.d.ts +14 -0
  203. package/dist/web-public-route-inputs.js +136 -0
  204. package/dist/web-public-route-inputs.js.map +1 -0
  205. package/dist/web-public-routes.d.ts +6 -0
  206. package/dist/web-public-routes.js +194 -0
  207. package/dist/web-public-routes.js.map +1 -0
  208. package/dist/web-public-service.d.ts +16 -0
  209. package/dist/web-public-service.js +154 -0
  210. package/dist/web-public-service.js.map +1 -0
  211. package/dist/workflow-services.js +5 -0
  212. package/dist/workflow-services.js.map +1 -1
  213. package/dist/workspace-runtime-bootstrap.js +15 -4
  214. package/dist/workspace-runtime-bootstrap.js.map +1 -1
  215. package/docs/chat-audit-retention.md +76 -0
  216. package/docs/chat-provider-provenance-ledger.md +75 -0
  217. package/docs/context-runtime-preprocessing.md +37 -0
  218. package/docs/orchestra-mvp.md +8 -2
  219. package/docs/public-api-contract.md +43 -0
  220. package/docs/release-test-matrix.md +14 -14
  221. package/docs/restricted-fragment-storage-contract.md +147 -0
  222. package/docs/runtime-adapters.md +40 -7
  223. package/docs/site-manifest.json +128 -30
  224. package/package.json +5 -2
  225. package/site/dist/_headers +9 -0
  226. package/site/dist/_redirects +2 -0
  227. package/site/dist/architecture.mmd +61 -0
  228. package/site/dist/assets/index-Bi8l6tCE.js +10 -0
  229. package/site/dist/assets/index-BsCLqY__.css +1 -0
  230. package/site/dist/favicon.svg +19 -0
  231. package/site/dist/index.html +28 -0
  232. package/site/package.json +19 -0
  233. package/dist/web-console/assets/index-BHs7OIv8.css +0 -1
  234. package/dist/web-console/assets/index-BJuVTqfQ.js +0 -11
  235. package/dist/workspace-claude-settings.js.map +0 -1
@@ -65,20 +65,20 @@ GitHub Actions secret.
65
65
 
66
66
  ## Required Flows
67
67
 
68
- | Flow | Command | Evidence |
69
- | ---------------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
70
- | Source quality gate | `npm run precommit` | lint, typecheck, secret scan, security audit, build, unit tests, workflow validation |
71
- | Secret scanning gate | `npm run secret-scan` | Gitleaks scan with `.gitleaks.toml` when the binary is installed; lightweight fallback for offline local development |
72
- | Duplicate-code gate | `npm run duplicates` | jscpd duplicate-code report with generated/runtime outputs excluded and collection-standards follow-up for duplicated domain lists |
73
- | Task split guard | `node --test test/task-split-assessment.test.js` | PO/BA functional oversize, Architect technical complexity, routine small-task non-blocking behavior, and markdown evidence rendering |
74
- | Sonar quality gate | GitHub Actions: `Sonar` or local SonarQube import | conditional quality gate for duplication, bugs, code smells, maintainability, coverage readiness, and security hotspots when a Sonar provider is configured |
75
- | Browser E2E | `npm run test:e2e` | Playwright checks map scenario acceptance criteria to visible UI state, API persistence, artifact attachment, responsive layout, and recovery behavior |
76
- | Installed package init | `npm run test:e2e:init` | Installed CLI checks map scenario acceptance criteria to stdout, stderr, exit code, filesystem state, JSON contracts, evidence records, and release-readiness outcomes |
77
- | Runtime manual queue | `npm run test:e2e:runtime` | Temporary-workspace runtime checks prove manual spawn requests queue under delegate pressure and expose queued artifacts through runtime sessions |
78
- | Public site build | `npm run site:build` | production site build |
79
- | Release readiness | `orchestra release check --json` | `releaseReadiness` and `gaReadiness` report |
80
- | Package contents | `npm pack --dry-run --json` | package file list and provenance check |
81
- | Performance budgets | `npm run performance:bench -- --json` | CLI and web API timings on a synthetic large workspace |
68
+ | Flow | Command | Evidence |
69
+ | ---------------------- | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
70
+ | Source quality gate | `npm run precommit` | lint, typecheck, secret scan, security audit, build, unit tests, workflow validation |
71
+ | Secret scanning gate | `npm run secret-scan` | Gitleaks scan with `.gitleaks.toml` when the binary is installed; lightweight fallback for offline local development |
72
+ | Duplicate-code gate | `npm run duplicates` | jscpd duplicate-code report with generated/runtime outputs excluded and collection-standards follow-up for duplicated domain lists |
73
+ | Task split guard | `node --test test/task-split-assessment.test.js` | PO/BA functional oversize, Architect technical complexity, routine small-task non-blocking behavior, and markdown evidence rendering |
74
+ | Sonar quality gate | GitHub Actions: `Sonar` or local SonarQube import | conditional quality gate for duplication, bugs, code smells, maintainability, coverage readiness, and security hotspots when a Sonar provider is configured |
75
+ | Browser E2E | `npm run test:e2e` | Playwright checks map scenario acceptance criteria to visible UI state, API persistence, artifact attachment, responsive layout, and recovery behavior |
76
+ | Installed package init | `npm run test:e2e:init` | Installed CLI checks map scenario acceptance criteria to stdout, stderr, exit code, filesystem state, JSON contracts, evidence records, and release-readiness outcomes |
77
+ | Runtime manual queue | `npm run test:e2e:runtime` | Temporary-workspace runtime checks prove manual spawn requests queue under delegate pressure and expose queued artifacts through runtime sessions |
78
+ | Public site build | `npm run site:build` | production site build |
79
+ | Release readiness | `orchestra release check --json` | `releaseReadiness` and `gaReadiness` report |
80
+ | Package contents | `npm run package:validate` | package file list includes bin, dist, web console, site assets, docs, rules, skills, metadata, and changelog |
81
+ | Performance budgets | `npm run performance:bench -- --json` | CLI and web API timings on a synthetic large workspace |
82
82
 
83
83
  ## Network Policy
84
84
 
@@ -0,0 +1,147 @@
1
+ # Restricted Fragment Storage Contract
2
+
3
+ `GH-510-RESTRICTED-FRAGMENT-STORAGE` defines the future storage envelope for
4
+ retained restricted fragments. This contract does not enable retention by
5
+ default and does not add a vault, KMS, or retrieval product surface.
6
+
7
+ ## Scope
8
+
9
+ Restricted fragment storage is exceptional. It is allowed only when a future
10
+ structured workflow has an approved product need, tenant policy, retention
11
+ class, and security review. Ordinary chat persistence remains redacted-only.
12
+
13
+ The following values must not be retained raw in transcripts, logs, exports,
14
+ evidence, markdown handoffs, telemetry, or provider requests:
15
+
16
+ - credentials, passwords, API keys, tokens, secrets, and signing material
17
+ - payment card data, CVV, track data, and payment account identifiers
18
+ - regulated or sensitive PII unless a future structured policy explicitly
19
+ authorizes encrypted retention
20
+
21
+ ## Storage Boundary
22
+
23
+ Restricted fragments must be stored outside `.agent-workflow/chat/v1` transcript
24
+ JSONL and outside ordinary chat message tables. Chat records may keep only a
25
+ redacted shadow and a restricted-fragment reference.
26
+
27
+ The redacted shadow is the only transcript-safe representation:
28
+
29
+ - fragment id
30
+ - tenant id, workspace id, and source message id
31
+ - classification category and policy id
32
+ - redaction marker and short sanitized summary
33
+ - optional digest of canonical plaintext for dedupe or audit correlation
34
+ - lifecycle status, created timestamp, expiry timestamp, and legal-hold flag
35
+
36
+ The shadow must not contain raw plaintext, ciphertext, encrypted data keys,
37
+ KMS key ids that reveal tenant topology, provider payloads, or debug samples.
38
+
39
+ ## Envelope Encryption
40
+
41
+ Each retained fragment uses envelope encryption:
42
+
43
+ 1. A tenant root key is managed by an external KMS or vault.
44
+ 2. A workspace key-encryption context is derived from tenant id, workspace id,
45
+ retention class, and policy id.
46
+ 3. A fresh per-fragment data encryption key encrypts the fragment with
47
+ `AES-256-GCM` or a reviewed equivalent AEAD.
48
+ 4. The per-fragment data key is wrapped by the workspace key context.
49
+ 5. The ciphertext object stores only ciphertext metadata and the wrapped key
50
+ reference needed for an authorized decrypt operation.
51
+
52
+ The envelope metadata must include:
53
+
54
+ - envelope schema version
55
+ - fragment id and redacted shadow id
56
+ - algorithm, IV/nonce id, authentication tag id, and ciphertext digest
57
+ - wrapped data-key id and key version
58
+ - KMS provider alias and tenant/workspace key scope
59
+ - classification category, retention class, policy id, and purpose
60
+ - creation timestamp, expiry timestamp, and legal-hold flag
61
+
62
+ The envelope metadata must not include raw plaintext, derived plaintext samples,
63
+ complete provider prompts, route request bodies, or user-supplied secret names.
64
+
65
+ ## Audit Contract
66
+
67
+ The append-only audit trail must record sanitized lifecycle events:
68
+
69
+ - `restricted_fragment_detected`
70
+ - `restricted_fragment_shadow_recorded`
71
+ - `restricted_fragment_encrypted`
72
+ - `restricted_fragment_decrypt_denied`
73
+ - `restricted_fragment_restore_attempted`
74
+ - `restricted_fragment_ciphertext_deleted`
75
+ - `restricted_fragment_key_destroyed`
76
+ - `restricted_fragment_crypto_shredded`
77
+ - `restricted_fragment_backup_expiry_pending`
78
+
79
+ Audit entries include tenant id, workspace id, fragment id, policy id, actor id,
80
+ decision id, category, timestamps, and counts. They never include plaintext,
81
+ ciphertext, wrapped key material, provider payloads, or request bodies.
82
+
83
+ ## Crypto-Shred
84
+
85
+ Deleting a retained fragment requires both storage deletion and key destruction:
86
+
87
+ 1. mark the redacted shadow as deletion requested;
88
+ 2. hard-delete the ciphertext object and index entry;
89
+ 3. destroy or disable the fragment data-key binding so decrypt is impossible;
90
+ 4. record the KMS/vault destruction receipt or local equivalent;
91
+ 5. record backup expiry status because immutable backups may age out later;
92
+ 6. record a final `crypto_shredded` audit event.
93
+
94
+ If raw restricted data was blocked and never persisted, delete reports
95
+ `raw_not_persisted` instead of claiming a ciphertext deletion occurred.
96
+
97
+ Crypto-shred is complete only when the active ciphertext object is gone and the
98
+ key binding can no longer unwrap the fragment data key. Backups may still retain
99
+ already-encrypted bytes until their retention windows expire, but those bytes
100
+ must remain unrecoverable once key destruction is complete.
101
+
102
+ ## Restore Constraints
103
+
104
+ Restore is denied by default. A future restore operation must require:
105
+
106
+ - tenant and workspace authorization
107
+ - policy allowing restore for the exact category and retention class
108
+ - legal basis or break-glass reason
109
+ - active key material that has not been crypto-shredded
110
+ - append-only audit before and after the attempt
111
+
112
+ Restore must fail closed when the fragment is expired, the key is destroyed, the
113
+ legal hold conflicts with the request, the actor lacks authorization, or the
114
+ policy does not allow raw recovery. Restored plaintext must be streamed only to
115
+ the authorized consumer and must not be written back into transcripts, evidence,
116
+ logs, exports, or provider prompts.
117
+
118
+ ## Export And Compliance
119
+
120
+ Default chat export remains redacted-only. Export may include redacted shadows
121
+ and audit summaries, but it must not include ciphertext blobs, wrapped keys,
122
+ plaintext, KMS key material, or restoration receipts that expose internals.
123
+ Telemetry, evidence compaction, support bundles, and Markdown reporting follow
124
+ the same rule: only sanitized category, count, marker, decision, and lifecycle
125
+ status data may leave the restricted-fragment boundary.
126
+
127
+ Logical chat tombstones do not satisfy crypto-shred for retained fragments.
128
+ Compliance delete must distinguish:
129
+
130
+ - transcript tombstone only
131
+ - `raw_not_persisted`
132
+ - ciphertext hard delete
133
+ - key destroyed
134
+ - crypto-shred complete
135
+ - backup expiry pending
136
+
137
+ ## Implementation Slices
138
+
139
+ 1. Add storage-agnostic domain types and validation for restricted fragment
140
+ shadows, envelopes, audit events, and delete results.
141
+ 2. Teach chat compliance exports to include redacted shadow summaries while
142
+ excluding ciphertext and wrapped-key metadata.
143
+ 3. Add a storage adapter interface for encrypted fragment object stores.
144
+ 4. Add a KMS/vault adapter interface for wrap, unwrap, disable, and destroy.
145
+ 5. Add delete orchestration that hard-deletes ciphertext before recording key
146
+ destruction and crypto-shred audit events.
147
+ 6. Add restore denial tests before any restore implementation exists.
@@ -75,6 +75,20 @@ OpenAI/Codex provider models are provider-backed execution. `codex-cli` is a
75
75
  runtime-native parent session and never becomes a provider API fallback unless a
76
76
  future explicit hybrid policy records that decision as evidence.
77
77
 
78
+ Before the wrapper creates a provider adapter or sends a request, it evaluates
79
+ provider egress through the security policy boundary. Messages are classified
80
+ through the shared classifier/redaction contract and treated as a `provider`
81
+ sink. Restricted or unsafe-unredacted content is blocked before any provider
82
+ call; only sanitized policy metadata may be recorded as evidence. Provider
83
+ failure messages are sanitized before surfacing so backend base URLs,
84
+ authorization headers, API keys, and token-shaped values are not exposed.
85
+
86
+ Internal providers such as `ollama` are private-only. `OLLAMA_BASE_URL` must be
87
+ server-configured and point at `localhost`, loopback, link-local, or RFC1918
88
+ private-network IP addresses. Public DNS names and public IPs are rejected by
89
+ policy. Use loopback for local development, or a private address reachable only
90
+ inside the trusted deployment network.
91
+
78
92
  ## Init Modes
79
93
 
80
94
  Default project init keeps the current compact bootstrap behavior:
@@ -487,13 +501,26 @@ agent path and records that choice in phase provenance.
487
501
 
488
502
  When no task or role executor is configured and the default executor is
489
503
  `generic-runtime`, `auto` and strict `subagents` mode infer the active runtime
490
- from `OPEN_ORCHESTRA_ACTIVE_RUNTIME`, known parent-runtime environment markers,
491
- or managed runtime bootstrap files. Codex maps to `codex-cli`, Claude maps to
492
- `claude-cli`, Cursor maps to `cursor-cli`, Windsurf maps to `windsurf-agent`,
493
- and VS Code maps to `vscode-agent`.
494
-
495
- Explicit selections always take precedence in this order: `--runtime`, task
496
- override, role override, then `runtimePolicy.defaults.executor`. Automatic
504
+ from `.agent-workflow/active-runtime.json`, then from `OPEN_ORCHESTRA_ACTIVE_RUNTIME`
505
+ as a final fallback for non-hook environments (CI, scripts).
506
+
507
+ `.agent-workflow/active-runtime.json` is the truthful signal of which AI runtime
508
+ is currently driving the conversation. It is written by the active runtime's
509
+ UserPromptSubmit hook on every session start. `orchestra init --target claude`
510
+ configures Claude's `.claude/settings.json` hook to call
511
+ `orchestra health --runtime claude-cli --json`; `--target cursor` configures the
512
+ equivalent in `.cursor/rules/orchestra-health.mdc`. Manual-setup guidance for
513
+ Codex/VS Code/Windsurf documents the same `orchestra health --runtime <id>`
514
+ pattern that must run at session start. Each hook overwrites the file with its
515
+ own runtime id, so "last writer wins" matches "current parent runtime".
516
+
517
+ The persisted record has a 24h TTL. Records older than that are ignored and
518
+ inference falls through to the next signal. Codex maps to `codex-cli`, Claude
519
+ maps to `claude-cli`, Cursor maps to `cursor-cli`, Windsurf maps to
520
+ `windsurf-agent`, and VS Code maps to `vscode-agent`.
521
+
522
+ Explicit selections always take precedence in this order: `--runtime` flag,
523
+ task override, role override, then `runtimePolicy.defaults.executor`. Automatic
497
524
  inference never rewrites `.agent-workflow/config.json`; it only affects the
498
525
  current planning decision. Set `workflow.phaseExecutionMode` to `single-agent`
499
526
  or configure `runtimePolicy.defaults.executor` to override inference for
@@ -501,6 +528,12 @@ deterministic local or CI runs. If `OPEN_ORCHESTRA_ACTIVE_RUNTIME` names an
501
528
  unknown runtime, workflow planning fails with supported values and the same
502
529
  override options instead of requiring hidden config edits.
503
530
 
531
+ File-based inference (reading `target=` from `AGENTS.md`/`CLAUDE.md`/etc.) and
532
+ per-tool environment detection (`CLAUDECODE`, `CODEX_THREAD_ID`,
533
+ `CURSOR_TRACE_ID`, etc.) are intentionally **not** used: instruction files
534
+ describe which runtimes the project supports, not which one is active right
535
+ now, and per-tool env vars can coexist in nested or inherited sessions.
536
+
504
537
  Subagent spawning is fully asynchronous by default. A spawn request returns the
505
538
  `sessionId`, request artifact, prompt artifact, expected result artifact, status,
506
539
  next lifecycle commands, and quality warnings, then the parent agent should
@@ -1,9 +1,7 @@
1
1
  {
2
2
  "repositoryUrl": "https://github.com/jterrats/open-orchestra",
3
3
  "packageUrl": "https://www.npmjs.com/package/@jterrats/open-orchestra",
4
- "nav": [
5
- { "href": "https://jterrats.dev", "label": "Main site" }
6
- ],
4
+ "nav": [{ "href": "https://jterrats.dev", "label": "Main site" }],
7
5
  "pages": [
8
6
  {
9
7
  "path": "/",
@@ -54,7 +52,7 @@
54
52
  },
55
53
  "quickstart": {
56
54
  "source": "README.md",
57
- "heading": "First Visible Value"
55
+ "heading": "Individual Mode: First Value In Minutes"
58
56
  },
59
57
  "capabilities": {
60
58
  "source": "README.md",
@@ -92,7 +90,7 @@
92
90
  "label": "README",
93
91
  "href": "https://github.com/jterrats/open-orchestra#quick-start",
94
92
  "source": "README.md",
95
- "heading": "First Visible Value"
93
+ "heading": "Individual Mode: First Value In Minutes"
96
94
  },
97
95
  {
98
96
  "title": "Release matrix",
@@ -110,43 +108,143 @@
110
108
  },
111
109
  "docs": {
112
110
  "links": [
113
- { "title": "Adoption guide", "source": "docs/adoption-guide.md", "heading": "Open Orchestra 1.0.0 Adoption Guide" },
114
- { "title": "Core command surface", "source": "docs/core-command-surface.md", "heading": "Core Command Surface" },
115
- { "title": "E2E test batteries", "source": "docs/e2e-test-batteries.md", "heading": "End-to-End Test Batteries" },
116
- { "title": "Duplicate-code enforcement", "source": "docs/duplicate-code-enforcement.md", "heading": "Duplicate-Code Enforcement" },
117
- { "title": "Sonar quality gates", "source": "docs/sonar-quality-gates.md", "heading": "Sonar Quality Gates" },
118
- { "title": "Sonar architecture model", "source": "docs/sonar-architecture-model.md", "heading": "Sonar Architecture Model" },
119
- { "title": "Runtime adapters", "source": "docs/runtime-adapters.md", "heading": "Runtime Adapters" },
120
- { "title": "Context vault", "source": "docs/context-vault.md", "heading": "Context Vault" },
121
- { "title": "Site content workflow", "source": "docs/site-content-workflow.md", "heading": "Public Site Content Workflow" }
111
+ {
112
+ "title": "Adoption guide",
113
+ "source": "docs/adoption-guide.md",
114
+ "heading": "Open Orchestra 1.0.0 Adoption Guide"
115
+ },
116
+ {
117
+ "title": "Core command surface",
118
+ "source": "docs/core-command-surface.md",
119
+ "heading": "Core Command Surface"
120
+ },
121
+ {
122
+ "title": "E2E test batteries",
123
+ "source": "docs/e2e-test-batteries.md",
124
+ "heading": "End-to-End Test Batteries"
125
+ },
126
+ {
127
+ "title": "Duplicate-code enforcement",
128
+ "source": "docs/duplicate-code-enforcement.md",
129
+ "heading": "Duplicate-Code Enforcement"
130
+ },
131
+ {
132
+ "title": "Sonar quality gates",
133
+ "source": "docs/sonar-quality-gates.md",
134
+ "heading": "Sonar Quality Gates"
135
+ },
136
+ {
137
+ "title": "Sonar architecture model",
138
+ "source": "docs/sonar-architecture-model.md",
139
+ "heading": "Sonar Architecture Model"
140
+ },
141
+ {
142
+ "title": "Runtime adapters",
143
+ "source": "docs/runtime-adapters.md",
144
+ "heading": "Runtime Adapters"
145
+ },
146
+ {
147
+ "title": "Context vault",
148
+ "source": "docs/context-vault.md",
149
+ "heading": "Context Vault"
150
+ },
151
+ {
152
+ "title": "Site content workflow",
153
+ "source": "docs/site-content-workflow.md",
154
+ "heading": "Public Site Content Workflow"
155
+ }
122
156
  ]
123
157
  },
124
158
  "releaseDocs": {
125
159
  "links": [
126
- { "title": "Release test matrix", "source": "docs/release-test-matrix.md", "heading": "1.0.0 Release Test Matrix" },
127
- { "title": "E2E test batteries", "source": "docs/e2e-test-batteries.md", "heading": "End-to-End Test Batteries" },
128
- { "title": "Sonar quality gates", "source": "docs/sonar-quality-gates.md", "heading": "Sonar Quality Gates" },
129
- { "title": "Sonar architecture model", "source": "docs/sonar-architecture-model.md", "heading": "Sonar Architecture Model" },
130
- { "title": "QA evidence", "source": "docs/site-content-workflow.md", "heading": "QA Evidence" },
131
- { "title": "Package naming", "source": "docs/package-naming.md", "heading": "Package Naming Decision" },
132
- { "title": "Upgrade dogfooding", "source": "README.md", "heading": "Quick Start" }
160
+ {
161
+ "title": "Release test matrix",
162
+ "source": "docs/release-test-matrix.md",
163
+ "heading": "1.0.0 Release Test Matrix"
164
+ },
165
+ {
166
+ "title": "E2E test batteries",
167
+ "source": "docs/e2e-test-batteries.md",
168
+ "heading": "End-to-End Test Batteries"
169
+ },
170
+ {
171
+ "title": "Sonar quality gates",
172
+ "source": "docs/sonar-quality-gates.md",
173
+ "heading": "Sonar Quality Gates"
174
+ },
175
+ {
176
+ "title": "Sonar architecture model",
177
+ "source": "docs/sonar-architecture-model.md",
178
+ "heading": "Sonar Architecture Model"
179
+ },
180
+ {
181
+ "title": "QA evidence",
182
+ "source": "docs/site-content-workflow.md",
183
+ "heading": "QA Evidence"
184
+ },
185
+ {
186
+ "title": "Package naming",
187
+ "source": "docs/package-naming.md",
188
+ "heading": "Package Naming Decision"
189
+ },
190
+ {
191
+ "title": "Upgrade dogfooding",
192
+ "source": "README.md",
193
+ "heading": "Quick Start"
194
+ }
133
195
  ]
134
196
  },
135
197
  "console": {
136
198
  "links": [
137
- { "title": "Web console QA", "source": "docs/web-console-qa.md", "heading": "Web Console QA Notes" },
138
- { "title": "Local web console", "source": "docs/orchestra-mvp.md", "heading": "Commands" },
139
- { "title": "Workflow progress API", "source": "README.md", "heading": "1.0.0 Workflow Tooling" },
140
- { "title": "Delivery dashboard", "source": "docs/adoption-guide.md", "heading": "Release Operations" }
199
+ {
200
+ "title": "Web console QA",
201
+ "source": "docs/web-console-qa.md",
202
+ "heading": "Web Console QA Notes"
203
+ },
204
+ {
205
+ "title": "Local web console",
206
+ "source": "docs/orchestra-mvp.md",
207
+ "heading": "Commands"
208
+ },
209
+ {
210
+ "title": "Workflow progress API",
211
+ "source": "README.md",
212
+ "heading": "1.0.0 Workflow Tooling"
213
+ },
214
+ {
215
+ "title": "Delivery dashboard",
216
+ "source": "docs/adoption-guide.md",
217
+ "heading": "Release Operations"
218
+ }
141
219
  ]
142
220
  },
143
221
  "reference": {
144
222
  "links": [
145
- { "title": "Command contracts", "source": "docs/command-contracts.md", "heading": "Command Contracts" },
146
- { "title": "Generated artifact APIs", "source": "docs/generated-artifact-api-catalog.md", "heading": "Generated Artifact API Catalog" },
147
- { "title": "Runtime LLM flow", "source": "docs/runtime-llm-flow.md", "heading": "Runtime LLM Flow" },
148
- { "title": "Tracker adapter contract", "source": "docs/tracker-adapter-contract.md", "heading": "Tracker Adapter Contract" },
149
- { "title": "Source of truth and learning", "source": "docs/source-of-truth-and-agent-learning.md", "heading": "Source of Truth and Agent Learning" }
223
+ {
224
+ "title": "Command contracts",
225
+ "source": "docs/command-contracts.md",
226
+ "heading": "Command Contracts"
227
+ },
228
+ {
229
+ "title": "Generated artifact APIs",
230
+ "source": "docs/generated-artifact-api-catalog.md",
231
+ "heading": "Generated Artifact API Catalog"
232
+ },
233
+ {
234
+ "title": "Runtime LLM flow",
235
+ "source": "docs/runtime-llm-flow.md",
236
+ "heading": "Runtime LLM Flow"
237
+ },
238
+ {
239
+ "title": "Tracker adapter contract",
240
+ "source": "docs/tracker-adapter-contract.md",
241
+ "heading": "Tracker Adapter Contract"
242
+ },
243
+ {
244
+ "title": "Source of truth and learning",
245
+ "source": "docs/source-of-truth-and-agent-learning.md",
246
+ "heading": "Source of Truth and Agent Learning"
247
+ }
150
248
  ]
151
249
  }
152
250
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jterrats/open-orchestra",
3
- "version": "1.0.17",
3
+ "version": "1.1.0",
4
4
  "type": "module",
5
5
  "workspaces": [
6
6
  "extensions/vscode-open-orchestra",
@@ -31,7 +31,9 @@
31
31
  "release:matrix": "node scripts/release-test-matrix.js",
32
32
  "performance:bench": "npm run build && node scripts/performance-benchmark.js",
33
33
  "precommit": "npm run lint && npm run typecheck && npm run secret-scan && npm run security:audit && npm test && npm run validate:workflow",
34
- "prepack": "npm run build",
34
+ "package:build": "npm run build && npm run site:build",
35
+ "package:validate": "node scripts/validate-package-contents.js",
36
+ "prepack": "npm run package:build && npm run package:validate",
35
37
  "sonar:preflight:local": "node bin/orchestra.js sonar preflight --provider sonarqube-local --project-key jterrats_open-orchestra --host-url ${SONAR_HOST_URL:-http://localhost:9001}",
36
38
  "sonar:scan:local": "sonar-scanner -Dsonar.host.url=${SONAR_HOST_URL:-http://localhost:9001}",
37
39
  "hooks:install": "git config core.hooksPath .githooks",
@@ -71,6 +73,7 @@
71
73
  "files": [
72
74
  "bin/",
73
75
  "dist/",
76
+ "site/dist/",
74
77
  "rules/",
75
78
  "docs/",
76
79
  "skills/",
@@ -0,0 +1,9 @@
1
+ /*
2
+ Content-Security-Policy: default-src 'self'; base-uri 'self'; connect-src 'self'; font-src 'self'; frame-ancestors 'none'; img-src 'self' data:; object-src 'none'; script-src 'self'; style-src 'self'; form-action 'self'; upgrade-insecure-requests
3
+ Permissions-Policy: camera=(), geolocation=(), microphone=(), payment=(), usb=()
4
+ Referrer-Policy: strict-origin-when-cross-origin
5
+ Strict-Transport-Security: max-age=15552000; includeSubDomains; preload
6
+ X-Content-Type-Options: nosniff
7
+
8
+ /architecture.mmd
9
+ Content-Type: text/plain; charset=utf-8
@@ -0,0 +1,2 @@
1
+ https://www.open-orchestra.jterrats.dev/* https://open-orchestra.jterrats.dev/:splat 301
2
+ /* /index.html 200
@@ -0,0 +1,61 @@
1
+ flowchart LR
2
+ subgraph entry["Entry surfaces"]
3
+ human["Human operator"]
4
+ runtime["Agent runtimes"]
5
+ ide["IDE control center"]
6
+ web["Local web console"]
7
+ end
8
+
9
+ subgraph contract["Runtime and CLI contract"]
10
+ bootstrap["Runtime bootstrap"]
11
+ commands["orchestra CLI"]
12
+ manifest["Command manifest"]
13
+ api["JSON contracts"]
14
+ end
15
+
16
+ subgraph workflow["Workflow core"]
17
+ intake["Task registry"]
18
+ phases["PM to release phases"]
19
+ gates["Human review gates"]
20
+ skills["Skills and memory"]
21
+ readiness["Release readiness"]
22
+ end
23
+
24
+ subgraph state["Local state and adapters"]
25
+ files[".agent-workflow state"]
26
+ providers["Model providers"]
27
+ trackers["Tracker adapters"]
28
+ evidence["Evidence packs"]
29
+ content["Docs manifest"]
30
+ end
31
+
32
+ subgraph delivery["Delivery outputs"]
33
+ site["Public site"]
34
+ package["npm package"]
35
+ reports["Handoffs and reports"]
36
+ release["CI release tags"]
37
+ end
38
+
39
+ human --> commands
40
+ runtime --> bootstrap
41
+ ide --> api
42
+ web --> api
43
+ bootstrap --> commands
44
+ commands --> manifest
45
+ api --> manifest
46
+ manifest --> phases
47
+ phases --> intake
48
+ phases --> gates
49
+ phases --> skills
50
+ phases --> readiness
51
+ intake --> files
52
+ gates --> evidence
53
+ skills --> files
54
+ phases --> providers
55
+ phases --> trackers
56
+ readiness --> evidence
57
+ content --> site
58
+ readiness --> site
59
+ readiness --> package
60
+ readiness --> release
61
+ evidence --> reports