@timurproko/a1 0.2.7-dev.754 → 0.2.7-dev.772

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 (217) hide show
  1. package/README.md +30 -0
  2. package/bin/cli.js +4 -0
  3. package/bin/guardian.js +5 -0
  4. package/bin/tab-launch-context.d.ts +26 -0
  5. package/bin/tab-launch-context.js +94 -0
  6. package/bin/ui.js +24 -6
  7. package/dist/app/session-shell/helper-pool.d.ts +3 -5
  8. package/dist/app/session-shell/helper-pool.js +3 -5
  9. package/dist/app/session-shell/session-shell-root.d.ts +28 -1
  10. package/dist/app/session-shell/session-shell-root.js +4 -3
  11. package/dist/app/session-shell/session-shell.js +149 -31
  12. package/dist/app/session-shell/session-viewport-controller.d.ts +1 -1
  13. package/dist/app/session-shell/session-viewport-controller.js +3 -3
  14. package/dist/app/session-shell/shell-host.d.ts +2 -0
  15. package/dist/app/session-shell/shell-host.js +20 -1
  16. package/dist/cli/dispatch.d.ts +11 -1
  17. package/dist/cli/dispatch.js +79 -5
  18. package/dist/cli/tabs-request.d.ts +7 -0
  19. package/dist/cli/tabs-request.js +1 -0
  20. package/dist/cli/tabs.d.ts +14 -0
  21. package/dist/cli/tabs.js +140 -0
  22. package/dist/composition/owned-ui.d.ts +26 -0
  23. package/dist/composition/owned-ui.js +176 -6
  24. package/dist/contracts/owned-ui/session-backend.d.ts +1 -0
  25. package/dist/features/launch/index.d.ts +1 -1
  26. package/dist/features/launch/intent.d.ts +3 -1
  27. package/dist/features/launch/intent.js +7 -4
  28. package/dist/features/owned-ui/settings-app.js +8 -35
  29. package/dist/features/resident-tab/auto-name.d.ts +11 -0
  30. package/dist/features/resident-tab/auto-name.js +42 -0
  31. package/dist/features/resident-tab/index.d.ts +3 -0
  32. package/dist/features/resident-tab/index.js +3 -0
  33. package/dist/features/resident-tab/shortcuts.d.ts +10 -0
  34. package/dist/features/resident-tab/shortcuts.js +35 -0
  35. package/dist/features/resident-tab/status-deriver.d.ts +9 -0
  36. package/dist/features/resident-tab/status-deriver.js +15 -0
  37. package/dist/foundation/launch-context/index.d.ts +10 -0
  38. package/dist/foundation/launch-context/index.js +25 -0
  39. package/dist/foundation/launch-guardian/main.d.ts +5 -0
  40. package/dist/foundation/launch-guardian/main.js +2 -1
  41. package/dist/foundation/release/bootstrap.d.ts +6 -0
  42. package/dist/foundation/release/bootstrap.js +51 -10
  43. package/dist/foundation/release/cohort-state.d.ts +1 -1
  44. package/dist/foundation/release/cohort-state.js +1 -1
  45. package/dist/foundation/release/dependency-certification.js +54 -19
  46. package/dist/foundation/release/progress-palette.generated.d.ts +2 -2
  47. package/dist/foundation/release/progress-palette.generated.js +2 -2
  48. package/dist/foundation/release/release-gc.d.ts +3 -0
  49. package/dist/foundation/release/release-gc.js +44 -8
  50. package/dist/foundation/resident-tabs/bounded-host-command.d.ts +16 -0
  51. package/dist/foundation/resident-tabs/bounded-host-command.js +35 -0
  52. package/dist/foundation/resident-tabs/bridge-client.d.ts +56 -0
  53. package/dist/foundation/resident-tabs/bridge-client.js +279 -0
  54. package/dist/foundation/resident-tabs/doctor.d.ts +29 -0
  55. package/dist/foundation/resident-tabs/doctor.js +166 -0
  56. package/dist/foundation/resident-tabs/draft-checkpoint.d.ts +27 -0
  57. package/dist/foundation/resident-tabs/draft-checkpoint.js +145 -0
  58. package/dist/foundation/resident-tabs/ensure-terminal-host.d.ts +31 -0
  59. package/dist/foundation/resident-tabs/ensure-terminal-host.js +147 -0
  60. package/dist/foundation/resident-tabs/fault-injection.d.ts +8 -0
  61. package/dist/foundation/resident-tabs/fault-injection.js +26 -0
  62. package/dist/foundation/resident-tabs/index.d.ts +12 -0
  63. package/dist/foundation/resident-tabs/index.js +6 -0
  64. package/dist/foundation/resident-tabs/maintenance.d.ts +42 -0
  65. package/dist/foundation/resident-tabs/maintenance.js +78 -0
  66. package/dist/foundation/resident-tabs/prompt-journal.d.ts +65 -0
  67. package/dist/foundation/resident-tabs/prompt-journal.js +214 -0
  68. package/dist/foundation/resident-tabs/protocol.d.ts +12 -0
  69. package/dist/foundation/resident-tabs/protocol.js +195 -0
  70. package/dist/foundation/resident-tabs/recovery.d.ts +26 -0
  71. package/dist/foundation/resident-tabs/recovery.js +205 -0
  72. package/dist/foundation/resident-tabs/release-holds.d.ts +27 -0
  73. package/dist/foundation/resident-tabs/release-holds.js +77 -0
  74. package/dist/foundation/resident-tabs/routing.d.ts +11 -0
  75. package/dist/foundation/resident-tabs/routing.js +10 -0
  76. package/dist/foundation/resident-tabs/session-sync.d.ts +14 -0
  77. package/dist/foundation/resident-tabs/session-sync.js +37 -0
  78. package/dist/foundation/resident-tabs/settings.d.ts +14 -0
  79. package/dist/foundation/resident-tabs/settings.js +66 -0
  80. package/dist/foundation/resident-tabs/terminal-host-artifact.d.ts +18 -0
  81. package/dist/foundation/resident-tabs/terminal-host-artifact.js +53 -0
  82. package/dist/foundation/resident-tabs/zip-archive.d.ts +9 -0
  83. package/dist/foundation/resident-tabs/zip-archive.js +56 -0
  84. package/dist/foundation/session-writer-lock/index.d.ts +32 -0
  85. package/dist/foundation/session-writer-lock/index.js +201 -0
  86. package/dist/foundation/startup/startup-descriptor.js +2 -2
  87. package/dist/foundation/terminal-cleanup/index.d.ts +1 -1
  88. package/dist/foundation/terminal-cleanup/index.js +1 -1
  89. package/dist/foundation/terminal-cleanup/terminal-reset.d.ts +1 -0
  90. package/dist/foundation/terminal-cleanup/terminal-reset.js +1 -0
  91. package/dist/integrations/pi/components/owned-editor-ux.d.ts +1 -1
  92. package/dist/integrations/pi/components/owned-editor-ux.js +2 -2
  93. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +4 -4
  94. package/dist/integrations/pi/components/resources/builtin-themes.js +4 -4
  95. package/dist/integrations/pi/components/shell-hotkey-sections.js +1 -1
  96. package/dist/integrations/pi/components/shell-presenters-info.d.ts +4 -2
  97. package/dist/integrations/pi/components/shell-presenters-info.js +38 -4
  98. package/dist/integrations/pi/components/shell-shared-facade.d.ts +1 -1
  99. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +1 -1
  100. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +17 -4
  101. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
  102. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
  103. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
  104. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +1 -1
  105. package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
  106. package/dist/integrations/pi/components/upstream/components/extension-input.js +1 -1
  107. package/dist/integrations/pi/components/upstream/components/extension-selector.js +1 -1
  108. package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
  109. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +1 -1
  110. package/dist/integrations/pi/components/upstream/components/owned-editor.js +1 -1
  111. package/dist/integrations/pi/components/upstream/components/pi-logo.js +1 -1
  112. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +1 -1
  113. package/dist/integrations/pi/components/upstream/components/session-footer.js +1 -1
  114. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
  115. package/dist/integrations/pi/components/upstream/components/session-selector.js +1 -1
  116. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
  117. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
  118. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +2 -2
  119. package/dist/integrations/pi/components/upstream/components/status-indicator.js +3 -3
  120. package/dist/integrations/pi/components/upstream/components/themed-text.d.ts +1 -1
  121. package/dist/integrations/pi/components/upstream/components/themed-text.js +1 -1
  122. package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +1 -1
  123. package/dist/integrations/pi/components/upstream/components/thinking-selector.js +1 -1
  124. package/dist/integrations/pi/components/upstream/components/tool-execution.d.ts +0 -2
  125. package/dist/integrations/pi/components/upstream/components/tool-execution.js +41 -20
  126. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +1 -1
  127. package/dist/integrations/pi/components/upstream/components/tree-selector.js +1 -1
  128. package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
  129. package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
  130. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +2 -2
  131. package/dist/integrations/pi/components/upstream/history/editor-core.js +5 -5
  132. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
  133. package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
  134. package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
  135. package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
  136. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
  137. package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
  138. package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
  139. package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
  140. package/dist/integrations/pi/components/upstream/program-status-reporter.d.ts +1 -1
  141. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +1 -1
  142. package/dist/integrations/pi/components/upstream/theme/theme.d.ts +3 -0
  143. package/dist/integrations/pi/components/upstream/theme/theme.js +24 -1
  144. package/dist/integrations/pi/engine/adapter.d.ts +1 -0
  145. package/dist/integrations/pi/engine/adapter.js +4 -0
  146. package/dist/integrations/pi/engine/pi-settings-metadata.json +2 -2
  147. package/dist/integrations/pi/engine/prompt-suggestions.d.ts +1 -0
  148. package/dist/integrations/pi/engine/prompt-suggestions.js +40 -0
  149. package/dist/integrations/pi/engine/resources/changelog.json +4 -4
  150. package/dist/integrations/pi/engine/runtime-integration.js +102 -29
  151. package/dist/integrations/pi/engine/session-runtime.d.ts +0 -6
  152. package/dist/integrations/pi/engine/session-runtime.js +8 -3
  153. package/dist/integrations/pi/engine/session-selection.d.ts +3 -0
  154. package/dist/integrations/pi/engine/session-selection.js +45 -9
  155. package/dist/integrations/pi/engine/workflow-contexts.js +10 -1
  156. package/dist/integrations/pi/startup-public.js +152 -222
  157. package/dist/integrations/pi/startup-public.manifest.json +266 -177
  158. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +1 -1
  159. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +1 -1
  160. package/dist/native/darwin-arm64/a1_session_lock.node +0 -0
  161. package/dist/native/darwin-arm64/manifest.json +1 -1
  162. package/dist/native/darwin-arm64/terminal-host +0 -0
  163. package/dist/native/darwin-arm64/terminal-host-THIRD-PARTY-NOTICES.txt +10500 -0
  164. package/dist/native/darwin-arm64/terminal-host.manifest.json +44 -0
  165. package/dist/native/darwin-x64/a1_session_lock.node +0 -0
  166. package/dist/native/darwin-x64/manifest.json +20 -0
  167. package/dist/native/darwin-x64/process-guardian +0 -0
  168. package/dist/native/darwin-x64/terminal-host +0 -0
  169. package/dist/native/darwin-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10737 -0
  170. package/dist/native/darwin-x64/terminal-host.manifest.json +44 -0
  171. package/dist/native/linux-x64/a1_session_lock.node +0 -0
  172. package/dist/native/linux-x64/manifest.json +1 -1
  173. package/dist/native/linux-x64/terminal-host +0 -0
  174. package/dist/native/linux-x64/terminal-host-THIRD-PARTY-NOTICES.txt +11226 -0
  175. package/dist/native/linux-x64/terminal-host.manifest.json +44 -0
  176. package/dist/native/win32-x64/a1_session_lock.node +0 -0
  177. package/dist/native/win32-x64/manifest.json +2 -2
  178. package/dist/native/win32-x64/process-guardian.exe +0 -0
  179. package/dist/native/win32-x64/terminal-host-THIRD-PARTY-NOTICES.txt +10757 -0
  180. package/dist/native/win32-x64/terminal-host.exe +0 -0
  181. package/dist/native/win32-x64/terminal-host.manifest.json +44 -0
  182. package/dist/product-identity.d.ts +1 -1
  183. package/dist/product-identity.js +1 -1
  184. package/dist/product-identity.json +5 -0
  185. package/dist/runtime-payload-inventory.json +5349 -6035
  186. package/dist/ui/components/line-input.d.ts +1 -1
  187. package/dist/ui/components/prompt-input.d.ts +7 -5
  188. package/dist/ui/components/prompt-input.js +7 -7
  189. package/dist/ui/components/transcript-viewport.d.ts +6 -3
  190. package/dist/ui/components/transcript-viewport.js +13 -15
  191. package/dist/ui/settings/declarations.d.ts +25 -1
  192. package/dist/ui/settings/declarations.js +21 -1
  193. package/dist/ui/settings/index.d.ts +4 -2
  194. package/dist/ui/settings/index.js +2 -1
  195. package/dist/ui/settings/manager.d.ts +10 -3
  196. package/dist/ui/settings/manager.js +90 -30
  197. package/dist/ui/settings/migrations.d.ts +6 -0
  198. package/dist/ui/settings/migrations.js +44 -0
  199. package/dist/ui/settings/profile-document.d.ts +26 -0
  200. package/dist/ui/settings/profile-document.js +164 -0
  201. package/docs/architecture/evidence/resident-tabs/linux-x64.md +37 -0
  202. package/docs/architecture/evidence/resident-tabs/macos-arm64.md +36 -0
  203. package/docs/architecture/evidence/resident-tabs/macos-x64.md +35 -0
  204. package/docs/architecture/evidence/resident-tabs/windows-x64.md +36 -0
  205. package/docs/architecture/internal-naming.md +3 -1
  206. package/docs/architecture/process-guardian-provenance.md +2 -0
  207. package/docs/architecture/resident-tabs-requirements.md +18 -0
  208. package/docs/architecture/resident-tabs.md +594 -0
  209. package/docs/architecture/terminal-host-proof-gate.md +2 -0
  210. package/docs/architecture/terminal-host-provenance.md +13 -3
  211. package/docs/architecture/toolchain.md +1 -1
  212. package/docs/ci-release-runbook.md +2 -2
  213. package/docs/features/launch-profiles.md +11 -8
  214. package/docs/manual-resident-tabs-acceptance.md +51 -0
  215. package/docs/openspec-archive-automation.md +17 -16
  216. package/docs/validation.md +9 -1
  217. package/package.json +10 -4
@@ -0,0 +1,164 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
3
+ import { dirname } from "node:path";
4
+ import lockfile from "proper-lockfile";
5
+ const NAMESPACE_PATTERN = /^[a-z][a-z0-9-]*$/;
6
+ const MAX_RECOVERABLE_PREFIX_BYTES = 256;
7
+ /** Refuse an injected namespace already claimed by the surrounding root schema. */
8
+ export function assertProfileSettingsNamespaceAvailable(namespace, rootSettingKeys) {
9
+ assertNamespace(namespace);
10
+ if (rootSettingKeys.includes(namespace))
11
+ throw new Error(`profile settings namespace collides with a root setting: ${namespace}`);
12
+ }
13
+ /** Read one product-owned root object without exposing unrelated profile settings. */
14
+ export function readProfileSettingsNamespace(file, namespace) {
15
+ assertNamespace(namespace);
16
+ let raw;
17
+ try {
18
+ raw = readFileSync(file, "utf8");
19
+ }
20
+ catch (error) {
21
+ if (isMissing(error))
22
+ return { status: "missing", value: null };
23
+ return { status: "invalid", value: null, detail: `${file} could not be read: ${describe(error)}` };
24
+ }
25
+ const root = parseRoot(raw);
26
+ if (root === null)
27
+ return { status: "invalid", value: null, detail: `${file} is not a valid settings object` };
28
+ if (!Object.hasOwn(root, namespace))
29
+ return { status: "missing", value: null };
30
+ const value = root[namespace];
31
+ if (!isRecord(value)) {
32
+ return { status: "invalid", value: null, detail: `${file} contains a non-object ${namespace} settings namespace` };
33
+ }
34
+ return { status: "available", value: Object.freeze({ ...value }) };
35
+ }
36
+ /**
37
+ * Remove bounded leading noise only when the remaining bytes are one complete root object.
38
+ * The repair is silent and uses the same lock and atomic replacement path as namespace writes.
39
+ */
40
+ export function repairProfileSettingsDocument(file) {
41
+ if (!existsSync(file))
42
+ return false;
43
+ const release = acquireLock(file);
44
+ try {
45
+ if (!existsSync(file))
46
+ return false;
47
+ const raw = readFileSync(file, "utf8");
48
+ if (parseRoot(raw) !== null)
49
+ return false;
50
+ const root = parseRootAfterLeadingNoise(raw);
51
+ if (root === null)
52
+ return false;
53
+ replaceRoot(file, root);
54
+ return true;
55
+ }
56
+ finally {
57
+ release();
58
+ }
59
+ }
60
+ /**
61
+ * Replace one root namespace through the lock protocol used by pinned Pi.
62
+ * The updater receives bytes reread while locked, so unrelated concurrent writes survive.
63
+ */
64
+ export function updateProfileSettingsNamespace(file, namespace, update) {
65
+ assertNamespace(namespace);
66
+ mkdirSync(dirname(file), { recursive: true, mode: 0o700 });
67
+ const release = acquireLock(file);
68
+ try {
69
+ const root = existsSync(file) ? parseRoot(readFileSync(file, "utf8")) : {};
70
+ if (root === null)
71
+ throw new Error(`${file} is not a valid settings object`);
72
+ const existing = root[namespace];
73
+ if (existing !== undefined && !isRecord(existing)) {
74
+ throw new Error(`${file} contains a non-object ${namespace} settings namespace`);
75
+ }
76
+ const nextNamespace = update(existing === undefined ? null : Object.freeze({ ...existing }));
77
+ const nextRoot = { ...root };
78
+ if (nextNamespace === null || Object.keys(nextNamespace).length === 0)
79
+ delete nextRoot[namespace];
80
+ else
81
+ nextRoot[namespace] = { ...nextNamespace };
82
+ replaceRoot(file, nextRoot);
83
+ }
84
+ finally {
85
+ release();
86
+ }
87
+ }
88
+ function acquireLock(file) {
89
+ for (let attempt = 0;; attempt += 1) {
90
+ try {
91
+ return lockfile.lockSync(file, { realpath: false });
92
+ }
93
+ catch (error) {
94
+ if (attempt >= 9 || !isLocked(error))
95
+ throw error;
96
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 20);
97
+ }
98
+ }
99
+ }
100
+ function replaceRoot(file, root) {
101
+ let temporary = `${file}.${process.pid}.${randomUUID()}.tmp`;
102
+ try {
103
+ writeFileSync(temporary, `${JSON.stringify(root, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
104
+ renameSync(temporary, file);
105
+ temporary = null;
106
+ }
107
+ finally {
108
+ if (temporary !== null) {
109
+ try {
110
+ rmSync(temporary, { force: true });
111
+ }
112
+ catch {
113
+ // Invariant: failed temporary cleanup cannot make the target document authoritative.
114
+ }
115
+ }
116
+ }
117
+ }
118
+ function parseRoot(raw) {
119
+ return parseRootValue(stripBom(raw));
120
+ }
121
+ function parseRootAfterLeadingNoise(raw) {
122
+ const withoutBom = stripBom(raw);
123
+ const start = withoutBom.indexOf("{");
124
+ if (start <= 0)
125
+ return null;
126
+ const prefix = withoutBom.slice(0, start);
127
+ if (Buffer.byteLength(prefix, "utf8") > MAX_RECOVERABLE_PREFIX_BYTES || prefix.trim().length === 0)
128
+ return null;
129
+ try {
130
+ JSON.parse(prefix);
131
+ return null;
132
+ }
133
+ catch {
134
+ return parseRootValue(withoutBom.slice(start));
135
+ }
136
+ }
137
+ function parseRootValue(raw) {
138
+ try {
139
+ const value = JSON.parse(raw);
140
+ return isRecord(value) ? value : null;
141
+ }
142
+ catch {
143
+ return null;
144
+ }
145
+ }
146
+ function stripBom(raw) {
147
+ return raw.charCodeAt(0) === 0xfeff ? raw.slice(1) : raw;
148
+ }
149
+ function isRecord(value) {
150
+ return typeof value === "object" && value !== null && !Array.isArray(value);
151
+ }
152
+ function assertNamespace(namespace) {
153
+ if (!NAMESPACE_PATTERN.test(namespace))
154
+ throw new Error(`profile settings namespace is invalid: ${namespace}`);
155
+ }
156
+ function isMissing(error) {
157
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
158
+ }
159
+ function isLocked(error) {
160
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ELOCKED";
161
+ }
162
+ function describe(error) {
163
+ return error instanceof Error ? error.message : String(error);
164
+ }
@@ -0,0 +1,37 @@
1
+ # Resident tabs acceptance: Linux x64
2
+
3
+ State: CI-verified
4
+
5
+ Physical acceptance against a published candidate package is pending; the operator runs [the checklist](../../../manual-resident-tabs-acceptance.md) and fills in this record. Until every item passes, resident tabs on this platform are CI-verified, not certified.
6
+
7
+ | Field | Value |
8
+ |---|---|
9
+ | Package version | pending (first published candidate carrying the terminal host) |
10
+ | terminal-host SHA-256 | pending (from that package's `terminal-host.manifest.json`) |
11
+ | OS build | pending |
12
+ | Terminal | pending |
13
+ | Operator or worker | pending |
14
+ | Date | pending |
15
+
16
+ ## Automated evidence
17
+
18
+ - Pull-request `terminal-host` lane on `ubuntu-24.04`: native unit and role-integration suites, every named crash point recovering to a clean start, the 10,000-schedule simulation corpus, `a1 tabs` maintenance end to end, and the release build of the terminal host with its manifest, session lock, and notices.
19
+ - Pull-request `resident-chaos` lane on `ubuntu-24.04`: bounded randomized kills of servers, holders, and agents against the release-built host, with no duplicate tabs or holders and no orphaned processes.
20
+ - Publication `terminal_hosts` job on `ubuntu-24.04`: the release artifact is rebuilt, its `--version` identity checked, and packing refuses a missing or altered artifact.
21
+ - Bounded fuzzing of every decoder and parser runs on this lane; it proves parser robustness, not platform behavior.
22
+
23
+ ## Physical verdicts
24
+
25
+ | # | Item | Verdict | Notes |
26
+ |---|---|---|---|
27
+ | 1 | Terminal close mid-turn | pending | |
28
+ | 2 | SSH or remote-session loss | pending | |
29
+ | 3 | Forced attach-client kill | pending | |
30
+ | 4 | Reattach fidelity | pending | |
31
+ | 5 | Input and render smoothness | pending | |
32
+ | 6 | Extension text UI | pending | |
33
+ | 7 | Two clients and controller transfer | pending | |
34
+ | 8 | Server, holder, and child failure | pending | |
35
+ | 9 | Sensitive-data separation | pending | |
36
+ | 10 | Conflict-safe direct rollback | pending | |
37
+ | 11 | Logout (Linux) | pending | |
@@ -0,0 +1,36 @@
1
+ # Resident tabs acceptance: macOS arm64
2
+
3
+ State: CI-verified
4
+
5
+ Physical acceptance against a published candidate package is pending; the operator runs [the checklist](../../../manual-resident-tabs-acceptance.md) and fills in this record. Until every item passes, resident tabs on this platform are CI-verified, not certified.
6
+
7
+ | Field | Value |
8
+ |---|---|
9
+ | Package version | pending (first published candidate carrying the terminal host) |
10
+ | terminal-host SHA-256 | pending (from that package's `terminal-host.manifest.json`) |
11
+ | OS build | pending |
12
+ | Terminal | pending |
13
+ | Operator or worker | pending |
14
+ | Date | pending |
15
+
16
+ ## Automated evidence
17
+
18
+ - Pull-request `terminal-host` lane on `macos-15`: native unit and role-integration suites, every named crash point recovering to a clean start, the 10,000-schedule simulation corpus, `a1 tabs` maintenance end to end, and the release build of the terminal host with its manifest, session lock, and notices.
19
+ - Pull-request `resident-chaos` lane on `macos-15`: bounded randomized kills of servers, holders, and agents against the release-built host, with no duplicate tabs or holders and no orphaned processes.
20
+ - Publication `terminal_hosts` job on `macos-15`: the release artifact is rebuilt, its `--version` identity checked, and packing refuses a missing or altered artifact.
21
+
22
+ ## Physical verdicts
23
+
24
+ | # | Item | Verdict | Notes |
25
+ |---|---|---|---|
26
+ | 1 | Terminal close mid-turn | pending | |
27
+ | 2 | SSH or remote-session loss | pending | |
28
+ | 3 | Forced attach-client kill | pending | |
29
+ | 4 | Reattach fidelity | pending | |
30
+ | 5 | Input and render smoothness | pending | |
31
+ | 6 | Extension text UI | pending | |
32
+ | 7 | Two clients and controller transfer | pending | |
33
+ | 8 | Server, holder, and child failure | pending | |
34
+ | 9 | Sensitive-data separation | pending | |
35
+ | 10 | Conflict-safe direct rollback | pending | |
36
+ | 11 | Logout (Linux) | not applicable | Linux-only item. |
@@ -0,0 +1,35 @@
1
+ # Resident tabs acceptance: macOS x64
2
+
3
+ State: CI-verified
4
+
5
+ Physical acceptance against a published candidate package is pending; the operator runs [the checklist](../../../manual-resident-tabs-acceptance.md) and fills in this record. Until every item passes, resident tabs on this platform are CI-verified, not certified.
6
+
7
+ | Field | Value |
8
+ |---|---|
9
+ | Package version | pending (first published candidate carrying the terminal host) |
10
+ | terminal-host SHA-256 | pending (from that package's `terminal-host.manifest.json`) |
11
+ | OS build | pending |
12
+ | Terminal | pending |
13
+ | Operator or worker | pending |
14
+ | Date | pending |
15
+
16
+ ## Automated evidence
17
+
18
+ - Publication `terminal_hosts` and `guardians` jobs on `macos-15-intel`: the release terminal host and process guardian are built for Intel macOS, the host's `--version` identity is checked, and packing refuses a missing or altered artifact.
19
+ - Known gap: the pull-request `terminal-host` and `resident-chaos` suites run on macOS arm64 only, because modular validation outcomes are keyed by platform without architecture. Intel macOS has build and identity evidence but no automated behavior suite of its own.
20
+
21
+ ## Physical verdicts
22
+
23
+ | # | Item | Verdict | Notes |
24
+ |---|---|---|---|
25
+ | 1 | Terminal close mid-turn | pending | |
26
+ | 2 | SSH or remote-session loss | pending | |
27
+ | 3 | Forced attach-client kill | pending | |
28
+ | 4 | Reattach fidelity | pending | |
29
+ | 5 | Input and render smoothness | pending | |
30
+ | 6 | Extension text UI | pending | |
31
+ | 7 | Two clients and controller transfer | pending | |
32
+ | 8 | Server, holder, and child failure | pending | |
33
+ | 9 | Sensitive-data separation | pending | |
34
+ | 10 | Conflict-safe direct rollback | pending | |
35
+ | 11 | Logout (Linux) | not applicable | Linux-only item. |
@@ -0,0 +1,36 @@
1
+ # Resident tabs acceptance: Windows x64
2
+
3
+ State: CI-verified
4
+
5
+ Physical acceptance against a published candidate package is pending; the operator runs [the checklist](../../../manual-resident-tabs-acceptance.md) and fills in this record. Until every item passes, resident tabs on this platform are CI-verified, not certified.
6
+
7
+ | Field | Value |
8
+ |---|---|
9
+ | Package version | pending (first published candidate carrying the terminal host) |
10
+ | terminal-host SHA-256 | pending (from that package's `terminal-host.manifest.json`) |
11
+ | OS build | pending |
12
+ | Terminal | pending |
13
+ | Operator or worker | pending |
14
+ | Date | pending |
15
+
16
+ ## Automated evidence
17
+
18
+ - Pull-request `terminal-host` lane on `windows-2025`: native unit and role-integration suites, every named crash point recovering to a clean start, the 10,000-schedule simulation corpus, `a1 tabs` maintenance end to end, and the release build of the terminal host with its manifest, session lock, and notices.
19
+ - Pull-request `resident-chaos` lane on `windows-2025`: bounded randomized kills of servers, holders, and agents against the release-built host, with no duplicate tabs or holders and no orphaned processes.
20
+ - Publication `terminal_hosts` job on `windows-2025`: the release artifact is rebuilt, its `--version` identity checked, and packing refuses a missing or altered artifact.
21
+
22
+ ## Physical verdicts
23
+
24
+ | # | Item | Verdict | Notes |
25
+ |---|---|---|---|
26
+ | 1 | Terminal close mid-turn | pending | Milestone 2 passed this item against development build `09028be5` (run 38159593912); that evidence is for that build, not this package. |
27
+ | 2 | SSH or remote-session loss | pending | Milestone 2 passed Windows OpenSSH loss against development build `09028be5`; it is not evidence for this package. |
28
+ | 3 | Forced attach-client kill | pending | |
29
+ | 4 | Reattach fidelity | pending | |
30
+ | 5 | Input and render smoothness | pending | |
31
+ | 6 | Extension text UI | pending | |
32
+ | 7 | Two clients and controller transfer | pending | |
33
+ | 8 | Server, holder, and child failure | pending | |
34
+ | 9 | Sensitive-data separation | pending | |
35
+ | 10 | Conflict-safe direct rollback | pending | |
36
+ | 11 | Logout (Linux) | not applicable | Linux-only item. |
@@ -31,7 +31,7 @@ The exact externally branded key/member authority is `config/internal-naming-pol
31
31
  | `A1_PROCESS_GUARDIAN_PATH` | Explicit executable override in `src/foundation/process-containment/native-guardian-containment.ts`, also configured by CI; exact existing exposure-review entry. |
32
32
  | `A1_PROBE_TRACE` | Opt-in diagnostics read by native terminal-host code; exact existing exposure-review entry. |
33
33
  | `A1_BUILD_VERBOSE`, `A1_DEV_SHELL` | Developer invocation controls in the build helper and development launcher; exact existing exposure-review entries. |
34
- | `A1_PANE_ID`, `A1_TERMINAL_SESSION_ID` | Produced by `native/terminal-host/src/workspace.rs` and exported to launched programs; external integration names, unchanged. |
34
+ | `A1_PANE_ID`, `A1_TERMINAL_SESSION_ID` | Reserved compatibility identities retained in the product identity manifest; the resident host does not currently emit them. |
35
35
 
36
36
  Pending review preserves a possible external interface, not an obsolete private alias. Once a setting is established as private, it cannot keep its branded spelling through that category.
37
37
 
@@ -47,6 +47,8 @@ Pending review preserves a possible external interface, not an obsolete private
47
47
  | `RELEASE_RUNNER_LABEL` | Release/full-regression workflows supply certification-runner provenance to `run-release-gates.mjs`. |
48
48
  | `TERMINAL_FIXTURE_INPUT`, `TERMINAL_FIXTURE_TOKEN` | Native terminal probe producer/consumer in `native/terminal-host/src/main.rs`; expected input and fixture token. |
49
49
  | `TERMINAL_HOST_LOCAL_BUILD` | Developer shell sets exactly `1`; `native/terminal-host/build.rs` then permits a Windows build outside CI. |
50
+ | `TERMINAL_HOST_EXPORT_VT` | Native validation lanes in `.github/workflows/ci.yml` name a directory; `build.rs` copies the linked terminal library, headers, and manifest there for upload. |
51
+ | `TERMINAL_HOST_PREBUILT_VT` | Developer shell names a fetched library directory; with `TERMINAL_HOST_LOCAL_BUILD=1` and no `CI`, `build.rs` verifies its manifest and links it instead of running Zig. |
50
52
  | `DOCS_AUTO_MERGE_POLL_ATTEMPTS`, `DOCS_AUTO_MERGE_POLL_MS` | Documentation automation polling controls, produced by governance tests and consumed by `manage-documentation-auto-merge.mjs`. |
51
53
  | `VALIDATION_JOB_STARTED_MS`, `RENDERING_JOB_STARTED_MS` | CI timing handoffs within `.github/workflows/ci.yml`; epoch milliseconds. |
52
54
  | `RUN_PROCESS_CONTAINMENT_INTEGRATION` | CI enables the real containment fixture with exactly `1`; platform containment tests consume it. |
@@ -21,6 +21,8 @@ dist/native/darwin-x64/process-guardian
21
21
  dist/native/darwin-arm64/process-guardian
22
22
  ```
23
23
 
24
+ The publication `guardians` job builds them on `windows-2025`, `ubuntu-24.04`, `macos-15` (arm64), and `macos-15-intel` (x64).
25
+
24
26
  Each supported artifact must be named in the release integrity manifest with target triple, crate version, guardian protocol version, SHA-256, byte size, build provenance, and signature/attestation status. The build marks a platform supported only after its native containment integration runs on that platform. A missing, altered, incompatible, unsupported, or wrong-platform artifact is a concise containment launch error; A1 never silently falls back to PID-only cleanup.
25
27
 
26
28
  ## Licensing
@@ -0,0 +1,18 @@
1
+ # Resident tabs — target requirements
2
+
3
+ Status: one requirement remains outside the delivered milestones. Milestones 1–6 moved every other requirement into their OpenSpec changes, and the canonical specs now hold them. This file keeps only what no milestone has delivered yet; it binds nothing until a later change adopts it. See [`resident-tabs.md`](resident-tabs.md#roadmap).
4
+
5
+ ## Capability: `resident-terminal-host`
6
+
7
+ ### ADDED Requirements
8
+
9
+ #### Requirement: Host topology mutations are revisioned and atomic
10
+ Client/server topology messages SHALL use the generation-1 protocol established by `resident-tabs-contracts`. A topology subscription SHALL begin with one complete snapshot and monotonic revision, followed by ordered changes. Every create, rename, reorder, close, retry, fresh-start, and stop-all mutation SHALL carry its expected topology or registry revision and SHALL either commit completely at the next revision or be rejected without a partial change. A method absent from an older same-generation server SHALL disable only that operation.
11
+
12
+ ##### Scenario: Two clients mutate one revision
13
+ - **WHEN** two clients submit topology mutations against the same expected revision
14
+ - **THEN** at most one SHALL commit, the stale mutation SHALL receive a typed revision conflict, and every client SHALL converge on the committed topology
15
+
16
+ ##### Scenario: Newer client calls an unavailable method
17
+ - **WHEN** a newer same-generation client attaches to an older server that lacks one optional topology method
18
+ - **THEN** attachment and unrelated operations SHALL remain available while only that method is disabled