@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.
- package/README.md +32 -0
- package/bin/ui.js +17 -2
- package/dist/composition/owned-ui.d.ts +4 -1
- package/dist/composition/owned-ui.js +8 -5
- package/dist/contracts/agent-engine/capability-ports.d.ts +2 -2
- package/dist/contracts/agent-engine/domain-validation.js +22 -4
- package/dist/contracts/agent-engine/domain.d.ts +17 -0
- package/dist/contracts/owned-ui/model.d.ts +8 -0
- package/dist/contracts/owned-ui/validation.js +11 -0
- package/dist/features/owned-ui/index.d.ts +1 -0
- package/dist/features/owned-ui/index.js +1 -0
- package/dist/features/owned-ui/project-trust-prompt.d.ts +20 -0
- package/dist/features/owned-ui/project-trust-prompt.js +32 -0
- package/dist/features/owned-ui/settings-app.js +37 -9
- package/dist/integrations/pi/components/shell-components.d.ts +1 -0
- package/dist/integrations/pi/components/shell-components.js +1 -0
- package/dist/integrations/pi/components/shell-editor-autocomplete.js +10 -0
- package/dist/integrations/pi/components/shell-footer-status.js +14 -9
- package/dist/integrations/pi/components/shell-presenters-info.d.ts +36 -0
- package/dist/integrations/pi/components/shell-presenters-info.js +78 -0
- package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +3 -36
- package/dist/integrations/pi/components/shell-presenters-transcript.js +88 -128
- package/dist/integrations/pi/components/shell-shared-facade.d.ts +11 -1
- package/dist/integrations/pi/engine/adapter.d.ts +15 -4
- package/dist/integrations/pi/engine/adapter.js +185 -37
- package/dist/integrations/pi/engine/http-dispatcher.d.ts +4 -0
- package/dist/integrations/pi/engine/http-dispatcher.js +25 -0
- package/dist/integrations/pi/engine/index.d.ts +3 -0
- package/dist/integrations/pi/engine/index.js +3 -0
- package/dist/integrations/pi/engine/project-trust-preflight.d.ts +22 -0
- package/dist/integrations/pi/engine/project-trust-preflight.js +50 -0
- package/dist/integrations/pi/engine/runtime-integration.d.ts +16 -1
- package/dist/integrations/pi/engine/runtime-integration.js +34 -4
- package/dist/integrations/pi/engine/settings-effects.d.ts +55 -0
- package/dist/integrations/pi/engine/settings-effects.js +229 -0
- package/dist/integrations/pi/engine/settings-integration.d.ts +14 -26
- package/dist/integrations/pi/engine/settings-integration.js +102 -108
- package/dist/integrations/pi/engine/workflow-controllers.d.ts +1 -1
- package/dist/integrations/pi/session-ui/clipboard-image.d.ts +11 -0
- package/dist/integrations/pi/session-ui/clipboard-image.js +29 -0
- package/dist/integrations/pi/session-ui/prompt-chips.js +5 -1
- package/dist/integrations/pi/session-ui/session-shell-root.d.ts +9 -2
- package/dist/integrations/pi/session-ui/session-shell-root.js +83 -9
- package/dist/integrations/pi/session-ui/session-shell.d.ts +2 -0
- package/dist/integrations/pi/session-ui/session-shell.js +151 -15
- package/dist/integrations/pi/session-ui/session-viewport-controller.js +34 -2
- package/dist/integrations/pi/session-ui/system-clipboard.d.ts +9 -0
- package/dist/integrations/pi/session-ui/system-clipboard.js +34 -5
- package/dist/integrations/pi/tui-runtime/adapter.d.ts +4 -0
- package/dist/integrations/pi/tui-runtime/adapter.js +28 -0
- package/dist/native/darwin-arm64/manifest.json +1 -1
- package/dist/native/linux-x64/manifest.json +1 -1
- package/dist/native/win32-x64/manifest.json +2 -2
- package/dist/native/win32-x64/process-guardian.exe +0 -0
- package/dist/ui/components/spans.d.ts +2 -0
- package/dist/ui/components/spans.js +25 -0
- package/dist/ui/settings/sections.d.ts +8 -19
- package/dist/ui/settings/sections.js +12 -4
- package/dist/ui/settings/session.d.ts +8 -18
- package/dist/ui/settings/session.js +59 -52
- package/docs/architecture/project-structure.md +14 -0
- package/docs/ci-release-runbook.md +69 -4
- package/docs/repository-governance-live-acceptance.md +77 -0
- 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.#
|
|
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
|
-
|
|
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.#
|
|
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
|
|
85
|
-
if (declaration
|
|
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
|
|
66
|
+
return changed("deferred", "next-start", value, previousSetting.value);
|
|
90
67
|
}
|
|
91
68
|
this.#pending.delete(id);
|
|
92
69
|
this.#notify();
|
|
93
|
-
return
|
|
70
|
+
return changed("applied", "live", value, value);
|
|
94
71
|
}
|
|
95
|
-
async #
|
|
96
|
-
const agent = this.#
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
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
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
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: [],
|
|
113
|
+
return { descriptors: [], writeAdvertised: false, failure: describe(error) };
|
|
140
114
|
}
|
|
141
115
|
}
|
|
142
116
|
function failed(failure) {
|
|
143
|
-
return {
|
|
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
|
|
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.
|
|
108
|
-
|
|
109
|
-
|
|
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.
|
|
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",
|