@logicseek/hello-cc 1.1.0-rc.1 → 1.1.0-rc.3

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 (138) hide show
  1. package/CHANGELOG.md +190 -108
  2. package/README.md +1 -10
  3. package/README.zh-CN.md +1 -8
  4. package/docs/codex-account.zh-CN.md +38 -0
  5. package/docs/codex-protocol.md +59 -0
  6. package/docs/commands.md +13 -28
  7. package/docs/commands.zh-CN.md +11 -20
  8. package/docs/dsh.md +5 -3
  9. package/docs/dsh.zh-CN.md +6 -4
  10. package/docs/macos-process-identity.md +15 -0
  11. package/docs/native.md +95 -4
  12. package/docs/native.zh-CN.md +70 -1
  13. package/docs/web-handoff.zh-CN.md +107 -5
  14. package/lib/cli/app.mjs +9 -6
  15. package/lib/cli/commands/coordination.mjs +7 -2
  16. package/lib/cli/commands/gc.mjs +14 -12
  17. package/lib/cli/commands/hook.mjs +16 -3
  18. package/lib/cli/commands/install.mjs +37 -9
  19. package/lib/cli/commands/lock.mjs +3 -1
  20. package/lib/cli/commands/misc.mjs +105 -13
  21. package/lib/cli/commands/native.mjs +3 -44
  22. package/lib/cli/commands/peer.mjs +3 -0
  23. package/lib/cli/commands/run.mjs +13 -6
  24. package/lib/cli/commands/tmux.mjs +1 -2
  25. package/lib/cli-runtime.mjs +19 -2
  26. package/lib/core/coordination/gc-plan.mjs +5 -0
  27. package/lib/core/coordination/locks.mjs +3 -1
  28. package/lib/core/peers/evidence.mjs +21 -1
  29. package/lib/core/peers/tmux-safety.mjs +4 -0
  30. package/lib/core/sessions/hook-root-identity.mjs +47 -0
  31. package/lib/core/sessions/launch.mjs +7 -1
  32. package/lib/db/connection.mjs +67 -21
  33. package/lib/diagnostics/codex-protocol.mjs +105 -0
  34. package/lib/guidance.mjs +20 -36
  35. package/lib/integrations/codex-account.mjs +143 -0
  36. package/lib/integrations/dsh-collaboration.mjs +3 -4
  37. package/lib/integrations/dsh.mjs +4 -2
  38. package/lib/integrations/native/claude.mjs +24 -6
  39. package/lib/integrations/native/codex.mjs +38 -7
  40. package/lib/integrations/native/dsh-acp.mjs +67 -24
  41. package/lib/integrations/native/index.mjs +4 -1
  42. package/lib/integrations/native/jsonrpc.mjs +37 -5
  43. package/lib/integrations/native/telemetry.mjs +30 -0
  44. package/lib/process/identity.mjs +67 -28
  45. package/lib/process/pinned-cwd.mjs +302 -0
  46. package/lib/process/pinned-guidance.mjs +138 -0
  47. package/lib/process/pinned-project-state.mjs +105 -0
  48. package/lib/process/selected-cwd-identity.mjs +95 -0
  49. package/lib/runtime/buffer-evidence.mjs +7 -1
  50. package/lib/runtime/client.mjs +18 -1
  51. package/lib/runtime/native/client.mjs +4 -1
  52. package/lib/runtime/native/history.mjs +140 -0
  53. package/lib/runtime/native/launcher.mjs +106 -0
  54. package/lib/runtime/native/service.mjs +160 -27
  55. package/lib/runtime/native/store.mjs +51 -21
  56. package/lib/runtime/project-path.mjs +24 -5
  57. package/lib/runtime/projects.mjs +3 -0
  58. package/lib/runtime/state.mjs +61 -26
  59. package/lib/shared/file-lock.mjs +62 -17
  60. package/lib/shared/redact.mjs +2 -1
  61. package/lib/shared/socket-lock-worker.mjs +15 -6
  62. package/lib/web/agent-defaults.mjs +110 -0
  63. package/lib/web/auto-attach.mjs +3 -2
  64. package/lib/web/browser/contracts.d.ts +10 -0
  65. package/lib/web/browser/core.mjs +1997 -0
  66. package/lib/web/browser/project-data.mjs +158 -0
  67. package/lib/web/browser/session-sync.mjs +82 -0
  68. package/lib/web/browser-assets.mjs +19 -0
  69. package/lib/web/buffer-gc-runtime.mjs +2 -2
  70. package/lib/web/codex-app-server.mjs +104 -33
  71. package/lib/web/codex-sessions.mjs +60 -11
  72. package/lib/web/context-files.mjs +82 -0
  73. package/lib/web/cookie-auth.mjs +51 -3
  74. package/lib/web/external-sessions.mjs +22 -4
  75. package/lib/web/http-routes.mjs +236 -23
  76. package/lib/web/http.mjs +50 -4
  77. package/lib/web/liveness-reaper.mjs +2 -2
  78. package/lib/web/native-sessions.mjs +322 -13
  79. package/lib/web/project-contexts.mjs +235 -42
  80. package/lib/web/project-file-write.mjs +249 -0
  81. package/lib/web/project-files.mjs +268 -0
  82. package/lib/web/pty-sessions.mjs +11 -3
  83. package/lib/web/runtime-main.mjs +134 -82
  84. package/lib/web/session-serialize.mjs +87 -8
  85. package/lib/web/session-state-sync.mjs +98 -0
  86. package/lib/web/shutdown-diagnostics.mjs +38 -0
  87. package/lib/web/shutdown-response.mjs +21 -0
  88. package/lib/web/shutdown-state.mjs +91 -0
  89. package/lib/web/startup.mjs +76 -27
  90. package/lib/web/tmux-client-snapshot.mjs +85 -0
  91. package/lib/web/tmux-sessions.mjs +71 -7
  92. package/lib/web/tmux-stream.mjs +36 -8
  93. package/lib/web/ui-agent-defaults.mjs +149 -0
  94. package/lib/web/ui-agent-start.mjs +330 -0
  95. package/lib/web/ui-codex-account.mjs +81 -0
  96. package/lib/web/ui-codex.mjs +81 -73
  97. package/lib/web/ui-command-palette.mjs +21 -5
  98. package/lib/web/ui-file-writes.mjs +220 -0
  99. package/lib/web/ui-files.mjs +231 -0
  100. package/lib/web/ui-handoff.mjs +10 -2
  101. package/lib/web/ui-history.mjs +175 -105
  102. package/lib/web/ui-i18n.mjs +280 -8
  103. package/lib/web/ui-interactions.mjs +6 -4
  104. package/lib/web/ui-native-timeline.mjs +326 -0
  105. package/lib/web/ui-native.mjs +93 -49
  106. package/lib/web/ui-review.mjs +5 -3
  107. package/lib/web/ui-safe-markdown.mjs +79 -0
  108. package/lib/web/ui-session-tools.mjs +224 -0
  109. package/lib/web/ui-template.mjs +27 -1967
  110. package/lib/web/ui-terminal-find.mjs +5 -3
  111. package/lib/web/ui-workbench.mjs +5 -3
  112. package/lib/web/ui-workspace.mjs +3 -0
  113. package/package.json +8 -2
  114. package/scripts/benchmark-session-sync.mjs +53 -0
  115. package/scripts/codex-protocol.mjs +88 -0
  116. package/scripts/dsh-approval-layers-acceptance.mjs +172 -0
  117. package/scripts/dsh-package-provenance.mjs +118 -0
  118. package/scripts/native-bounded-live-acceptance.mjs +193 -0
  119. package/scripts/native-fixture-root.mjs +49 -0
  120. package/scripts/native-installed-acceptance.mjs +204 -6
  121. package/scripts/native-stability-checks.mjs +40 -0
  122. package/scripts/regression-cookie-expiry.mjs +70 -0
  123. package/scripts/regression-http-transport.mjs +9 -0
  124. package/scripts/regression-terminal-marker.mjs +95 -0
  125. package/scripts/regression.mjs +637 -186
  126. package/scripts/shim-reentry-probe.mjs +105 -0
  127. package/scripts/web-acceptance-diagnostics.mjs +90 -0
  128. package/scripts/web-codex-account-acceptance.mjs +178 -0
  129. package/scripts/web-file-preview-checks.mjs +302 -0
  130. package/scripts/web-mcp-form-acceptance.mjs +22 -7
  131. package/scripts/web-mcp-form-live-acceptance.mjs +1 -1
  132. package/scripts/web-native-handoff-checks.mjs +128 -0
  133. package/scripts/web-native-interaction-acceptance.mjs +152 -18
  134. package/scripts/web-native-interaction-diagnostics.mjs +80 -0
  135. package/scripts/web-native-model-acceptance.mjs +22 -7
  136. package/scripts/web-session-tools-checks.mjs +112 -0
  137. package/scripts/web-workbench-acceptance.mjs +435 -0
  138. package/scripts/web-workbench-installed-acceptance.mjs +122 -0
package/CHANGELOG.md CHANGED
@@ -16,126 +16,208 @@ the release description from the current changelog section. Use
16
16
  `npm run release:github` with `GH_TOKEN` or `GITHUB_TOKEN` only for local
17
17
  backfills.
18
18
 
19
- ## 1.1.0-rc.1
19
+ ## 1.1.0-rc.3
20
20
 
21
21
  ### Summary
22
22
 
23
- hello-cc 1.1.0-rc.1 brings project and session navigation, structured
24
- conversations, recoverable split panes, and bounded rendering to the Web
25
- workbench. It also brings HCC-owned Codex, Claude and DeepSeek Harness workers
26
- into the same task, message, handoff and result-review workflow, with explicit
27
- permissions and delivery receipts. This release is intended for the npm
28
- `preview` dist-tag and a GitHub prerelease.
23
+ This preview integrates the multi-provider Web workbench with project Agent
24
+ settings, retained native history and project file editing. It also includes
25
+ session isolation and recovery fixes, shutdown quiescence and more precise
26
+ regression diagnostics. A new frozen package preserves the earlier rc.2 archive.
29
27
 
30
28
  ### Highlights
31
29
 
32
- - Switch between English, Chinese or the system language; choose system,
33
- light or dark interface and terminal themes, comfortable or compact spacing,
34
- terminal font size and focus mode. Settings apply without replacing active
35
- terminal connections or discarding drafts, and remain reachable on mobile.
36
- - Search sessions by name, task, provider, path or command; combine keywords
37
- and provider/activity filters. Project changes clear old session state
38
- immediately and ignore delayed responses from the previous project.
39
- - Read Codex conversations by turn with focused user, assistant, command,
40
- file-change and status cards. Preserve reading position, drafts, expanded
41
- details and keyboard focus during updates. Keep approvals visible
42
- independently of the conversation page.
43
- - Use the keyboard command palette for project, session and workbench
44
- navigation. Search the current terminal scrollback locally with match counts,
45
- previous/next navigation, case sensitivity and whole-word matching. The search
46
- addon is served locally.
47
- - Restore a project-specific two-pane workspace with horizontal or vertical
48
- layout, adjustable proportions and a saved secondary session. Each pane
49
- retains its own connection and draft; viewing the same session twice leaves
50
- the secondary pane read-only until an explicit control handoff.
51
- - Page long Codex timelines and large output segments while keeping all
52
- retained content accessible. Copy the complete original text, including
53
- content outside the visible segment. Preserve Unicode characters, scroll
54
- anchors, tool expansion and drafts across streaming updates.
55
- - Coalesce Codex text-delta notifications within a bounded 50 ms window while
56
- updating internal state immediately. Approvals, completion, errors and
57
- connection changes publish promptly. Unchanged native snapshots avoid
58
- redundant broadcasts without skipping ownership checks.
59
- - Manage owned native workers through `hcc native`: Codex App Server, the
60
- optional Claude Agent SDK and DeepSeek Harness ACP share HCC coordination
61
- while retaining their provider-specific lifecycle and session identity. Web
62
- can discover and control an existing native worker without creating a second
63
- provider process.
64
- - Distinguish queued, submitted, provider-accepted, completed, failed and
65
- uncertain delivery states. Uncertain submissions are not automatically
66
- replayed; runtime restarts preserve the uncertainty needed to avoid duplicate
67
- work.
68
- - Handle supported Codex permission requests, questions and common MCP form
69
- fields from Web or the local CLI. Claude responses approve the original tool
70
- input once, and ACP approval selects a provider-offered one-time option.
71
- Responses remain bound to the current worker, session, turn, request and
72
- controller.
73
- - Give hosted executors a temporary MCP capability scoped to the project,
74
- database, peer and live runtime. Coordination tools support tasks, inbox,
75
- messages, handoff, owned locks and local result records. Executor shutdown
76
- revokes the capability without rewriting global provider configuration.
77
- - Review local command results, explicitly submitted evidence and manual
78
- acceptance records with separate local-validation, publication and
79
- business-acceptance categories. A completed model turn or successful command
80
- does not automatically complete an HCC task.
81
- - Include DeepSeek Harness hooks, the Cordis bundle and owned ACP workers,
82
- with identity-bound crash recovery and retryable cleanup after temporary
83
- database failures.
84
- - Use macOS `kern.bootsessionuuid` for the boot component of process identity
85
- instead of wall-clock boot time. Clock adjustments no longer make the same
86
- process appear replaced, while a different boot UUID still identifies a
87
- reboot. Missing or malformed boot identity remains unknown.
88
- - Publish private-state binding manifests atomically, reject legacy-state
89
- takeover during interrupted initialization, and recheck the project identity
90
- before reading, writing or clearing its runtime state. A reused directory
91
- path does not silently inherit the previous project's private state.
92
- - Validate existing SQLite files without opening and closing an additional
93
- descriptor, preserving locks held by another SQLite connection in the same
94
- process. File ownership, permissions, identity and sidecar checks remain in
95
- place.
30
+ - Create Codex, Claude and DeepSeek Harness Agents from the Web workbench; retain
31
+ project defaults, explicit native-history restore and directory-bound drafts.
32
+ - Upload project files and edit complete UTF-8 text with revision conflicts,
33
+ preserved drafts and explicit readback after uncertain writes.
34
+ - Scope login cookies by trusted protocol and port so Web instances on different
35
+ ports do not overwrite each other's login or logout state. Sign in again after
36
+ upgrading; arbitrary SSH port remapping is not inferred.
37
+ - Keep the native-worker discovery error and refresh guidance when a restore
38
+ receipt is absent, instead of failing inside the error handler.
39
+ - Stop admitting background work when administrator shutdown is accepted, then
40
+ start cleanup after the HTTP response finishes or closes; preserve process
41
+ identity checks, exit deadlines and independently owned workers.
42
+ - Recognize terminal regression markers split across output chunks and submit
43
+ fixture input once. Isolate regression HTTP connections and test-owned ports.
44
+ - Add bounded CI task-dispatch and HTTP failure diagnostics without recording
45
+ request bodies, credentials or query parameters, or retrying failed requests.
96
46
 
97
- ### Compatibility Notes
47
+ ### Validation
98
48
 
99
- - Projects under shared or writable ancestors use per-user private state.
100
- Existing legacy state in those projects requires an explicit offline
101
- `migrate-state --offline --yes` after stopping all writers; it is not silently
102
- copied or discarded. Back up both the private store and its authority marker
103
- before manual recovery of a replaced project directory.
104
- - Node.js 24 or newer is required. Linux and macOS are supported host
105
- environments; Windows users use WSL. Native Windows shells are outside the
106
- supported host contract.
107
- - Browser-controllable terminals require tmux where documented. `node-pty`
108
- remains pinned to `1.2.0-beta.15`; the terminal search addon is pinned to
109
- `0.16.0`.
110
- - Native workers require an installed and authenticated provider. Claude's
111
- Agent SDK remains optional and is loaded when a Claude worker starts; HCC
112
- does not install it automatically. DeepSeek Harness integration targets
113
- `0.2.0-rc.2`.
114
- - Closing a browser page does not stop a hosted executor. An independent
115
- native runtime also survives Web-runtime shutdown; explicitly closing its
116
- worker terminates that worker. Web-owned App Server executors remain owned
117
- by their Web runtime.
118
- - Saved-session resume creates a newly owned provider connection and requires
119
- the prior owner to be confirmed stopped. It does not migrate an arbitrary
120
- live TUI or desktop process, and uncertain owners remain protected.
121
- - Existing schema v7, Runtime API v2 and provider authentication boundaries
122
- continue to apply. Browser control handoff never approves a provider operation
123
- by itself. Persisted macOS identities using the older boot-token format remain
124
- unknown across the format transition, rather than being treated as confirmed
125
- dead.
49
+ Release checks compare the package file set, per-file hashes and modes with the
50
+ new frozen rc.3 archive. Source tests, browser checks and installed Harness checks
51
+ retain their exact commit and package receipts. The regression transport changes
52
+ isolate test fixtures; they do not establish the root cause of the earlier macOS
53
+ connection reset. Publication, current-device upgrades and real business calls
54
+ require separate evidence.
55
+
56
+ ## 1.1.0-rc.2
57
+
58
+ ### Summary
59
+
60
+ This local Web workbench candidate adds project Agent defaults, retained native
61
+ history with explicit closed-worker resume, and project file upload/editing.
62
+ It is based on the 1.0.5 delivery line and retains its process identity, tmux
63
+ snapshot and shutdown fixes. A local candidate does not establish publication.
64
+
65
+ ### Highlights
66
+
67
+ - Create Codex, Claude and DeepSeek Harness background Agents from one Web form;
68
+ save project defaults without changing provider credentials or global settings.
69
+ - Read HCC-retained native events and resume explicitly closed workers with
70
+ owner, session and working-directory identity checks.
71
+ - Upload new project files up to 10 MiB and edit complete UTF-8 text up to 1 MiB,
72
+ with revision conflicts, preserved drafts and explicit uncertain-write readback.
73
+ - Bind browser project requests and drafts to the selected directory identity.
74
+ - Preserve native Web connections and control tokens when background discovery
75
+ overlaps Agent creation or history restore; discard stale discovery results.
76
+ - Recheck provider initialization before rejecting an older snapshot with no
77
+ session ID, and retain exact project file matches when a wider search times out.
78
+ - Stop admitting background scans as soon as an administrator stop is accepted,
79
+ and begin cleanup after its HTTP response finishes or closes. Keep existing
80
+ process identity checks, exit confirmation deadlines and independent workers.
81
+ - Keep the existing terminal/App Server modes, readonly previews and bounded
82
+ reconnect behavior.
126
83
 
127
84
  ### Validation
128
85
 
129
- Feature-specific records cover controlled browser interactions, real PTY/tmux
130
- behavior, provider protocols and selected authenticated model workflows. Each
131
- record applies to its recorded inputs and scope. The final release record
132
- identifies the frozen package, platform installations and checks that apply to
133
- this combined candidate; performance samples are controlled observations, not
134
- production capacity or long-term memory guarantees.
86
+ The candidate is checked with the full source regression suite, a disposable
87
+ npm installation and desktop/narrow browser flows. Real-provider entry and
88
+ history checks have separate receipts. These checks do not establish a public
89
+ release, a global installation upgrade or real business acceptance.
90
+
91
+ ## 1.0.5
92
+
93
+ ### Summary
94
+
95
+ macOS process identities use the kernel boot session UUID so changes to the
96
+ reported boot time cannot make a running process appear to have been replaced.
97
+ The issue was observed during post-release sustained acceptance of 1.0.4.
98
+
99
+ ### Highlights
100
+
101
+ - Preserve process identity across changes to the wall-clock-derived boot time.
102
+ - Keep live processes with an older Darwin identity format protected while their
103
+ ownership cannot be compared; a format change does not prove that an owner exited.
104
+ - Retain strict process state, start time and zombie checks, with unknown results
105
+ when a stable boot session identifier cannot be read.
106
+ - Keep the existing npm `latest` release channel.
107
+ - Confirm the original local runtime has exited when its stop response is lost,
108
+ while preserving unknown owners and replacement runtime pointers.
109
+ - Retain structured shutdown error codes when Node warnings share stderr.
110
+
111
+ ### Validation
112
+
113
+ Targeted regression tests cover boot identity drift, boot-session changes,
114
+ malformed observations and conservative handling of existing runtime ownership.
115
+ Full source, package, current-device and sustained-run validation are recorded
116
+ separately. The interrupted 1.0.4 sustained run remains a failed attempt.
117
+ The first 1.0.5 candidate passed the current-Mac sustained check; a subsequent
118
+ CI transport timeout exposed the separate stop-confirmation failure. Its
119
+ targeted verification and replacement candidate retain separate evidence.
120
+
121
+ Existing processes keep the implementation they started with. Quit and reopen
122
+ Harness normally to activate the update. An older active owned runtime should
123
+ finish and stop normally before it is reclaimed; do not force takeover based
124
+ on an incompatible identity marker.
125
+
126
+ ## 1.0.4
127
+
128
+ ### Summary
129
+
130
+ Session lists no longer run synchronous tmux client probes for each displayed
131
+ terminal. A bounded asynchronous snapshot supplies display information while
132
+ live process and terminal observations continue to guard control actions.
133
+
134
+ ### Highlights
135
+
136
+ - Share one short-lived tmux display snapshot across sessions. Cold, stale or
137
+ failed observations remain unknown, and pending probes stop with the runtime.
138
+ - Preserve live checks for terminal control, rebind, stop and ownership.
139
+ - Treat exited macOS zombie processes as dead, so shutdown waits can complete
140
+ while a parent has yet to reap the PID; malformed observations remain unknown.
141
+ - Include the HTTP method, request path, deadline and elapsed time in runtime
142
+ request failures, without request bodies, query parameters or credentials.
143
+ - Keep DeepSeek Harness on the existing npm `latest` channel.
144
+
145
+ ### Validation
146
+
147
+ Targeted tests cover slow probes, stale and failed snapshots, refresh coalescing,
148
+ shutdown and request diagnostics. Full regression, official installed Harness,
149
+ registry readback and current-Mac model checks have separate verification records.
150
+ The earlier 1.0.3 macOS CI timeout remains historical evidence: removing a known
151
+ blocking path does not identify the specific cause of that earlier timeout.
152
+ Regression shutdown tracks the exact fixture process identity, distinguishes
153
+ reused PIDs and zombies, and retains bounded failure diagnostics before cleanup.
154
+
155
+ ## 1.0.3
156
+
157
+ ### Summary
158
+
159
+ This maintenance release keeps DeepSeek Harness on the normal npm `latest`
160
+ channel and repairs the CLI, native-session and Web regressions identified while
161
+ archiving 1.0.2. It retains the verified Cordis cleanup and recovery behavior.
162
+
163
+ ### Highlights
164
+
165
+ - Preserve provider process identity during registration and discovery; update
166
+ owned hooks without discarding unrelated hooks or damaged user configuration.
167
+ - Keep explicit hook database routing and quote generated terminal arguments.
168
+ - Preserve the recorded origin of native submissions across restarts; peer
169
+ messages cannot gain local-user authority from their sender name or text.
170
+ - Keep managed state directories and database files private without replacing
171
+ existing data or changing external database parent permissions. Terminal stream
172
+ buffers follow each session's project.
173
+ - Bound streaming updates and long-message rendering while preserving complete
174
+ copied content, reader position, approval details and session ownership checks.
175
+ - Isolate request parsing failures, retain local/proxy access contracts, serialize
176
+ Web startup and resolve terminal assets with npm dependency hoisting.
177
+ - Native runtime ownership uses alternate ports for identifiable unrelated local
178
+ listeners while keeping one owner per project. Silent or legacy listeners are
179
+ rejected conservatively, and ownership remains until shutdown completes.
180
+
181
+ ### Validation
182
+
183
+ The full restored regression suite and the installed official Harness package
184
+ checks run against this composed release. The frozen file manifest and verification
185
+ record live under `docs/verification/`; those source-only records are excluded
186
+ from the npm package. Publication, current-device activation and real-model
187
+ acceptance are recorded separately from source and CI checks.
188
+
189
+ ## 1.0.2
190
+
191
+ ### Summary
192
+
193
+ DeepSeek Harness now joins hello-cc through project hooks, a Cordis collaboration
194
+ bundle, and owned ACP workers. This release promotes the runtime verified in
195
+ `1.0.2-dsh.3` to the normal npm `latest` channel. Runtime code is unchanged from
196
+ that candidate; version metadata and release documentation identify this release.
197
+
198
+ ### Highlights
199
+
200
+ - Harness Agents use their exact session and project identity for task, message,
201
+ lock, result, and handoff operations. Context acknowledgements follow committed
202
+ model input, and permission decisions retain the Harness policy chain.
203
+ - Owned ACP workers support queued prompts, scoped MCP tools, approvals,
204
+ interruption, session resume, and shutdown through the CLI and Web interface.
205
+ - Managed project configuration migrates verified paths from source checkouts to
206
+ installed packages while preserving user edits.
207
+ - Cordis sessions recover after a verified owner process exits; transient
208
+ database failures during retirement remain retryable while old tool authority
209
+ is revoked immediately.
210
+ - Node.js 24+ and official Harness `0.2.0-rc.2` are required. Supported hosts are
211
+ macOS and Linux; Windows uses WSL. Native Windows shells are not supported.
212
+
213
+ ### Validation
135
214
 
136
- Publication readback, registry installation, employee-device acceptance and
137
- genuine business acceptance remain distinct evidence categories. No result in
138
- one category automatically establishes another.
215
+ The byte-identical preview runtime passed macOS real-model installation checks
216
+ (11), Linux container installation and deterministic collaboration checks (8 + 7),
217
+ and frozen-package recovery tests (17). Its registry download and all 216
218
+ installed files matched the candidate. This stable package receives independent
219
+ release, installation, and registry readback checks. Other-device and genuine
220
+ business acceptance remain separate stages.
139
221
 
140
222
  ## 1.0.2-dsh.3
141
223
 
package/README.md CHANGED
@@ -43,20 +43,11 @@ grace. `hcc gc` retains history unless `--history` is explicit. `--tls` encrypts
43
43
  the console; `--trust-proxy` requires a fixed `--proxy-origin`. Two risks remain
44
44
  intentional: the default listener is plaintext HTTP on `0.0.0.0` for trusted
45
45
  LANs, and an authenticated browser may select any existing server directory.
46
- Managed `.hello-cc` state is private to the current OS user. Keep project roots
47
- behind cross-user-stable paths for project-local storage. For a root that
48
- another OS user could replace, hello-cc stores managed state under
49
- `~/.hello-cc/projects/<root-hash>/` instead. An existing project-local state
50
- must be migrated explicitly while every old writer is stopped:
51
- `hcc --root DIR migrate-state --offline --yes`. Migration keeps the original
52
- directory for recovery. If you set `--db` or `HCC_DB` outside managed state,
53
- secure that database and its parent directory yourself.
54
46
 
55
47
  ## Highlights
56
48
 
57
49
  - **Shared project memory**: peers, tasks, messages, locks, handoffs, and
58
- events are stored in a private managed `mesh.db` (project-local for stable
59
- roots, otherwise under the current user's home directory).
50
+ events are stored in `<project>/.hello-cc/mesh.db`.
60
51
  - **Real terminal control**: Web attaches to the same local tmux pane as your
61
52
  terminal, not a separate browser-only shell.
62
53
  - **Claude/Codex awareness**: hooks inject live `hcc` state before model turns,
package/README.zh-CN.md CHANGED
@@ -37,17 +37,10 @@ unknown 证据获得最长 120 秒宽限。`hcc gc` 默认保留历史,必须
37
37
  `--history`。`--tls` 提供传输加密;`--trust-proxy` 必须固定
38
38
  `--proxy-origin`。两项风险是有意保留的:默认在可信内网以明文 HTTP 监听
39
39
  `0.0.0.0`,且已认证浏览器可以选择服务器上任意已存在目录。
40
- 默认的 `.hello-cc` 状态目录仅允许当前系统用户访问。不要把项目根目录放在
41
- 不可信系统用户可写的位置;如果其他系统用户可替换项目路径,受管状态会改存于
42
- `~/.hello-cc/projects/<项目根路径哈希>/`。已有项目本地状态不会自动丢弃或迁移:
43
- 先停止所有旧进程及外部数据库写入者,再运行
44
- `hcc --root 目录 migrate-state --offline --yes`;原目录保留供恢复。
45
- 若通过 `--db` 或 `HCC_DB` 将数据库放在受管状态目录之外,请自行保护数据库及其
46
- 父目录的权限。
47
40
 
48
41
  ## 特色
49
42
 
50
- - **项目共享状态**:peers、tasks、messages、locks、handoffs 和 events 写入私有的 `mesh.db`;路径稳定时保留项目本地目录,否则存于当前用户的 home 目录。
43
+ - **项目本地共享状态**:peers、tasks、messages、locks、handoffs 和 events 写入 `<project>/.hello-cc/mesh.db`。
51
44
  - **Web 控制真实终端**:浏览器 attach 到和本地终端相同的 tmux pane,不是浏览器里另开的临时 shell。
52
45
  - **Claude/Codex 感知项目状态**:hooks 会在模型回答前注入实时 `hcc` 状态。
53
46
  - **减少编辑冲突**:通过 advisory lock 和 handoff 显式协调多 agent 修改。
@@ -0,0 +1,38 @@
1
+ # Codex 账号与限额
2
+
3
+ Web 专用 Codex App Server 和 HCC 托管的 Codex Native worker 都提供“账号与限额”折叠面板。打开对应会话后读取该执行器的账号状态,点击“刷新账号与限额”重新查询。观察窗口也可以读取;发送消息、中断或应答审批仍受当前控制权约束。Claude 和 dsh 没有此 Codex 面板。
4
+
5
+ ## 状态怎么理解
6
+
7
+ - **需要在本地 Codex 登录**:请在运行该任务的电脑完成 Codex 登录,再刷新面板。手机或另一台电脑上的 Web 登录不等于原执行器已登录。
8
+ - **ChatGPT 已登录**:显示 App Server 报告的套餐及可获得的用量窗口、重置时间、可用额度状态。账号已识别不等于真实模型调用已经通过。
9
+ - **供应商自行管理认证**:当前模型供应商不要求 OpenAI 登录。HCC 无法通过此接口确认供应商凭据或剩余配额,需通过该供应商的实际任务验证。
10
+ - **暂不可用 / 此版本未提供限额**:数据缺失或接口不支持,不能理解成零用量或无限额度。API key 和自定义供应商不会显示推测的 ChatGPT 订阅配额。
11
+ - **历史状态,待刷新**:执行器断开或读取失败时,旧用量保留并明确标记,不能作为当前状态。账号变更则清除旧账号的配额,再读当前账号。
12
+
13
+ 多个配额桶分别展示,缺失的窗口保持未知;已读取的 0% 用量会正常显示。界面同时标注账号和限额的读取时间。输出流、刷新和执行器替换不会让旧请求覆盖新状态;切走再返回后,过期响应被丢弃,刷新按钮可继续使用。
14
+
15
+ ## 读取范围
16
+
17
+ 两条公开入口都是需要 Web 认证的只读 GET;请求须携带现有 API 版本头 `X-HCC-API-Version: 2`:
18
+
19
+ | 会话 | 入口 | 必须匹配的身份 |
20
+ | --- | --- | --- |
21
+ | Web 专用 Codex | `/api/sessions/:id/codex/account` | `root`、当前 `executorId` |
22
+ | 原生 Codex worker | `/api/sessions/:id/native/account` | `root`、当前 `generation`、`owner`、`sessionId` |
23
+
24
+ 身份都通过 query 参数传入。原执行器在查询期间被替换时,响应重新核对身份;旧页面不能借此查询新实例。刷新不提交 turn、task、消息或 mutation receipt,不需要控制租约 token/epoch。
25
+
26
+ 底层仅调用 `account/read`(`refreshToken: false`),以及适用 ChatGPT 订阅时的 `account/rateLimits/read`。账号/限额通知更新当前执行器状态;登录完成通知仍需要读取当前账号后才能显示已登录。并发刷新合并为同一读取,账号变更与通知使旧响应失效。
27
+
28
+ HCC 投影只保留必要状态。邮箱、凭据 ID、token、额度余额/支出和原始账号错误不进入面板、账号事件或接口响应;账号数据不写入浏览器存储。此功能不提供登录、退出登录、设备码登录、凭据保存或外部 token 刷新。执行器本身的认证生命周期仍由 Codex 管理。
29
+
30
+ ## 协议与验收边界
31
+
32
+ 基线为已安装 Codex 0.144.6;升级检查覆盖 57 项交接契约,其中包含本功能的方法、通知和必要字段。账号 Schema 从官方生成物的 `json-schema/v2/` 读取。运行方式见 [Codex 协议升级检查](codex-protocol.md)。
33
+
34
+ 真实安装版 App Server 已在隔离 HOME/CODEX_HOME 中分别验证 Web 和 Native 的未登录、自定义供应商状态,共 4 项;原执行器/会话保持不变,没有模型调用,也没有读取现有账号。桌面 1440×1000、手机 390×844 和观察窗口通过真实 HTTP/SQLite/JSON-RPC 的浏览器检查;ChatGPT 配额、多窗口、账号变更与不支持接口由模拟 provider 覆盖。这些结果不等于真实 ChatGPT 订阅限额或外部账号业务验收。
35
+
36
+ 浏览器验收入口为 `scripts/web-codex-account-acceptance.mjs --run --output NEW_RECEIPT`,需要通过 `HCC_ACCEPTANCE_PLAYWRIGHT` 和 `HCC_ACCEPTANCE_CHROME` 指定现有 Playwright 模块和 Chrome 可执行文件。脚本使用隔离项目、tmux、HOME/CODEX_HOME 和模拟 App Server,不调用模型;默认仅显示帮助。截图与 JSON 回执写到源码目录之外。
37
+
38
+ 官方接口参考:<https://developers.openai.com/codex/app-server/>。当前 HCC 未实现 `account/chatgptAuthTokens/refresh`;所验收的 0.144.6 生成 Schema 将 `chatgptAuthTokens` 登录模式标为内部使用,后续版本需按其实际生成协议重新评估。
@@ -0,0 +1,59 @@
1
+ # Codex protocol generation and upgrade check / 协议升级检查
2
+
3
+ HCC uses the installed Codex App Server over stdio for structured Web sessions
4
+ and independent native workers. Before upgrading that executable, generate its
5
+ own protocol and check the HCC subset:
6
+
7
+ ```sh
8
+ npm run codex:protocol -- --codex-bin /absolute/path/to/codex --out /tmp/hcc-protocol-new
9
+ ```
10
+
11
+ The output directory must not exist, and its parent must exist. Without `--out`,
12
+ the script retains a new private temporary protocol directory and prints its
13
+ path. From an installed package, the same command is:
14
+
15
+ ```sh
16
+ node /absolute/path/to/hello-cc/scripts/codex-protocol.mjs --codex-bin /absolute/path/to/codex --out /tmp/hcc-protocol-new
17
+ ```
18
+
19
+ The script uses isolated HOME/CODEX_HOME directories and runs only `--version`,
20
+ `app-server generate-ts`, and `app-server generate-json-schema`. Both generators
21
+ include `--experimental` because HCC's interactive thread configuration exposes
22
+ experimental permission and user-input tools. It does not start an App Server,
23
+ call a model, read an account, or modify login/trust configuration.
24
+
25
+ The output contains:
26
+
27
+ - `typescript/`: official generated TypeScript bindings.
28
+ - `json-schema/`: official generated JSON Schema documents.
29
+ - `manifest.json`: Codex version, commands, per-file SHA-256, bundle fingerprint,
30
+ 57 HCC contract checks, and unsupported server requests.
31
+
32
+ The check covers method availability, the thread/turn notifications consumed by
33
+ HCC, human response fields and choices, MCP form/URL identity, and read-only account/quota methods, notifications and fields.
34
+ Account schemas are read from the official `json-schema/v2/` directory. A missing
35
+ contract or a new required response field returns exit code 1. Unsupported
36
+ requests remain listed separately even when the supported subset passes.
37
+ Optional fields do not fail this gate. It is a bounded compatibility check;
38
+ it does not validate every nested request type, replace runtime validation,
39
+ or prove transport/model/business acceptance. Keep the manifest and rerun the
40
+ installed acceptance scripts before accepting a new Codex version.
41
+
42
+ Official generator reference: <https://developers.openai.com/codex/app-server/>.
43
+ The local official-protocol fixture in `test/fixtures/codex-protocol-0.144.6.json`
44
+ was extracted from installed Codex 0.144.6 on 2026-10-03. It retains method
45
+ registries and the relevant interaction and account schemas, rather than claiming that
46
+ all generated methods are implemented.
47
+
48
+ ## 中文说明
49
+
50
+ 升级 Codex 前运行上述命令,生成的是指定已安装版本自身的协议。协议目录必须是
51
+ 新目录;工具不覆盖旧证据。生成物包括官方 TypeScript、JSON Schema 和带版本/
52
+ 文件指纹的检查清单。
53
+
54
+ 当前检查覆盖 57 项交接契约:客户端方法、轮次通知、人工答复字段/可选决策、
55
+ MCP 表单/URL 请求身份,以及只读账号/限额的方法、通知和必要字段。账号 Schema
56
+ 从官方生成的 `json-schema/v2/` 读取。缺少方法、改变关键决策或新增 HCC 无法答复的必填字段时
57
+ 返回非零退出码。账号 token 刷新、动态工具、扩展验证等未接入请求会单独列出,
58
+ 不会因为生成成功而被视为已支持。该检查没有把运行时整体迁移为强类型协议,也不
59
+ 代表新版本已完成真实模型、外部账户授权、发布或设备验收。
package/docs/commands.md CHANGED
@@ -14,36 +14,12 @@ authenticated access to any existing server directory are accepted risks.
14
14
 
15
15
  ```text
16
16
  hcc update [--tag TAG] [--registry URL] [--dry-run]
17
- hcc --root DIR migrate-state --offline --yes
18
17
  hcc uninstall [--purge --yes]
19
18
  ```
20
19
 
21
- `hcc update` updates the global npm install. If another OS user can replace a
22
- project path, managed state is kept in a private directory under the current
23
- user's home. Existing project-local `.hello-cc` data requires an explicit
24
- offline migration: stop all hello-cc and external writers first, then run
25
- `migrate-state --offline --yes`. It copies SQLite snapshots (including WAL
26
- contents) and other validated state, keeps the old directory untouched, and
27
- rebuilds managed DSH path-bound configuration. Do not restart an old writer
28
- against the retained directory. `hcc uninstall` removes local hooks, shims,
29
- and the shell PATH entry; add `--purge --yes` only when you also want to remove
30
- the selected current project's managed data and guidance blocks. A retained
31
- legacy migration source is not deleted by purge.
32
- Private-state creation and purge leave a durable authority marker so a retained
33
- or newly written project-local database cannot silently become active again.
34
- After purge, a remaining legacy directory still requires an explicit offline
35
- `migrate-state --offline --yes`; if no legacy directory remains, a fresh `init`
36
- creates new private state. If a private store disappears without an explicit
37
- purge, restore it from backup or use `uninstall --purge --yes` to deliberately
38
- discard the missing state before starting fresh.
39
- An interrupted private purge stays marked `purging`; normal access fails closed.
40
- After confirming old writers are stopped, repeat `uninstall --purge --yes` to
41
- finish deleting that private store. If the project root is replaced by a new
42
- directory at the same path, its inode no longer matches the old private binding.
43
- The CLI intentionally refuses automatic purge or rebinding: preserve and back
44
- up both the old private store and its `.authority.json` marker, stop all writers,
45
- and have an operator compare the old and new root identities before a manual
46
- recovery. Do not delete the marker alone or point the new root at the old data.
20
+ `hcc update` updates the global npm install. `hcc uninstall` removes local
21
+ hooks, shims, and the shell PATH entry; add `--purge --yes` only when you also want to remove the
22
+ current project's `.hello-cc` data and guidance blocks.
47
23
 
48
24
  ## Read-only Diagnostics
49
25
 
@@ -78,9 +54,18 @@ Use `--local` to bind only `127.0.0.1`, `--token` or `HCC_WEB_TOKEN` to set an
78
54
  explicit token, `HCC_RUNTIME_CA` to trust a private HTTPS Runtime API CA, and
79
55
  `--no-token` only in trusted local/test environments. Use `hcc up` only when you
80
56
  want coordination without the Web console or shims. Provider shims only join
81
- projects with a managed `runtime.json` from `hcc web`; they do not use a
57
+ projects with a local `.hello-cc/runtime.json` from `hcc web`; they do not use a
82
58
  global runtime to manage arbitrary directories.
83
59
 
60
+ One browser can sign in to multiple Web instances on different listener ports
61
+ of the same host without refresh or logout replacing another instance's login.
62
+ Cookie names use the protocol and actual listener port, or the fixed
63
+ `--proxy-origin` protocol and port behind a trusted reverse proxy. Sign in again
64
+ after upgrading; legacy cookies are neither reused nor cleared. This prevents
65
+ accidental collisions and is not a browser security boundary. When separate SSH
66
+ tunnels map the same remote listener port to different local ports, use separate
67
+ browser profiles or hostnames: the direct listener cannot identify that mapping.
68
+
84
69
  ## Native Workers
85
70
 
86
71
  ```text
@@ -12,28 +12,12 @@ unknown 证据获得 120 秒宽限;历史清理必须显式使用 `gc --histor
12
12
 
13
13
  ```text
14
14
  hcc update [--tag TAG] [--registry URL] [--dry-run]
15
- hcc --root 目录 migrate-state --offline --yes
16
15
  hcc uninstall [--purge --yes]
17
16
  ```
18
17
 
19
- `hcc update` 更新全局 npm 安装。如果其他系统用户可替换项目路径,受管状态会放在
20
- 当前用户 home 下的私有目录。已有项目本地 `.hello-cc` 必须离线迁移:先停止
21
- 所有 hello-cc 进程和外部写入者,再显式执行 `migrate-state --offline --yes`。
22
- 迁移会复制包含 WAL 内容的 SQLite 快照和其他经检查的状态,保留原目录,
23
- 并重建由 hello-cc 管理且绑定旧绝对路径的 DSH 配置。不要让旧版写入者继续写原目录。
24
- `hcc uninstall` 移除本机 hooks、shims 和 shell PATH 配置;只有在确定也要删除
25
- 当前项目选定的受管数据和指导块时,才加 `--purge --yes`。迁移后保留的旧目录
26
- 不会被 purge 删除。
27
- 新建或 purge 私有数据后仍保留持久的权威标记,防止保留或后来写入的项目本地数据库
28
- 自动重新生效。purge 后若旧目录仍在,必须停止所有旧写入者并显式执行
29
- `migrate-state --offline --yes`;若旧目录已不存在,可重新运行 `init` 创建新的私有
30
- 状态。如果私有目录未经 purge 就丢失,请从备份恢复,或通过
31
- `uninstall --purge --yes` 明确放弃已丢失的状态后重新初始化。
32
- 私有状态的 purge 若中断,会保留 `purging` 标记并拒绝正常访问。确认旧写入者均已停止后,
33
- 再次运行 `uninstall --purge --yes` 完成删除。若项目根目录在同一路径被新目录替换,
34
- 新 inode 与旧私有绑定不符;CLI 会拒绝自动 purge 或重绑。请先保留并备份旧私有状态目录
35
- 及其 `.authority.json` 标记,停止所有写入者,由管理员核对新旧根目录身份后再人工恢复。
36
- 不要只删除标记,也不要让新根目录直接使用旧数据。
18
+ `hcc update` 更新全局 npm 安装。`hcc uninstall` 移除本机 hooks、shims 和 shell PATH 配置;
19
+ 只有在确定也要删除当前项目的 `.hello-cc` 数据和指导块时,才加
20
+ `--purge --yes`。
37
21
 
38
22
  ## 只读诊断
39
23
 
@@ -64,9 +48,16 @@ runtime 生成 URL token。用 `--local` 可只绑定 `127.0.0.1`,用 `--token
64
48
  `HCC_WEB_TOKEN` 可设置显式 token;私有 HTTPS Runtime API CA 用
65
49
  `HCC_RUNTIME_CA` 指定。只有在可信本地/测试环境才使用 `--no-token`。
66
50
  只想使用本地协作、不需要 Web 或 shims 时,再使用 `hcc up`。provider shim 只会加入
67
- 已经由 `hcc web` 生成受管 `runtime.json` 的项目,不会使用全局 runtime
51
+ 已经由 `hcc web` 生成本地 `.hello-cc/runtime.json` 的项目,不会使用全局 runtime
68
52
  去管理任意目录。
69
53
 
54
+ 同一浏览器可以登录同一主机上不同监听端口的多个 Web 实例,刷新或退出其中
55
+ 一个不会覆盖另一个的登录。Cookie 按协议与实际监听端口命名;可信反向代理
56
+ 使用固定 `--proxy-origin` 的协议与端口。升级后需重新登录,旧版 Cookie 不会
57
+ 被复用或清除。这用于避免实例间的意外覆盖,不是浏览器安全隔离边界。
58
+ 若多个 SSH 隧道把相同的远端监听端口映射到不同本地端口,应使用独立浏览器
59
+ 配置文件或不同主机名;服务端无法从直连配置识别此端口映射。
60
+
70
61
  ## Native 后台 worker
71
62
 
72
63
  ```text
package/docs/dsh.md CHANGED
@@ -8,7 +8,7 @@ The tested runtime is `@deepseek-ai/dsh@0.2.0-rc.2`, with matching plugin versio
8
8
 
9
9
  Supported hosts are Linux and macOS; on Windows use WSL. Native Windows shells are not supported. Device acceptance must be recorded separately from container verification.
10
10
 
11
- The source and real DeepSeek model acceptance are complete locally; no new npm release has been published. Use this checkout's CLI when testing:
11
+ This integration has been included since hello-cc 1.0.2 on the normal npm `latest` channel. With Node.js 24+, install it using `npm install -g @logicseek/hello-cc`. To test a source checkout instead, use:
12
12
 
13
13
  ```bash
14
14
  node /absolute/path/to/hello-cc/bin/hcc.mjs --root /path/to/project dsh setup --mode cordis
@@ -18,6 +18,8 @@ node /absolute/path/to/hello-cc/bin/hcc.mjs --root /path/to/project dsh web -- -
18
18
 
19
19
  Below, `hcc` means a CLI containing these changes. An older global installation may not include them.
20
20
 
21
+ macOS 1.0.5 upgrades use a stable boot-session identity. Follow the [process identity migration notes](macos-process-identity.md) and restart owned runtimes normally.
22
+
21
23
  ## Choose An Entry Point
22
24
 
23
25
  | Entry | Use | Lifecycle owner |
@@ -113,7 +115,7 @@ Project overlays work directly from source. The managed manifest records the Cor
113
115
 
114
116
  ```bash
115
117
  npm pack --ignore-scripts
116
- dsh plugin --profile web add /absolute/path/to/logicseek-hello-cc-1.0.1.tgz
118
+ dsh plugin --profile web add /absolute/path/to/logicseek-hello-cc-1.0.5.tgz
117
119
  ```
118
120
 
119
121
  Harness requires explicit approval for native dependency builds. If add returns `ERR_PNPM_IGNORED_BUILDS`, merge the following into the selected profile's `pnpm-workspace.yaml` and rerun the same add command. The default path is `~/.dsh/profiles/web/pnpm-workspace.yaml`; use the configured DSH_HOME when different. Preserve existing settings and approve only the candidate's pinned native dependency:
@@ -123,7 +125,7 @@ allowBuilds:
123
125
  node-pty@1.2.0-beta.15: true
124
126
  ```
125
127
 
126
- Harness selects bundles through the profile's `dsh.profile.bundles`; do not also load the project Cordis/hooks overlay. Actual npm installation, official add/repeated add/remove, profile resolution and real-model collaboration calls have passed. The actual macOS desktop profile was installed and hot-loaded on 2026-10-02. Its paired ACP worker completed real collaboration calls using the existing DeepSeek route. The initially configured desktop sub2api model returned HTTP 403 because that account only accepts official Codex clients. After the desktop default was observed to have changed to official DeepSeek, a new session completed hcc_state, hcc_message_send and a real completed turn with that existing selection. The original sub2api route restriction remains. npm publication was not performed. Harness manages profile package removal; project-overlay integration is disabled with `setup --mode off`.
128
+ Harness selects bundles through the profile's `dsh.profile.bundles`; do not also load the project Cordis/hooks overlay. Actual npm installation, official add/repeated add/remove, profile resolution and real-model collaboration calls have passed. The actual macOS desktop profile was installed and hot-loaded on 2026-10-02. Its paired ACP worker completed real collaboration calls using the existing DeepSeek route. The initially configured desktop sub2api model returned HTTP 403 because that account only accepts official Codex clients. After the desktop default was observed to have changed to official DeepSeek, a new session completed hcc_state, hcc_message_send and a real completed turn with that existing selection. The original sub2api route restriction remains. Maintenance releases use the normal npm latest channel. Harness manages profile package removal; project-overlay integration is disabled with `setup --mode off`.
127
129
 
128
130
  See Cordis/native acceptance (source checkout: `docs/verification/2026-10-02-dsh-cordis-native.md`), bridge acceptance (source checkout: `docs/verification/2026-10-02-dsh-official-bridge.md`), and the integration plan (source checkout: `docs/plans/2026-10-02-dsh-integration.md`). Real-model checks used temporary projects and owned processes, without replacing existing user sessions. The isolated order fixture passed artifact/evidence/handoff/lock-release/task-completion checks. See the Mac device receipt (source checkout: `docs/verification/2026-10-02-dsh-device-install.md`). Publication, deployment, other-device installation and genuine business acceptance remain separate delivery stages.
129
131