@timurproko/a1 0.1.8-dev.157 → 0.1.8-dev.182

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 (64) hide show
  1. package/README.md +32 -0
  2. package/bin/ui.js +17 -2
  3. package/dist/composition/owned-ui.d.ts +4 -1
  4. package/dist/composition/owned-ui.js +8 -5
  5. package/dist/contracts/agent-engine/capability-ports.d.ts +2 -2
  6. package/dist/contracts/agent-engine/domain-validation.js +22 -4
  7. package/dist/contracts/agent-engine/domain.d.ts +17 -0
  8. package/dist/contracts/owned-ui/model.d.ts +8 -0
  9. package/dist/contracts/owned-ui/validation.js +11 -0
  10. package/dist/features/owned-ui/index.d.ts +1 -0
  11. package/dist/features/owned-ui/index.js +1 -0
  12. package/dist/features/owned-ui/project-trust-prompt.d.ts +20 -0
  13. package/dist/features/owned-ui/project-trust-prompt.js +32 -0
  14. package/dist/features/owned-ui/settings-app.js +37 -9
  15. package/dist/integrations/pi/components/shell-components.d.ts +1 -0
  16. package/dist/integrations/pi/components/shell-components.js +1 -0
  17. package/dist/integrations/pi/components/shell-editor-autocomplete.js +10 -0
  18. package/dist/integrations/pi/components/shell-footer-status.js +14 -9
  19. package/dist/integrations/pi/components/shell-presenters-info.d.ts +36 -0
  20. package/dist/integrations/pi/components/shell-presenters-info.js +78 -0
  21. package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +3 -36
  22. package/dist/integrations/pi/components/shell-presenters-transcript.js +88 -128
  23. package/dist/integrations/pi/components/shell-shared-facade.d.ts +11 -1
  24. package/dist/integrations/pi/engine/adapter.d.ts +15 -4
  25. package/dist/integrations/pi/engine/adapter.js +185 -37
  26. package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
  27. package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
  28. package/dist/integrations/pi/engine/index.d.ts +3 -0
  29. package/dist/integrations/pi/engine/index.js +3 -0
  30. package/dist/integrations/pi/engine/project-trust-preflight.d.ts +22 -0
  31. package/dist/integrations/pi/engine/project-trust-preflight.js +50 -0
  32. package/dist/integrations/pi/engine/runtime-integration.d.ts +16 -1
  33. package/dist/integrations/pi/engine/runtime-integration.js +34 -4
  34. package/dist/integrations/pi/engine/settings-effects.d.ts +55 -0
  35. package/dist/integrations/pi/engine/settings-effects.js +229 -0
  36. package/dist/integrations/pi/engine/settings-integration.d.ts +14 -26
  37. package/dist/integrations/pi/engine/settings-integration.js +102 -108
  38. package/dist/integrations/pi/engine/workflow-controllers.d.ts +1 -1
  39. package/dist/integrations/pi/session-ui/clipboard-image.d.ts +11 -0
  40. package/dist/integrations/pi/session-ui/clipboard-image.js +29 -0
  41. package/dist/integrations/pi/session-ui/prompt-chips.js +5 -1
  42. package/dist/integrations/pi/session-ui/session-shell-root.d.ts +9 -2
  43. package/dist/integrations/pi/session-ui/session-shell-root.js +83 -9
  44. package/dist/integrations/pi/session-ui/session-shell.d.ts +2 -0
  45. package/dist/integrations/pi/session-ui/session-shell.js +151 -15
  46. package/dist/integrations/pi/session-ui/session-viewport-controller.js +34 -2
  47. package/dist/integrations/pi/session-ui/system-clipboard.d.ts +9 -0
  48. package/dist/integrations/pi/session-ui/system-clipboard.js +34 -5
  49. package/dist/integrations/pi/tui-runtime/adapter.d.ts +4 -0
  50. package/dist/integrations/pi/tui-runtime/adapter.js +28 -0
  51. package/dist/native/darwin-arm64/manifest.json +1 -1
  52. package/dist/native/linux-x64/manifest.json +1 -1
  53. package/dist/native/win32-x64/manifest.json +2 -2
  54. package/dist/native/win32-x64/process-guardian.exe +0 -0
  55. package/dist/ui/components/spans.d.ts +2 -0
  56. package/dist/ui/components/spans.js +25 -0
  57. package/dist/ui/settings/sections.d.ts +8 -19
  58. package/dist/ui/settings/sections.js +12 -4
  59. package/dist/ui/settings/session.d.ts +8 -18
  60. package/dist/ui/settings/session.js +59 -52
  61. package/docs/architecture/project-structure.md +14 -0
  62. package/docs/ci-release-runbook.md +69 -4
  63. package/docs/repository-governance-live-acceptance.md +77 -0
  64. package/package.json +5 -2
@@ -1,9 +1,6 @@
1
+ import { assertAgentSettingDescriptor } from "../../contracts/agent-engine/index.js";
1
2
  import { buildOwnedUiSettingsSections, findOwnedUiSettingsEntry, } from "./sections.js";
2
- /**
3
- * Holds the resolved settings for one owned UI session and routes every accepted
4
- * change to the backend that owns it: A1 settings to the A1 document, agent
5
- * settings to the engine settings port. Neither backend ever sees the other's value.
6
- */
3
+ /** Routes every accepted setting change only to its owning backend. */
7
4
  export class OwnedUiSettingsSession {
8
5
  #store;
9
6
  #agent;
@@ -23,21 +20,18 @@ export class OwnedUiSettingsSession {
23
20
  get resolution() {
24
21
  return this.#resolution;
25
22
  }
26
- /** Reads the engine's settings so the Agent section can be built. Never throws. */
27
23
  async load() {
28
24
  this.#resolution = this.#store.read();
29
- const agent = this.#agentProvider === null ? this.#agent : this.#agentProvider();
25
+ const agent = this.#currentAgent();
30
26
  this.#agentSnapshot = agent === null ? null : await snapshotOf(agent, this.#hiddenAgentSettingIds);
31
27
  this.#notify();
32
28
  }
33
29
  sections() {
34
30
  return buildOwnedUiSettingsSections({ resolution: this.#resolution, agent: this.#agentSnapshot });
35
31
  }
36
- /** Resolved value of an A1 setting, or null when it is not declared. */
37
32
  value(id) {
38
33
  return this.#resolution.settings.find(setting => setting.declaration.id === id)?.value ?? null;
39
34
  }
40
- /** Value stored this session but not yet in effect, for a restart-required setting. */
41
35
  pendingValue(id) {
42
36
  return this.#pending.get(id) ?? null;
43
37
  }
@@ -45,35 +39,18 @@ export class OwnedUiSettingsSession {
45
39
  this.#listeners.add(listener);
46
40
  return () => this.#listeners.delete(listener);
47
41
  }
48
- /** Writes a structured value, which only an engine-backed setting can hold. */
49
42
  async changeStructured(backend, id, value) {
50
43
  if (backend !== "agent")
51
44
  return failed("only an agent setting holds a structured value");
52
- const agent = this.#agentProvider === null ? this.#agent : this.#agentProvider();
53
- if (agent === null)
54
- return failed("no agent engine is attached");
55
- if (!agent.capabilities.write || !agent.writeSetting) {
56
- return failed("the agent engine does not support changing settings from this surface");
57
- }
58
- try {
59
- await agent.writeSetting(id, value);
60
- if (agent.capabilities.flush && agent.flush)
61
- await agent.flush();
62
- }
63
- catch (error) {
64
- return failed(`${id} could not be written to the agent engine: ${describe(error)}`);
65
- }
66
- this.#agentSnapshot = await snapshotOf(agent, this.#hiddenAgentSettingIds);
67
- this.#notify();
68
- return { applied: true, pendingRestart: false, failure: null };
45
+ return await this.#changeAgentValue(id, value);
69
46
  }
70
47
  async change(backend, id, value) {
71
48
  const entry = findOwnedUiSettingsEntry(this.sections(), id, backend);
72
49
  if (entry === null)
73
50
  return failed(`unknown ${backend} setting: ${id}`);
74
51
  if (!entry.editable)
75
- return failed(`${id} is not editable from this surface`);
76
- return backend === "a1" ? this.#changeOwned(id, value) : await this.#changeAgent(id, value);
52
+ return failed(entry.limitationReason ?? `${id} is not editable from this surface`);
53
+ return backend === "a1" ? this.#changeOwned(id, value) : await this.#changeAgentValue(id, value);
77
54
  }
78
55
  #changeOwned(id, value) {
79
56
  const outcome = this.#store.write(this.#resolution, id, value);
@@ -81,35 +58,39 @@ export class OwnedUiSettingsSession {
81
58
  return failed(outcome.failure ?? `${id} could not be stored`);
82
59
  const previous = this.#resolution;
83
60
  this.#resolution = this.#store.read();
84
- const declaration = previous.settings.find(setting => setting.declaration.id === id)?.declaration;
85
- if (declaration?.application === "restart") {
61
+ const previousSetting = previous.settings.find(setting => setting.declaration.id === id);
62
+ if (previousSetting?.declaration.application === "restart") {
86
63
  this.#pending.set(id, value);
87
64
  this.#resolution = previous;
88
65
  this.#notify();
89
- return { applied: false, pendingRestart: true, failure: null };
66
+ return changed("deferred", "next-start", value, previousSetting.value);
90
67
  }
91
68
  this.#pending.delete(id);
92
69
  this.#notify();
93
- return { applied: true, pendingRestart: false, failure: null };
70
+ return changed("applied", "live", value, value);
94
71
  }
95
- async #changeAgent(id, value) {
96
- const agent = this.#agentProvider === null ? this.#agent : this.#agentProvider();
72
+ async #changeAgentValue(id, value) {
73
+ const agent = this.#currentAgent();
97
74
  if (agent === null)
98
75
  return failed("no agent engine is attached");
99
76
  if (!agent.capabilities.write || !agent.writeSetting) {
100
77
  return failed("the agent engine does not support changing settings from this surface");
101
78
  }
79
+ let result;
102
80
  try {
103
- await agent.writeSetting(id, value);
104
- if (agent.capabilities.flush && agent.flush)
105
- await agent.flush();
81
+ // The coordinator behind the port owns effect installation, persistence,
82
+ // flush, and rollback. A second surface-level flush would split authority.
83
+ result = await agent.writeSetting(id, value);
106
84
  }
107
85
  catch (error) {
108
86
  return failed(`${id} could not be written to the agent engine: ${describe(error)}`);
109
87
  }
110
88
  this.#agentSnapshot = await snapshotOf(agent, this.#hiddenAgentSettingIds);
111
89
  this.#notify();
112
- return { applied: true, pendingRestart: false, failure: null };
90
+ return fromAgentOutcome(result);
91
+ }
92
+ #currentAgent() {
93
+ return this.#agentProvider === null ? this.#agent : this.#agentProvider();
113
94
  }
114
95
  #notify() {
115
96
  for (const listener of this.#listeners)
@@ -118,29 +99,55 @@ export class OwnedUiSettingsSession {
118
99
  }
119
100
  async function snapshotOf(agent, hidden) {
120
101
  try {
121
- const descriptors = (await agent.listSettings()).filter(descriptor => !hidden.has(descriptor.key));
122
- const values = {};
123
- for (const descriptor of descriptors) {
124
- try {
125
- values[descriptor.key] = await agent.readSetting(descriptor.key) ?? null;
126
- }
127
- catch {
128
- values[descriptor.key] = null;
129
- }
130
- }
102
+ const listed = await agent.listSettings();
103
+ for (const descriptor of listed)
104
+ assertAgentSettingDescriptor(descriptor);
105
+ const descriptors = listed.filter(descriptor => !hidden.has(descriptor.key));
131
106
  return {
132
107
  descriptors,
133
- values,
134
108
  writeAdvertised: agent.capabilities.write && typeof agent.writeSetting === "function",
135
109
  failure: null,
136
110
  };
137
111
  }
138
112
  catch (error) {
139
- return { descriptors: [], values: {}, writeAdvertised: false, failure: describe(error) };
113
+ return { descriptors: [], writeAdvertised: false, failure: describe(error) };
140
114
  }
141
115
  }
142
116
  function failed(failure) {
143
- return { applied: false, pendingRestart: false, failure };
117
+ return {
118
+ status: "failed",
119
+ applied: false,
120
+ pendingRestart: false,
121
+ application: null,
122
+ storedValue: null,
123
+ effectiveValue: null,
124
+ limitationReason: null,
125
+ failure,
126
+ };
127
+ }
128
+ function changed(status, application, storedValue, effectiveValue) {
129
+ return {
130
+ status,
131
+ applied: status === "applied",
132
+ pendingRestart: status === "deferred" && application === "next-start",
133
+ application,
134
+ storedValue,
135
+ effectiveValue,
136
+ limitationReason: null,
137
+ failure: null,
138
+ };
139
+ }
140
+ function fromAgentOutcome(result) {
141
+ return {
142
+ status: result.status,
143
+ applied: result.status === "applied",
144
+ pendingRestart: result.status === "deferred" && result.application === "next-start",
145
+ application: result.application,
146
+ storedValue: result.storedValue,
147
+ effectiveValue: result.effectiveValue,
148
+ limitationReason: result.limitationReason,
149
+ failure: result.failure,
150
+ };
144
151
  }
145
152
  function describe(error) {
146
153
  return error instanceof Error ? error.message : String(error);
@@ -86,6 +86,20 @@ The repository has one root `package.json`, `package-lock.json`, TypeScript conf
86
86
 
87
87
  Build output mirrors the production namespaces directly under ignored `dist/`, without an intermediate `src/` directory; release and test evidence belongs in ignored `.artifacts/`; temporary agent work belongs in ignored `.worktrees/` and `.builds/`. Repository tooling is grouped under `scripts/governance`, `scripts/release`, `scripts/pi`, and `scripts/development`; the few root scripts are standalone maintenance or build commands. Package contents are selected by the root manifest. The Rust process guardian and console terminal-host proof live under `native/`; Cargo output is ignored. Third-party terminal parser sources are isolated under `native/terminal-host/vendor/` and are not owned application modules.
88
88
 
89
+ ## Development worktrees
90
+
91
+ Every task worktree must be created at `{working-dir}/.worktrees/<task-id>`, where `{working-dir}` is the agent session's initial working directory. The `.worktrees` directory is inside that working directory, not beside it. For working directory `D:/Git/a1`, `D:/Git/a1/.worktrees/<task-id>` is correct and `D:/Git/a1-<task-id>` is forbidden.
92
+
93
+ From the initial working directory, create and address a task worktree explicitly:
94
+
95
+ ```sh
96
+ git fetch origin develop
97
+ git worktree add --detach .worktrees/<task-id> origin/develop
98
+ git -C .worktrees/<task-id> status
99
+ ```
100
+
101
+ The primary worktree stays on `develop` for integration and must not be used for task edits. Do not edit, move, or remove another session's worktree.
102
+
89
103
  ## Documentation and comments
90
104
 
91
105
  - README explains installation, commands, and current limitations.
@@ -12,6 +12,33 @@ GitHub Actions is the only automation platform. Three refs are protected:
12
12
  channel. The workflow starts at `03:17 UTC` for nightly development verification,
13
13
  or by explicit dispatch from `npm run develop` or `npm run release`.
14
14
 
15
+ `.github/workflows/documentation-auto-merge.yml` is the only pull-request
16
+ auto-merge authority. It runs trusted policy from `develop`; it never checks out or
17
+ executes a pull request's code with its write token.
18
+
19
+ `.github/workflows/merged-branch-cleanup.yml` owns branch deletion after a human or
20
+ external actor closes a pull request. On the close event it checks out trusted
21
+ default-branch policy and installs no pull-request dependencies. GitHub does not
22
+ emit a new workflow event for a merge authored with the workflow `GITHUB_TOKEN`, so
23
+ Documentation auto-merge also performs the same shared reconciliation synchronously
24
+ after its own validated integration. Both paths delete only an unprotected same-
25
+ repository topic ref whose live object still equals the merged pull request head SHA.
26
+ An absent ref is success; fork, unmerged, advanced, protected, default, release-owned,
27
+ or malformed refs are preserved and reported.
28
+
29
+ `config/github-repository-governance.json` is the reviewed policy for repository
30
+ settings, Actions defaults, security capabilities, environments, complete rulesets,
31
+ protected refs, and workflow authority. Inspection is read-only by default:
32
+
33
+ ```sh
34
+ node scripts/governance/check-github-repository-governance.mjs --check
35
+ ```
36
+
37
+ Applying reviewed mutable drift is a separate maintainer operation requiring
38
+ `--apply --confirm apply-a1-github-governance` and a matching post-apply read.
39
+ Secrets and external npm trusted-publisher configuration are capability checks, not
40
+ serialized credentials.
41
+
15
42
  `develop` is where work lands. `master` records what npm `latest` serves and is an
16
43
  effect of stable publication, not a trigger.
17
44
 
@@ -19,12 +46,41 @@ effect of stable publication, not a trigger.
19
46
 
20
47
  | Trigger | Validation and outcome |
21
48
  | --- | --- |
22
- | Pull request into `develop` | Fast required validation; docs/spec-only changes use strict OpenSpec validation |
49
+ | Pull request into `develop` | Fast required validation; docs-only changes use lightweight governance consistency and OpenSpec changes also use strict OpenSpec validation |
23
50
  | `npm run develop` | Preview package gates on Windows, Linux, and macOS; an existing numbered preview is an early successful no-op |
24
51
  | Nightly at `03:17 UTC` | Complete non-physical suite on Windows, Linux, and macOS, every night |
25
52
  | `npm run release -- ...` | Complete exact-byte stable gates, then npm `latest`, tag, GitHub Release, and `master` |
26
53
  | `.github/workflows/full-regression.yml` | Additional on-demand complete regression without publication authority |
27
54
 
55
+ ## Pull request integration
56
+
57
+ `Development validation required` remains the merge gate for every pull request.
58
+ Documentation auto-merge reads the complete GitHub changed-file response and arms
59
+ squash auto-merge for an eligible pull request while required validation is pending;
60
+ branch protection prevents integration until `Development validation required`
61
+ succeeds. If validation finishes before auto-merge can be armed and GitHub already
62
+ reports the pull request clean, the reconciler squash-merges only the validated head
63
+ SHA. Every current and renamed-from path must be under `openspec/**`, under
64
+ `docs/**`, or exactly the root `README.md`. Eligible pull requests must use a
65
+ non-draft branch in this repository and target `develop`.
66
+
67
+ The exact allowlist covers maintained OpenSpec, architecture, feature, manual,
68
+ runbook, and root README documentation. Other root Markdown files, `LICENSE`,
69
+ `.gitignore`, source, tests, scripts, workflows, configuration, generated baselines,
70
+ and mixed changes do not auto-merge. The guard also runs when a pull request changes
71
+ or auto-merge is manually enabled; if any path is outside the allowlist, it disables
72
+ auto-merge while leaving the pull request available for a later manual merge. Every
73
+ docs-only change runs lightweight generated-governance consistency, so archiving an
74
+ inventoried OpenSpec occurrence fails that pull request rather than a later code pull
75
+ request. A legitimate generated baseline update remains outside the allowlist and
76
+ follows the manually accepted mixed/code path.
77
+
78
+ A specification request lands as an OpenSpec-only pull request. Implementation
79
+ starts only after that specification merges and the maintainer explicitly requests
80
+ it, in a fresh worktree and pull request based on updated `origin/develop`. Every
81
+ code/operational pull request remains open after CI until the maintainer validates it
82
+ locally and explicitly authorizes manual integration.
83
+
28
84
  ## Numbered development previews
29
85
 
30
86
  A merge or push to `develop` does not publish by itself. To request a deliberate
@@ -92,6 +148,13 @@ Rules that do not bend:
92
148
  ## When something fails
93
149
 
94
150
  - **PR validation fails:** fix the code and push; do not mark a failed tier optional.
151
+ - **Documentation auto-merge fails:** leave the pull request open, inspect its exact
152
+ changed-file classification, docs-sensitive inventory, and workflow permissions,
153
+ and never broaden the allowlist to make one pull request pass.
154
+ - **Merged-branch cleanup fails:** inspect the bounded PR/ref/SHA disposition. Never
155
+ delete an advanced or protected ref merely because its name matches an old PR.
156
+ - **Repository governance drifts:** run the read-only checker, review every reported
157
+ path, and use the confirmed apply mode only for an accepted mutable policy change.
95
158
  - **Development publication fails:** fix the cause and rerun `npm run develop`; an npm version that already exists is never overwritten.
96
159
  - **Stable publication fails before npm accepts bytes:** no tag, release, or moved branch exists. Fix the cause and release the next version.
97
160
  - **Stable publication is uncertain after npm accepted bytes:** stop and inspect registry version, digest, tag, and release. Never republish immutable bytes.
@@ -104,6 +167,8 @@ and resolved review threads, but zero approving reviews. `master` and release ta
104
167
  are written only after publication and are protected from force-push, movement, and
105
168
  deletion.
106
169
 
107
- Do not add direct-push bypasses. Ruleset mutation remains a separate administrative
108
- operation: inspect with `node scripts/governance/check-github-rulesets.mjs`, and apply only
109
- with explicit maintainer confirmation.
170
+ Do not add direct-push bypasses. Approval count, strict-base validation, repository
171
+ merge methods, Actions allowance/SHA enforcement, Dependabot, and npm environment
172
+ protection remain explicit maintainer decisions; governance automation does not
173
+ silently change them. Repository mutation remains a separate confirmed administrative
174
+ operation through `check-github-repository-governance.mjs`.
@@ -0,0 +1,77 @@
1
+ # Repository governance live acceptance
2
+
3
+ ## Implementation lifecycle
4
+
5
+ - PR #165 was manually squash-merged by `timurproko` from validated head
6
+ `45aab61c5e4568d3d26dc970f76e9ec86918f323` to `develop` commit
7
+ `e4cdc67555e9f25d03f251be19baa8fc446ac313`.
8
+ - Cleanup run `33185942656` used trusted `develop` policy with `contents: write` only
9
+ and reported `already-absent`; the implementation branch remained absent.
10
+ - The read-only live governance report matched every declared field after merge.
11
+
12
+ ## Acceptance defect and correction
13
+
14
+ - Initial OpenSpec probe PR #166 automatically squash-merged validated head
15
+ `c30c0a091a6a6a727057befcdd775422988be382` to
16
+ `f8d60080cfd9925b33a19a5d40c707637ac00b08`, but GitHub suppressed the recursive
17
+ close-event workflow because integration was authored with `GITHUB_TOKEN`.
18
+ - Its exact unchanged branch remained, proving the first implementation incomplete.
19
+ The branch was manually deleted only after its expected SHA and lack of an open PR
20
+ were reverified.
21
+ - Corrective PR #167 was manually squash-merged from validated head
22
+ `3a09042386df2501accc1eec3b424b94ae84daa4` to
23
+ `e8d639985a811f01cd5daeb027db5069d1724596`. Cleanup run `33188206793`
24
+ succeeded with `already-absent`.
25
+
26
+ ## Automatic OpenSpec acceptance
27
+
28
+ - PR #168 contained only `openspec/**` paths.
29
+ - Development validation run `33188285639` passed for exact head
30
+ `6678d9237ca7c4109beaed0d97d5fb1183fe5f97` without product tests.
31
+ - `github-actions` automatically squash-merged it to
32
+ `c2fa730a4b070f9f6717329c24158def5c766f11`.
33
+ - Trusted documentation reconciliation run `33188329123` reported `deleted` for the
34
+ same expected head SHA, and the remote branch was verified absent.
35
+
36
+ ## Automatic root README acceptance
37
+
38
+ - PR #169 changed only root `README.md`.
39
+ - Development validation run `33188400573` passed for exact head
40
+ `165c5159031d80059c4d93c36c6d10113ec7ba8e` without product tests.
41
+ - `github-actions` automatically squash-merged it to
42
+ `0180088a42b7cdacaf84ec66ff5a87be1a697155`.
43
+ - Trusted documentation reconciliation run `33188434277` reported `deleted` for the
44
+ same expected head SHA, and the remote branch was verified absent.
45
+
46
+ ## Mixed-path manual acceptance
47
+
48
+ PR #170 combined this evidence file outside the exact automatic allowlist with an
49
+ OpenSpec task update. Development validation run `33188542485` passed for exact head
50
+ `b95bdbf08ad6db76c5fab2bfca254026a3c4bcc1` without product tests. Auto-merge
51
+ remained disabled and the pull request remained open and mergeable until `timurproko`
52
+ manually squash-merged it to `6ab1e4d29b9edec8501bac774bc755e66240ea40`.
53
+ Close-event cleanup run `33188616709` reported `already-absent`, and the remote branch
54
+ was verified absent after the explicit merge.
55
+
56
+ ## Automatic maintained-documentation acceptance
57
+
58
+ - Implementation PR #180 was manually squash-merged after required validation from
59
+ head `8f40bfaaa5e8410e77b1c9cc0667c62bc4c62d4b` to
60
+ `45a59a7b696d537a4dc8fe62000a60c20e504ab2`.
61
+ - PR #181 changes only this maintained `docs/**` file and is the live acceptance
62
+ probe for the expanded allowlist.
63
+ - Acceptance requires current-head documentation validation, automatic squash
64
+ integration without maintainer merge action, and exact-head remote branch cleanup.
65
+ Exact run and merge evidence is recorded with the completed OpenSpec change.
66
+
67
+ ## Advanced-ref refusal and final policy state
68
+
69
+ The isolated mocked-GitHub fixture executed the production shared reconciler with
70
+ expected SHA `1111111111111111111111111111111111111111` and advanced live SHA
71
+ `2222222222222222222222222222222222222222`. It returned `refused` with reason
72
+ `live branch advanced after merge` and issued zero DELETE requests. The bounded
73
+ record is archived as `evidence/advanced-ref-refusal.json`.
74
+
75
+ The final read-only live report matched all declared repository settings, Actions
76
+ policy, security capabilities, environments, protected refs, complete rulesets, and
77
+ workflow inventory with zero differences. No policy apply was run.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@timurproko/a1",
3
- "version": "0.1.8-dev.157",
3
+ "version": "0.1.8-dev.182",
4
4
  "description": "Standalone terminal workspace for supervised native and managed agents",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.13.0",
@@ -29,6 +29,8 @@
29
29
  "check:architecture": "node scripts/governance/check-architecture.mjs && node scripts/governance/product-identifier-policy.mjs --check && node scripts/governance/check-product-identity-boundaries.mjs && node scripts/governance/check-package-identity.mjs && node scripts/governance/check-pinned-pi-source-ledger.mjs && node scripts/governance/check-terminal-host-provenance.mjs",
30
30
  "check:customization-ready": "node scripts/governance/check-owned-ui-customization-prerequisites.mjs",
31
31
  "check:deprecated": "node scripts/governance/check-deprecated-dependencies.mjs",
32
+ "check:docs-governance": "node scripts/governance/check-docs-governance.mjs",
33
+ "check:repository-governance": "node scripts/governance/check-github-repository-governance.mjs --check",
32
34
  "branches:prune": "node scripts/prune-merged-branches.mjs",
33
35
  "check": "npm run test:fast",
34
36
  "develop": "node scripts/development/develop.mjs",
@@ -58,7 +60,8 @@
58
60
  "chalk": "5.6.2",
59
61
  "cross-spawn": "7.0.6",
60
62
  "grok-mermaid": "0.2.2",
61
- "semver": "7.8.5"
63
+ "semver": "7.8.5",
64
+ "undici": "8.9.0"
62
65
  },
63
66
  "devDependencies": {
64
67
  "@types/cross-spawn": "6.0.6",