ace-assign 0.63.1 → 0.64.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.ace-defaults/assign/catalog/steps/create-pr.step.yml +2 -2
- data/.ace-defaults/assign/catalog/steps/mark-pr-ready.step.yml +1 -1
- data/.ace-defaults/assign/catalog/steps/release-minor.step.yml +4 -2
- data/.ace-defaults/assign/catalog/steps/release.step.yml +4 -2
- data/.ace-defaults/assign/catalog/steps/update-pr-desc.step.yml +1 -1
- data/.ace-defaults/assign/presets/fix-bug.yml +15 -3
- data/.ace-defaults/assign/presets/work-on-task-ace-development.yml +16 -4
- data/.ace-defaults/assign/presets/work-on-task-auto-merge.yml +15 -3
- data/.ace-defaults/assign/presets/work-on-task.yml +16 -4
- data/CHANGELOG.md +43 -0
- data/docs/demo/canonical-skill-source.tape.yml +4 -4
- data/docs/protected-authority.md +266 -0
- data/docs/usage.md +91 -2
- data/handbook/workflow-instructions/assign/drive.wf.md +2 -2
- data/handbook/workflow-instructions/assign/prepare.wf.md +2 -2
- data/lib/ace/assign/atoms/delivery_parameters.rb +54 -0
- data/lib/ace/assign/authority/candidate_transfer.rb +160 -0
- data/lib/ace/assign/authority/client.rb +107 -0
- data/lib/ace/assign/authority/deployment.rb +465 -0
- data/lib/ace/assign/authority/endcap.rb +342 -0
- data/lib/ace/assign/authority/endcap_inboxes.rb +314 -0
- data/lib/ace/assign/authority/endcap_results.rb +380 -0
- data/lib/ace/assign/authority/endcap_services.rb +395 -0
- data/lib/ace/assign/authority/evidence_transfer.rb +67 -0
- data/lib/ace/assign/authority/execution_scope_observation.rb +476 -0
- data/lib/ace/assign/authority/launch_driver.rb +114 -0
- data/lib/ace/assign/authority/launch_lifecycle.rb +822 -0
- data/lib/ace/assign/authority/launch_scope_abort.rb +88 -0
- data/lib/ace/assign/authority/launch_scope_admission.rb +84 -0
- data/lib/ace/assign/authority/launch_scope_close.rb +115 -0
- data/lib/ace/assign/authority/launch_scope_parent.rb +44 -0
- data/lib/ace/assign/authority/launch_scope_release.rb +180 -0
- data/lib/ace/assign/authority/posix_acl.rb +56 -0
- data/lib/ace/assign/authority/private_directory.rb +33 -0
- data/lib/ace/assign/authority/receipt_transfer.rb +48 -0
- data/lib/ace/assign/authority/router.rb +54 -0
- data/lib/ace/assign/authority/server.rb +230 -0
- data/lib/ace/assign/authority/service_evidence.rb +55 -0
- data/lib/ace/assign/authority/transfer_codec.rb +155 -0
- data/lib/ace/assign/cli/commands/authority/launch.rb +45 -0
- data/lib/ace/assign/cli/commands/authority/serve.rb +30 -0
- data/lib/ace/assign/cli/commands/authority/status.rb +26 -0
- data/lib/ace/assign/cli/commands/authority/terminate.rb +29 -0
- data/lib/ace/assign/cli/commands/create.rb +9 -1
- data/lib/ace/assign/cli/commands/delivery.rb +57 -0
- data/lib/ace/assign/cli/commands/inbox_reconcile.rb +36 -0
- data/lib/ace/assign/cli/commands/resume.rb +26 -0
- data/lib/ace/assign/cli.rb +22 -1
- data/lib/ace/assign/models/evidence_event.rb +3 -1
- data/lib/ace/assign/molecules/attempt_reconciler.rb +31 -12
- data/lib/ace/assign/molecules/canonical_evidence.rb +150 -0
- data/lib/ace/assign/molecules/evidence_journal.rb +218 -63
- data/lib/ace/assign/molecules/execution_identity_resolver.rb +49 -9
- data/lib/ace/assign/molecules/execution_scope_lineage.rb +327 -0
- data/lib/ace/assign/molecules/journal_mutation.rb +202 -0
- data/lib/ace/assign/molecules/lifecycle_exclusion.rb +4 -0
- data/lib/ace/assign/molecules/proposal_journal.rb +151 -0
- data/lib/ace/assign/molecules/receipt_verifier.rb +49 -19
- data/lib/ace/assign/organisms/assignment_executor.rb +6 -0
- data/lib/ace/assign/organisms/attempt_coordinator.rb +312 -13
- data/lib/ace/assign/organisms/delivery_coordinator.rb +342 -0
- data/lib/ace/assign/organisms/task_assignment_creator.rb +8 -3
- data/lib/ace/assign/version.rb +1 -1
- data/lib/ace/assign.rb +13 -0
- metadata +107 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f8f85e3c4fd7760b26493ade861cb5a7b1fda59227909762005d75ee2dc14db1
|
|
4
|
+
data.tar.gz: 3a491eefefece8e3e7995f68e4fd84536a3e55e436c503119555ea55a17da464
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0a47581f03920859a3712c10026b0bd034127dfd640c33d64636d88543108ebc2815b475414eccef721ac5d68db1a625a2538c8ffcc381c02cf851041206bb1e
|
|
7
|
+
data.tar.gz: 1bf276d020c5ff7c2740d9d9a3ccaf9837af09197156ded76af8f7d6ca27cb99bf4b24cfb7f1176b3134cc9ecf732822302a3ddd987355e6ff0dbecfd9ada77c
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
name: create-pr
|
|
2
|
-
skill: as-
|
|
3
|
-
instructions: "
|
|
2
|
+
skill: as-git-pr-create
|
|
3
|
+
instructions: "Use ace-assign delivery --assignment ID --attempt ATTEMPT --operation create --title TITLE --body-file DESCRIPTION. The canonical workflow creates or reconciles a draft by default before independent review."
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
name: mark-pr-ready
|
|
2
2
|
description: Mark a reviewed draft pull request ready after the review completion rule
|
|
3
|
-
instructions: "After the review completion rule is met and appropriate tests have passed, run
|
|
3
|
+
instructions: "After the review completion rule is met and appropriate tests have passed, run ace-assign delivery --assignment ID --attempt ATTEMPT --operation ready --tests TEST-REF --review REVIEW-REF with accepted exact-head evidence."
|
|
4
4
|
prerequisites:
|
|
5
5
|
- name: review-pr
|
|
6
6
|
strength: required
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
name: release-minor
|
|
2
|
-
description:
|
|
2
|
+
description: Prepare modified package versions and CHANGELOGs; publication is separate
|
|
3
3
|
|
|
4
4
|
prerequisites:
|
|
5
5
|
- name: verify-test
|
|
@@ -17,7 +17,9 @@ when_to_skip:
|
|
|
17
17
|
- "No version-worthy changes since last release"
|
|
18
18
|
- "Release is handled externally"
|
|
19
19
|
|
|
20
|
-
workflow: wfi://release/
|
|
20
|
+
workflow: wfi://release/bump-version
|
|
21
21
|
|
|
22
22
|
effort: light
|
|
23
23
|
tags: [git, versioning, release]
|
|
24
|
+
|
|
25
|
+
instructions: "Prepare version/changelog changes only. Do not publish gems, deploy, or create a release merely because delivery completes."
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
name: release
|
|
2
|
-
description:
|
|
2
|
+
description: Prepare modified package versions and CHANGELOGs; publication is separate
|
|
3
3
|
|
|
4
4
|
prerequisites:
|
|
5
5
|
- name: work-on-task
|
|
@@ -17,7 +17,9 @@ when_to_skip:
|
|
|
17
17
|
- "No version-worthy changes since last release"
|
|
18
18
|
- "Release is handled externally"
|
|
19
19
|
|
|
20
|
-
workflow: wfi://release/
|
|
20
|
+
workflow: wfi://release/bump-version
|
|
21
21
|
|
|
22
22
|
effort: light
|
|
23
23
|
tags: [git, versioning, release]
|
|
24
|
+
|
|
25
|
+
instructions: "Prepare version/changelog changes only. Do not publish gems, deploy, or create a release merely because delivery completes."
|
|
@@ -5,6 +5,18 @@ name: fix-bug
|
|
|
5
5
|
description: Fix an issue, verify tests, and create a reviewed PR
|
|
6
6
|
|
|
7
7
|
parameters:
|
|
8
|
+
forge_server:
|
|
9
|
+
required: false
|
|
10
|
+
type: string
|
|
11
|
+
description: Named configured forge; mutually exclusive with forge_default
|
|
12
|
+
forge_default:
|
|
13
|
+
required: false
|
|
14
|
+
type: boolean
|
|
15
|
+
description: Explicitly select the configured default forge
|
|
16
|
+
pr_provenance:
|
|
17
|
+
required: false
|
|
18
|
+
type: object
|
|
19
|
+
description: Explicit mode, head_repository_url, head_ref, base_repository_url and base_ref; required before remote delivery
|
|
8
20
|
taskref:
|
|
9
21
|
required: true
|
|
10
22
|
description: Task reference for the bug fix (e.g., 123 or 256.01)
|
|
@@ -37,7 +49,7 @@ steps:
|
|
|
37
49
|
- Ensure all required checks pass before continuing.
|
|
38
50
|
|
|
39
51
|
- name: create-pr
|
|
40
|
-
skill: as-
|
|
52
|
+
skill: as-git-pr-create
|
|
41
53
|
instructions:
|
|
42
54
|
- Create a pull request for the bug fix.
|
|
43
55
|
- Create it as a draft with --draft; mark it ready only after the review completion rule is met.
|
|
@@ -50,13 +62,13 @@ steps:
|
|
|
50
62
|
- "Verify findings, fix concrete defects, and run appropriate tests. Record rounds and dispositions; commits do not reset counters."
|
|
51
63
|
|
|
52
64
|
- name: update-pr-desc
|
|
53
|
-
workflow: wfi://
|
|
65
|
+
workflow: wfi://git/pr/update
|
|
54
66
|
instructions:
|
|
55
67
|
- "Record the review rounds, actual reviewers, findings and tests in the PR description before marking it ready."
|
|
56
68
|
|
|
57
69
|
- name: mark-pr-ready
|
|
58
70
|
instructions:
|
|
59
|
-
- "After review completes and appropriate tests pass, run `
|
|
71
|
+
- "After review completes and appropriate tests pass, run `ace-assign delivery --assignment ID --attempt ATTEMPT --operation ready --tests TEST-REF --review REVIEW-REF` with accepted exact-head test and independent review references."
|
|
60
72
|
|
|
61
73
|
customization_hints:
|
|
62
74
|
- "Add fix-tests after verify-test-suite if failures found"
|
|
@@ -5,6 +5,18 @@ name: work-on-task-ace-development
|
|
|
5
5
|
description: Full ACE development pipeline with batching, releases, demo recording, and retrospectives
|
|
6
6
|
|
|
7
7
|
parameters:
|
|
8
|
+
forge_server:
|
|
9
|
+
required: false
|
|
10
|
+
type: string
|
|
11
|
+
description: Named configured forge; mutually exclusive with forge_default
|
|
12
|
+
forge_default:
|
|
13
|
+
required: false
|
|
14
|
+
type: boolean
|
|
15
|
+
description: Explicitly select the configured default forge
|
|
16
|
+
pr_provenance:
|
|
17
|
+
required: false
|
|
18
|
+
type: object
|
|
19
|
+
description: Explicit mode, head_repository_url, head_ref, base_repository_url and base_ref; required before remote delivery
|
|
8
20
|
taskrefs:
|
|
9
21
|
required: true
|
|
10
22
|
type: array
|
|
@@ -26,11 +38,11 @@ steps:
|
|
|
26
38
|
- name: release-minor
|
|
27
39
|
number: "020"
|
|
28
40
|
instructions:
|
|
29
|
-
-
|
|
41
|
+
- Prepare version and changelog changes for modified packages only; publishing is a separate authorized operation.
|
|
30
42
|
|
|
31
43
|
- name: create-pr
|
|
32
44
|
number: "030"
|
|
33
|
-
workflow: wfi://
|
|
45
|
+
workflow: wfi://git/pr/create
|
|
34
46
|
instructions:
|
|
35
47
|
- "Create a pull request summarizing batch tasks: {{taskrefs}}."
|
|
36
48
|
- "Create it as a draft with --draft; mark it ready only after the review completion rule is met."
|
|
@@ -61,11 +73,11 @@ steps:
|
|
|
61
73
|
|
|
62
74
|
- name: update-pr-desc
|
|
63
75
|
number: "149"
|
|
64
|
-
workflow: wfi://
|
|
76
|
+
workflow: wfi://git/pr/update
|
|
65
77
|
instructions:
|
|
66
78
|
- "Record the review rounds, actual reviewers, findings and tests in the PR description before marking it ready."
|
|
67
79
|
|
|
68
80
|
- name: mark-pr-ready
|
|
69
81
|
number: "150"
|
|
70
82
|
instructions:
|
|
71
|
-
- "After review completes and appropriate tests pass, run `
|
|
83
|
+
- "After review completes and appropriate tests pass, run `ace-assign delivery --assignment ID --attempt ATTEMPT --operation ready --tests TEST-REF --review REVIEW-REF` with accepted exact-head test and independent review references."
|
|
@@ -5,6 +5,18 @@ name: work-on-task-auto-merge
|
|
|
5
5
|
description: Work on a task with PR, converging review rounds, and advance authorization for guarded auto-merge
|
|
6
6
|
|
|
7
7
|
parameters:
|
|
8
|
+
forge_server:
|
|
9
|
+
required: false
|
|
10
|
+
type: string
|
|
11
|
+
description: Named configured forge; mutually exclusive with forge_default
|
|
12
|
+
forge_default:
|
|
13
|
+
required: false
|
|
14
|
+
type: boolean
|
|
15
|
+
description: Explicitly select the configured default forge
|
|
16
|
+
pr_provenance:
|
|
17
|
+
required: false
|
|
18
|
+
type: object
|
|
19
|
+
description: Explicit mode, head_repository_url, head_ref, base_repository_url and base_ref; required before remote delivery
|
|
8
20
|
taskrefs:
|
|
9
21
|
required: true
|
|
10
22
|
type: array
|
|
@@ -19,7 +31,7 @@ steps:
|
|
|
19
31
|
|
|
20
32
|
- name: create-pr
|
|
21
33
|
number: "030"
|
|
22
|
-
workflow: wfi://
|
|
34
|
+
workflow: wfi://git/pr/create
|
|
23
35
|
instructions:
|
|
24
36
|
- "Create a pull request summarizing task: {{taskrefs}}."
|
|
25
37
|
- "Create it as a draft with --draft; mark it ready only after the review completion rule is met."
|
|
@@ -44,14 +56,14 @@ steps:
|
|
|
44
56
|
|
|
45
57
|
- name: update-pr-desc
|
|
46
58
|
number: "147"
|
|
47
|
-
workflow: wfi://
|
|
59
|
+
workflow: wfi://git/pr/update
|
|
48
60
|
instructions:
|
|
49
61
|
- "Record the review rounds, actual reviewers, findings and tests in the PR description before marking it ready."
|
|
50
62
|
|
|
51
63
|
- name: mark-pr-ready
|
|
52
64
|
number: "148"
|
|
53
65
|
instructions:
|
|
54
|
-
- "After review completes and appropriate tests pass, run `
|
|
66
|
+
- "After review completes and appropriate tests pass, run `ace-assign delivery --assignment ID --attempt ATTEMPT --operation ready --tests TEST-REF --review REVIEW-REF` with accepted exact-head test and independent review references."
|
|
55
67
|
|
|
56
68
|
- name: auto-merge
|
|
57
69
|
number: "150"
|
|
@@ -8,6 +8,18 @@ name: work-on-task
|
|
|
8
8
|
description: Work on one or more tasks with PR, iterative review, release, and clean history
|
|
9
9
|
|
|
10
10
|
parameters:
|
|
11
|
+
forge_server:
|
|
12
|
+
required: false
|
|
13
|
+
type: string
|
|
14
|
+
description: Named configured forge; mutually exclusive with forge_default
|
|
15
|
+
forge_default:
|
|
16
|
+
required: false
|
|
17
|
+
type: boolean
|
|
18
|
+
description: Explicitly select the configured default forge
|
|
19
|
+
pr_provenance:
|
|
20
|
+
required: false
|
|
21
|
+
type: object
|
|
22
|
+
description: Explicit mode, head_repository_url, head_ref, base_repository_url and base_ref; required before remote delivery
|
|
11
23
|
taskrefs:
|
|
12
24
|
required: true
|
|
13
25
|
type: array
|
|
@@ -32,7 +44,7 @@ steps:
|
|
|
32
44
|
- name: release-minor
|
|
33
45
|
number: "020"
|
|
34
46
|
instructions:
|
|
35
|
-
-
|
|
47
|
+
- Prepare version and changelog changes for modified packages only; publishing is a separate authorized operation.
|
|
36
48
|
- Auto-detect modified packages from the current diff, bump version (minor or patch, usually minor), and update both package and root CHANGELOGs.
|
|
37
49
|
- This is the initial release for new functionality.
|
|
38
50
|
- Follow semantic versioning conventions.
|
|
@@ -48,7 +60,7 @@ steps:
|
|
|
48
60
|
|
|
49
61
|
- name: create-pr
|
|
50
62
|
number: "030"
|
|
51
|
-
workflow: wfi://
|
|
63
|
+
workflow: wfi://git/pr/create
|
|
52
64
|
instructions:
|
|
53
65
|
- "Create a pull request summarizing batch tasks: {{taskrefs}}."
|
|
54
66
|
- "Create it as a draft with --draft; mark it ready only after the review completion rule is met."
|
|
@@ -127,7 +139,7 @@ steps:
|
|
|
127
139
|
- name: update-pr-desc
|
|
128
140
|
number: "180"
|
|
129
141
|
context: fork
|
|
130
|
-
workflow: wfi://
|
|
142
|
+
workflow: wfi://git/pr/update
|
|
131
143
|
instructions:
|
|
132
144
|
- "Update the PR description with the final batch summary for: {{taskrefs}}."
|
|
133
145
|
- "CRITICAL: The File Changes section must contain the complete, untruncated grouped-stats output from `ace-git diff`. Paste it verbatim — never summarize or abbreviate."
|
|
@@ -137,7 +149,7 @@ steps:
|
|
|
137
149
|
- name: mark-pr-ready
|
|
138
150
|
number: "190"
|
|
139
151
|
instructions:
|
|
140
|
-
- "After review completes and appropriate tests pass, run `
|
|
152
|
+
- "After review completes and appropriate tests pass, run `ace-assign delivery --assignment ID --attempt ATTEMPT --operation ready --tests TEST-REF --review REVIEW-REF` with accepted exact-head test and independent review references."
|
|
141
153
|
|
|
142
154
|
expansion:
|
|
143
155
|
batch-parent:
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,49 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.64.0] - 2026-10-05
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Connect fixed execution-slot parent activation to canonical sealing, exact never-native-admitted closure, guarded abort, durable reservation release and restart-safe reuse. Native service admission refuses unavailable readiness evidence; admitted and post-native positive closure and complete installer maintenance remain unfinished.
|
|
15
|
+
|
|
16
|
+
- Register canonical execution-scope binding, seal and empty-observation events with an immutable exact-lineage reader. Missing, changed or corrupt generation/proof identities refuse; live scope verification and terminal handlers remain separate owners.
|
|
17
|
+
|
|
18
|
+
- Submit immutable private canonical worker results and fetch one purpose-authorized artifact through the existing authority Client, with retained services status discovery and exact download descriptor validation. Full-service startup remains guarded.
|
|
19
|
+
|
|
20
|
+
- Validate fixed service receiver principals and private placement before authority startup, refusing ambiguous roles, overlapping ownership and inaccessible endpoints.
|
|
21
|
+
|
|
22
|
+
- Add the public protected assignment authority and gated launch driver with canonical reservation, exact binding, one durable release, replay refusal and conservative crash recovery.
|
|
23
|
+
|
|
24
|
+
- Resolve immutable second-commander proposals through confirmed-delivery sixteen-hour policy and canonical Assign authorization.
|
|
25
|
+
- Atomic execution-ref mutation/import primitives with exact reply replay and canonical artifact binding/provenance verification. Intent-only attempts remain reserved until a real process-start fact.
|
|
26
|
+
- Resume from accepted attempt history without relaunch/replay; consume signed inbox observations in the existing journal and preserve unknown owner/effect state.
|
|
27
|
+
|
|
28
|
+
- Attempt-bound, provider-neutral delivery records draft creation, update and readiness in the existing evidence journal; lost responses reconcile exact remote identity without repeating writes. Readiness consumes accepted current test and independent review evidence, and merge consumes the existing authorized service receipt.
|
|
29
|
+
- Explicit forge selection and canonical/fork provenance for remote assignment creation; local assignments reject unused delivery inputs.
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
|
|
33
|
+
- Declare the required direct dependencies and minimum producer versions for this coordinated release: `ace-git ~> 0.29`, `ace-herdr ~> 0.4`, `ace-llm-providers-cli ~> 0.36.1`, `ace-review ~> 0.59`, `ace-runtime ~> 0.2`, `ace-support-fs ~> 0.3`.
|
|
34
|
+
|
|
35
|
+
- Align prepare/drive discovery and draft creation instructions with the canonical neutral PR skills and attempt-bound delivery command.
|
|
36
|
+
|
|
37
|
+
- Expose read-only runtime_binding for an active accepted attempt using the existing native/process authority, refusing missing, dead, changed or unrelated owner evidence.
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
|
|
41
|
+
- Reject duplicate keys and comments in guarded scope-abort evidence using the required strict JSON parser, and preserve canonical slot ownership after child-only failure until whole-scope cleanup is proven.
|
|
42
|
+
|
|
43
|
+
- Attribute local attempts to the kernel process account instead of terminal login/environment; refuse unresolved accounts, privilege transitions and changing credentials.
|
|
44
|
+
- Commit proposal supersession and the new revision atomically with canonical operation replay and unresolved-effect claim exclusion.
|
|
45
|
+
|
|
46
|
+
- Enforce global proposal identity ownership and immutable prepared lifecycle projection in the sole canonical proposal journal.
|
|
47
|
+
- Refuse finish receipts for unbound reservations before terminal acceptance, and preserve exact canonical import bytes across Git filters and CRLF conversion.
|
|
48
|
+
|
|
49
|
+
- Clean failed evidence transactions at every shared journal writer boundary; preserve unbound launch reservations and report explicit recovery evidence requirements.
|
|
50
|
+
|
|
51
|
+
- Retain delivery context across scoped attempts and distinguish a recovered prior effect from a new request with different content or evidence before reporting completion.
|
|
52
|
+
|
|
10
53
|
## [0.63.1] - 2026-10-04
|
|
11
54
|
|
|
12
55
|
### Changed
|
|
@@ -19,7 +19,7 @@ scenes:
|
|
|
19
19
|
commands:
|
|
20
20
|
- type: sed -n '20,33p' $PROJECT_ROOT_PATH/ace-task/handbook/skills/as-task-plan/SKILL.md
|
|
21
21
|
sleep: 3s
|
|
22
|
-
- type: sed -n '
|
|
22
|
+
- type: sed -n '1,23p' $PROJECT_ROOT_PATH/ace-git/handbook/skills/as-git-pr-create/SKILL.md
|
|
23
23
|
sleep: 3s
|
|
24
24
|
- name: Assignment steps keep the canonical source contract
|
|
25
25
|
commands:
|
|
@@ -33,15 +33,15 @@ scenes:
|
|
|
33
33
|
commands:
|
|
34
34
|
- type: clear
|
|
35
35
|
sleep: 1s
|
|
36
|
-
- type: sed -n '13,36p' $PROJECT_ROOT_PATH/.
|
|
36
|
+
- type: sed -n '13,36p' $PROJECT_ROOT_PATH/.agents/skills/as-task-plan/SKILL.md
|
|
37
37
|
sleep: 3s
|
|
38
|
-
- type: sed -n '
|
|
38
|
+
- type: sed -n '1,26p' $PROJECT_ROOT_PATH/.agents/skills/as-git-pr-create/SKILL.md
|
|
39
39
|
sleep: 3s
|
|
40
40
|
- name: Lint accepts the canonical skill contract
|
|
41
41
|
commands:
|
|
42
42
|
- type: clear
|
|
43
43
|
sleep: 1s
|
|
44
|
-
- type: ace-lint $PROJECT_ROOT_PATH/ace-lint/handbook/skills/as-lint-run/SKILL.md $PROJECT_ROOT_PATH/ace-task/handbook/skills/as-task-plan/SKILL.md $PROJECT_ROOT_PATH/ace-git/handbook/skills/as-
|
|
44
|
+
- type: ace-lint $PROJECT_ROOT_PATH/ace-lint/handbook/skills/as-lint-run/SKILL.md $PROJECT_ROOT_PATH/ace-task/handbook/skills/as-task-plan/SKILL.md $PROJECT_ROOT_PATH/ace-git/handbook/skills/as-git-pr-create/SKILL.md
|
|
45
45
|
sleep: 4s
|
|
46
46
|
verify:
|
|
47
47
|
forbid_output:
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
---
|
|
2
|
+
doc-type: user
|
|
3
|
+
purpose: Fixed protected authority deployment and canonical launch lifecycle
|
|
4
|
+
ace-docs:
|
|
5
|
+
last-updated: 2026-10-05
|
|
6
|
+
last-checked: 2026-10-05
|
|
7
|
+
subject:
|
|
8
|
+
- code:
|
|
9
|
+
diff:
|
|
10
|
+
paths:
|
|
11
|
+
- ace-assign/lib/ace/assign/authority/**/*.rb
|
|
12
|
+
- ace-assign/lib/ace/assign/molecules/execution_scope_lineage.rb
|
|
13
|
+
- ace-runtime/lib/ace/runtime/molecules/systemd_scope_manager.rb
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Protected native launch
|
|
17
|
+
|
|
18
|
+
`ace-assign authority serve --authority AUTHORITY` runs the standalone launch
|
|
19
|
+
composition. Lab owns the services composition using the same Assign server,
|
|
20
|
+
router, lifecycle, journal and endpoint. Its full-service startup guard remains
|
|
21
|
+
closed while required finish, recovery, inbox and no-effect handlers are incomplete.
|
|
22
|
+
The installed `composition` must match the entrypoint. A project has exactly one
|
|
23
|
+
configured authority owner; duplicate project owners or endpoints fail before
|
|
24
|
+
listener creation.
|
|
25
|
+
|
|
26
|
+
An administrator provisions `/etc/ace/assignment-authorities.json`. There is no
|
|
27
|
+
caller-selected configuration path or local fallback. The outer object contains
|
|
28
|
+
`schema: "ace.assign.authorities/v2"`, `authorities`, `projects`, and
|
|
29
|
+
`launch_mappings`; unknown fields are refused. The fixed schema is implemented
|
|
30
|
+
by `Ace::Assign::Authority::Deployment`:
|
|
31
|
+
|
|
32
|
+
| Installed object | Required fields |
|
|
33
|
+
| --- | --- |
|
|
34
|
+
| `authorities.ID` | `uid`, `gid`, sorted unique `groups`, `socket_path`, `state_root`, `composition` (`launch` or `services`) |
|
|
35
|
+
| `projects.ID` | `journal_repository`, `evidence_git_ref` (`refs/ace/execution`), `evidence_checkout_root`, `assignment_root`, `candidate_root`, `launcher_uids`, `reviewer_uids`, `worker_uids`, `service_executor_uids`, `supervisor_uids`, `peer_credentials`, optional `service_receivers` |
|
|
36
|
+
| `projects.ID.peer_credentials.UID` | `gid`, sorted unique `groups`, `scratch_root`; every configured role UID has one fixed entry |
|
|
37
|
+
| `launch_mappings.ID` | `project_id`, `authority_id`, `launcher_uid`, `launcher_gid`, `launcher_groups`, `worker_uid`, `worker_gid`, `worker_groups`, `worker_actor`, `worker_cwd`, `worker_argv`, `worker_env`, `bootstrap`, `bootstrap_sha256`, `native`, `execution_scope` |
|
|
38
|
+
| `launch_mappings.ID.native` | `socket_path`, `executable`, `executable_sha256`, `version` (`0.9.3`), `protocol` (`22`), canonical `workspace_id` (`wN`) |
|
|
39
|
+
| `launch_mappings.ID.execution_scope` | `backend` (`linux_systemd_cgroup_v2`), `slot_id`, `slice_unit`, `service_unit`, `unit_manifest_sha256`, `boundary_manifest_sha256`, `root_directory`, `runtime_directory`, `network_namespace_path` |
|
|
40
|
+
|
|
41
|
+
A services composition requires a nonempty installed `service_receivers` map; launch composition may omit it. Each fixed service ID maps to exactly `{executor_uid, socket_path, staging_root}`. The positive nonroot executor UID belongs to the project's executor allowlist and cannot also be any configured authority, launcher, reviewer, worker or supervisor. This keeps kernel role selection unambiguous and private authority journals inaccessible to executors.
|
|
42
|
+
|
|
43
|
+
Receiver socket and staging paths are canonical absolute paths with root-or-executor owned, nonwritable ancestry. Staging is executor-owned mode0700 and disjoint from other receiver staging and authority state roots. The endpoint resides outside private staging, where the actual authority can traverse its ancestry and inspect it. A pre-existing endpoint must be an executor-owned socket with its installed GID and no permissions for others. Duplicate receiver/authority endpoints, substituted paths and unreadable placement refuse before the authority opens its listener or creates journal state. These mappings select identity and placement; operation argv and grants remain the existing Lab ServicePolicy.
|
|
44
|
+
|
|
45
|
+
All paths are canonical and absolute. The native socket identity is the observed
|
|
46
|
+
`[device, inode, worker_uid]`. The server identity is the exact observed object
|
|
47
|
+
`{pid, uid, gid, groups, parent_pid, started_at, host}`, where `started_at` is
|
|
48
|
+
`linux:BOOT_ID:START_TICKS`. These observations must be made after the root-owned
|
|
49
|
+
native service starts; they cannot be invented, copied from a previous boot, or
|
|
50
|
+
supplied by a worker. The immutable per-attempt native stage owns these facts;
|
|
51
|
+
the deployment record contains no persisted live server/socket tuple. A replacement
|
|
52
|
+
cannot be repinned into the original generation.
|
|
53
|
+
The root-installed native service, its executable, environment and configuration
|
|
54
|
+
are trusted. Merely running arbitrary worker-supplied server code under the worker
|
|
55
|
+
account does not meet this deployment contract.
|
|
56
|
+
|
|
57
|
+
The authority, launcher and worker are distinct non-root accounts. Authority
|
|
58
|
+
journal/cache/import/candidate/assignment/state roots are authority-owned 0700
|
|
59
|
+
with protected ancestry. Peer scratch roots are private to their mapped account.
|
|
60
|
+
The authority socket's directory prevents worker/launcher replacement; its group
|
|
61
|
+
and narrow installer ACL must permit the configured peers to connect. Native
|
|
62
|
+
socket ACL permits the trusted launcher to use the pinned Herdr API. The
|
|
63
|
+
bootstrap, payload executable, native executable, mapping and their ancestors are
|
|
64
|
+
root-owned and non-writable by the worker. Payload argv/cwd/environment are fixed
|
|
65
|
+
installed data; loader and interpreter injection environment fields are refused.
|
|
66
|
+
|
|
67
|
+
Linux Yama `ptrace_scope=2`, empty Inh/Prm/Eff/Bnd/Amb capabilities,
|
|
68
|
+
`NoNewPrivs=1`, fixed real/effective/saved/filesystem UID/GID and supplementary
|
|
69
|
+
groups are mandatory for every participant, including the pinned native server.
|
|
70
|
+
The shipped [native build/install instructions](../../ace-runtime/native/README.md)
|
|
71
|
+
describe architecture, distro dependencies, immutable artifact digest and service
|
|
72
|
+
unit requirements. ACE verifies and refuses missing policy; it does not modify
|
|
73
|
+
sysctls, create accounts, change another user's Herdr, or install service policy.
|
|
74
|
+
|
|
75
|
+
After installation, the trusted launcher preflights without any mutation or
|
|
76
|
+
native creation:
|
|
77
|
+
|
|
78
|
+
```sh
|
|
79
|
+
ace-assign authority launch --mapping MAPPING --dry-run
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Launch one managed definition using a stable invocation ID:
|
|
83
|
+
|
|
84
|
+
```sh
|
|
85
|
+
ace-assign authority launch --mapping MAPPING --assignment ASSIGNMENT \
|
|
86
|
+
--definition /absolute/managed-definition.json --step 010 \
|
|
87
|
+
--base-head EXACT_40_CHARACTER_COMMIT --mutation INVOCATION_ID
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The definition is a normal managed assignment JSON document (maximum 32 KiB),
|
|
91
|
+
with matching `session_id`, `task_id` and installed `project_id`. The authority
|
|
92
|
+
stores its exact immutable bytes in the canonical journal and materializes the
|
|
93
|
+
owner-private assignment cache from that accepted blob. An active attempt blocks
|
|
94
|
+
changed definitions. A fresh reservation creates canonical intent/provisioning,
|
|
95
|
+
then the owner activates and binds its independent parent under the slot exclusion.
|
|
96
|
+
It pins existing resource objects, the authority mount namespace and the installed
|
|
97
|
+
nsfs network namespace. Parent binding selects protected network evidence references
|
|
98
|
+
without asserting policy readiness or requiring an available report.
|
|
99
|
+
|
|
100
|
+
Native service admission is a separate private canonical CAS after all required
|
|
101
|
+
readiness evidence succeeds. Only its fresh winner may start the fixed service;
|
|
102
|
+
replay and lost replies never permit another start. Native and original-child
|
|
103
|
+
bindings remain separate immutable stages before payload release.
|
|
104
|
+
|
|
105
|
+
The original authenticated native layout response fixes workspace/tab/pane and
|
|
106
|
+
exact child lineage. Record captures that original child; bind creates the running
|
|
107
|
+
attempt without payload permission. The immutable native bootstrap connects once,
|
|
108
|
+
sets non-dumpable before admission, and waits for the separate release. Release
|
|
109
|
+
commits issuance before one framed permission. Replay returns canonical issuance
|
|
110
|
+
without sending another frame. Reply loss after issuance is potentially executed.
|
|
111
|
+
A worker-controlled native input/close path can deny or interrupt launch, but cannot
|
|
112
|
+
replace the authenticated origin or forge authority release.
|
|
113
|
+
|
|
114
|
+
Inspect or request exact native termination through the same installed mapping.
|
|
115
|
+
Once the original launcher process has exited, run these commands as a mapped
|
|
116
|
+
recovery supervisor with the installed native close ACL; a new process under the
|
|
117
|
+
launcher UID does not inherit the original launcher incarnation:
|
|
118
|
+
|
|
119
|
+
```sh
|
|
120
|
+
ace-assign authority status --mapping MAPPING --assignment ASSIGNMENT --attempt ATTEMPT
|
|
121
|
+
ace-assign authority terminate --mapping MAPPING --assignment ASSIGNMENT --attempt ATTEMPT
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
A child pidfd proving exit cannot release the whole parent reservation. The
|
|
125
|
+
connected never-native-admitted path seals the original parent before fixed service
|
|
126
|
+
stop, records fresh exact recursive-empty/no-pending/resource closure, selects that
|
|
127
|
+
canonical proof in the guarded pre-release abort, then privately commits reservation
|
|
128
|
+
release after service/inbox settlement at the same immutable journal commit. A lost
|
|
129
|
+
reply keeps the original accepted response. Restart can resume a missing private
|
|
130
|
+
release without issuing native or payload permission. A new reservation first retires
|
|
131
|
+
its exactly released predecessor through the same owner and slot exclusion.
|
|
132
|
+
|
|
133
|
+
`observe_execution_scope` is read-only. `close_execution_scope` is an ordinary
|
|
134
|
+
canonical mutation: the first fresh call seals, a later fresh call records closure
|
|
135
|
+
when verifiable. A fresh sealed close can resume a lost fixed service stop; replay
|
|
136
|
+
performs no manager I/O. The private `scope_service_admission` and
|
|
137
|
+
`scope_reservation_release` operations are absent from the public allowlist.
|
|
138
|
+
Reserve/close RPCs have a fixed 90-second ceiling for bounded manager waits;
|
|
139
|
+
other control calls retain their existing ceiling.
|
|
140
|
+
|
|
141
|
+
This source checkpoint proves the connected never-native-admitted failure/recovery
|
|
142
|
+
path with controlled native-owner observations and real canonical journals. Full
|
|
143
|
+
native hook/readiness and post-native writer observation, admitted-but-unbound
|
|
144
|
+
cleanup, non-abort terminal release, and complete original/candidate installation
|
|
145
|
+
maintenance remain separate required implementation work. The current maintenance
|
|
146
|
+
helpers do not yet implement the accepted candidate-deployment union contract.
|
|
147
|
+
No source fixture establishes installed namespace, network policy or containment
|
|
148
|
+
acceptance; every installed SC remains open.
|
|
149
|
+
|
|
150
|
+
Control replies are at most 16 KiB. Source-selected service transfer operations use
|
|
151
|
+
a 16 KiB authenticated header followed by bounded raw bytes, a shared 30-second
|
|
152
|
+
deadline, exact hashes, upload write-EOF and at most two active transfers. Exact
|
|
153
|
+
origin/role admission happens before private spool allocation and is revalidated
|
|
154
|
+
before canonical mutation. The standalone launch composition exposes no transfer
|
|
155
|
+
operations.
|
|
156
|
+
|
|
157
|
+
Source tests and Linux primitive fixtures are separate from installed deployment
|
|
158
|
+
acceptance. A Docker kernel with Yama=0 is expected to refuse the product gate;
|
|
159
|
+
it does not establish the required positive protected launch proof.
|
|
160
|
+
|
|
161
|
+
Protected launch uses only `layout.apply` in the installed workspace. `workspace.get` checks that exact workspace ID before creation; its reply must echo the ID even when another workspace is active. Missing or replaced containers refuse without fallback. Container contents supply no worker evidence. The original fresh layout reply remains the source of the new tab/pane identity.
|
|
162
|
+
|
|
163
|
+
Receiver admission reads Linux `system.posix_acl_access` on every directory from
|
|
164
|
+
the endpoint parent and private staging root to `/`, and evaluates search access
|
|
165
|
+
for the installed executor UID, primary GID and supplemental groups. Named user
|
|
166
|
+
entries override group/other entries; the ACL mask constrains named user and
|
|
167
|
+
group entries. Absence of an access ACL uses ordinary mode permissions;
|
|
168
|
+
unsupported, unreadable or malformed ACL data refuses startup. The authority
|
|
169
|
+
must also actually traverse the endpoint and staging parents. This inspection
|
|
170
|
+
does not claim an executor readiness handshake or bypass additional LSM policy;
|
|
171
|
+
the installed receiver still performs its own bind and private staging checks.
|
|
172
|
+
|
|
173
|
+
## Canonical result Client API
|
|
174
|
+
|
|
175
|
+
The source-owned services handlers accept a live mapped worker's bounded result
|
|
176
|
+
without terminalizing the attempt or releasing scope. The public seam is
|
|
177
|
+
`Ace::Assign::Authority::Client`; no result CLI is introduced. Launch-only
|
|
178
|
+
`attempt_status` retains its existing schema without a result selector. These
|
|
179
|
+
source handlers and their deterministic tests do not establish installed
|
|
180
|
+
full-service deployment acceptance.
|
|
181
|
+
|
|
182
|
+
From an admitted services attempt, discover its current candidate and authority
|
|
183
|
+
generation, then upload receipt JSON bytes followed by its declared artifact
|
|
184
|
+
bytes in order:
|
|
185
|
+
|
|
186
|
+
```ruby
|
|
187
|
+
require "ace/assign"
|
|
188
|
+
require "json"
|
|
189
|
+
require "digest"
|
|
190
|
+
|
|
191
|
+
client = Ace::Assign::Authority::Client.new(mapping_id: mapping_id)
|
|
192
|
+
binding = {"assignment_id" => assignment_id, "attempt_id" => attempt_id}
|
|
193
|
+
status = client.call("attempt_status", binding.merge(
|
|
194
|
+
"result_candidate_generation" => nil
|
|
195
|
+
)).data
|
|
196
|
+
receipt_bytes = File.binread(local_receipt_path)
|
|
197
|
+
receipt = JSON.parse(receipt_bytes)
|
|
198
|
+
artifacts = receipt.fetch("artifacts").map { |ref| File.binread(ref.fetch("path")) }
|
|
199
|
+
params = binding.merge(
|
|
200
|
+
"expected_generation" => status.fetch("authority_generation"),
|
|
201
|
+
"candidate_generation" => status.fetch("result_candidate_generation"),
|
|
202
|
+
"head" => receipt.fetch("head"),
|
|
203
|
+
"receipt_sha256" => Digest::SHA256.hexdigest(receipt_bytes)
|
|
204
|
+
)
|
|
205
|
+
reply = client.call("submit_result", params, mutation_id: persisted_mutation_id,
|
|
206
|
+
upload_parts: [receipt_bytes, *artifacts], purpose: :receipt_artifacts, timeout: 30)
|
|
207
|
+
result = reply.data
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Only local byte strings cross the boundary; receipt paths are declarations, not
|
|
211
|
+
authority filesystem access. The authority checks exact canonical worker
|
|
212
|
+
attribution, original receipt digest and SHA256, candidate, native lineage and
|
|
213
|
+
current visibility. It normalizes artifact references and writes private
|
|
214
|
+
`result_submitted` metadata, imported blobs and a sanitized mutation reply in one
|
|
215
|
+
Git CAS. Failed results may have `artifacts: []`; no synthetic artifact is added.
|
|
216
|
+
Campaign receipts refuse until the trusted campaign owner is integrated.
|
|
217
|
+
|
|
218
|
+
Persist the exact params, mutation ID and ordered byte strings before submission.
|
|
219
|
+
An exact retry while the worker remains live and the attempt active returns the
|
|
220
|
+
same result without another import. A changed input or fresh mutation ID for the
|
|
221
|
+
same candidate conflicts. Correcting a result requires a new candidate generation
|
|
222
|
+
even at unchanged HEAD; both records remain immutable. Submission creates no
|
|
223
|
+
`receipt_accepted` event or terminal transition.
|
|
224
|
+
|
|
225
|
+
The reply contains result ID, head, candidate generation, verdict, ordered
|
|
226
|
+
canonical `{path, sha256}` references, generation and journal commit. Its
|
|
227
|
+
`uploaded_receipt_sha256`, `original_receipt_digest` and normalized
|
|
228
|
+
`receipt_digest` are distinct values. Private receipt, producer and process
|
|
229
|
+
binding are excluded from fresh and replay result replies.
|
|
230
|
+
|
|
231
|
+
After reply loss or worker exit, the exact owning launcher or mapped supervisor
|
|
232
|
+
can discover the retained result and fetch one referenced artifact:
|
|
233
|
+
|
|
234
|
+
```ruby
|
|
235
|
+
status = client.call("attempt_status", binding.merge(
|
|
236
|
+
"result_candidate_generation" => retained_generation # nil selects latest
|
|
237
|
+
)).data
|
|
238
|
+
result = status.fetch("submitted_result")
|
|
239
|
+
if result && (reference = result.fetch("artifacts").first)
|
|
240
|
+
fetched = client.call("evidence_fetch", binding.merge(
|
|
241
|
+
"kind" => "result", "purpose_id" => result.fetch("result_id"),
|
|
242
|
+
"artifact_id" => reference.fetch("path").delete_prefix("evidence/imports/")
|
|
243
|
+
), download: true, purpose: :artifacts, timeout: 30)
|
|
244
|
+
artifact_bytes = fetched.parts.fetch(0)
|
|
245
|
+
end
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Client closes its request write side for services status and evidence fetch;
|
|
249
|
+
Server refuses extra body bytes before exposing either read projection. Status
|
|
250
|
+
reads launch and result projections from one immutable canonical commit.
|
|
251
|
+
`authority_generation` is the current CAS generation; a known candidate without
|
|
252
|
+
a result has `submitted_result: null`. Unknown selected generation is `missing`;
|
|
253
|
+
corrupt or missing referenced provenance is `evidence_unavailable`. Disposable
|
|
254
|
+
caches and requester files never supply evidence.
|
|
255
|
+
|
|
256
|
+
Fetch returns exactly `descriptor`, `generation`, `journal_commit` and the
|
|
257
|
+
Server-generated `transfer` descriptor, with one binary part. Client validates
|
|
258
|
+
the closed canonical descriptor, exact selected purpose, one-part framing,
|
|
259
|
+
aggregate length and SHA256 before exposing bytes. Owning workers read only
|
|
260
|
+
their own results; assigned reviewers read their exact retained review and
|
|
261
|
+
same-candidate result under their live process binding; recorded executors read
|
|
262
|
+
only their own service evidence. Exact owning launchers and mapped supervisors
|
|
263
|
+
read permitted attempt evidence, including retained terminal history. Current
|
|
264
|
+
visibility and peer authorization apply to every read. Reassignment revokes the
|
|
265
|
+
old reviewer purpose. Inbox and observation evidence refuse until their existing
|
|
266
|
+
signer and observer owners provide complete canonical provenance.
|