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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.ace-defaults/assign/catalog/steps/create-pr.step.yml +2 -2
  3. data/.ace-defaults/assign/catalog/steps/mark-pr-ready.step.yml +1 -1
  4. data/.ace-defaults/assign/catalog/steps/release-minor.step.yml +4 -2
  5. data/.ace-defaults/assign/catalog/steps/release.step.yml +4 -2
  6. data/.ace-defaults/assign/catalog/steps/update-pr-desc.step.yml +1 -1
  7. data/.ace-defaults/assign/presets/fix-bug.yml +15 -3
  8. data/.ace-defaults/assign/presets/work-on-task-ace-development.yml +16 -4
  9. data/.ace-defaults/assign/presets/work-on-task-auto-merge.yml +15 -3
  10. data/.ace-defaults/assign/presets/work-on-task.yml +16 -4
  11. data/CHANGELOG.md +43 -0
  12. data/docs/demo/canonical-skill-source.tape.yml +4 -4
  13. data/docs/protected-authority.md +266 -0
  14. data/docs/usage.md +91 -2
  15. data/handbook/workflow-instructions/assign/drive.wf.md +2 -2
  16. data/handbook/workflow-instructions/assign/prepare.wf.md +2 -2
  17. data/lib/ace/assign/atoms/delivery_parameters.rb +54 -0
  18. data/lib/ace/assign/authority/candidate_transfer.rb +160 -0
  19. data/lib/ace/assign/authority/client.rb +107 -0
  20. data/lib/ace/assign/authority/deployment.rb +465 -0
  21. data/lib/ace/assign/authority/endcap.rb +342 -0
  22. data/lib/ace/assign/authority/endcap_inboxes.rb +314 -0
  23. data/lib/ace/assign/authority/endcap_results.rb +380 -0
  24. data/lib/ace/assign/authority/endcap_services.rb +395 -0
  25. data/lib/ace/assign/authority/evidence_transfer.rb +67 -0
  26. data/lib/ace/assign/authority/execution_scope_observation.rb +476 -0
  27. data/lib/ace/assign/authority/launch_driver.rb +114 -0
  28. data/lib/ace/assign/authority/launch_lifecycle.rb +822 -0
  29. data/lib/ace/assign/authority/launch_scope_abort.rb +88 -0
  30. data/lib/ace/assign/authority/launch_scope_admission.rb +84 -0
  31. data/lib/ace/assign/authority/launch_scope_close.rb +115 -0
  32. data/lib/ace/assign/authority/launch_scope_parent.rb +44 -0
  33. data/lib/ace/assign/authority/launch_scope_release.rb +180 -0
  34. data/lib/ace/assign/authority/posix_acl.rb +56 -0
  35. data/lib/ace/assign/authority/private_directory.rb +33 -0
  36. data/lib/ace/assign/authority/receipt_transfer.rb +48 -0
  37. data/lib/ace/assign/authority/router.rb +54 -0
  38. data/lib/ace/assign/authority/server.rb +230 -0
  39. data/lib/ace/assign/authority/service_evidence.rb +55 -0
  40. data/lib/ace/assign/authority/transfer_codec.rb +155 -0
  41. data/lib/ace/assign/cli/commands/authority/launch.rb +45 -0
  42. data/lib/ace/assign/cli/commands/authority/serve.rb +30 -0
  43. data/lib/ace/assign/cli/commands/authority/status.rb +26 -0
  44. data/lib/ace/assign/cli/commands/authority/terminate.rb +29 -0
  45. data/lib/ace/assign/cli/commands/create.rb +9 -1
  46. data/lib/ace/assign/cli/commands/delivery.rb +57 -0
  47. data/lib/ace/assign/cli/commands/inbox_reconcile.rb +36 -0
  48. data/lib/ace/assign/cli/commands/resume.rb +26 -0
  49. data/lib/ace/assign/cli.rb +22 -1
  50. data/lib/ace/assign/models/evidence_event.rb +3 -1
  51. data/lib/ace/assign/molecules/attempt_reconciler.rb +31 -12
  52. data/lib/ace/assign/molecules/canonical_evidence.rb +150 -0
  53. data/lib/ace/assign/molecules/evidence_journal.rb +218 -63
  54. data/lib/ace/assign/molecules/execution_identity_resolver.rb +49 -9
  55. data/lib/ace/assign/molecules/execution_scope_lineage.rb +327 -0
  56. data/lib/ace/assign/molecules/journal_mutation.rb +202 -0
  57. data/lib/ace/assign/molecules/lifecycle_exclusion.rb +4 -0
  58. data/lib/ace/assign/molecules/proposal_journal.rb +151 -0
  59. data/lib/ace/assign/molecules/receipt_verifier.rb +49 -19
  60. data/lib/ace/assign/organisms/assignment_executor.rb +6 -0
  61. data/lib/ace/assign/organisms/attempt_coordinator.rb +312 -13
  62. data/lib/ace/assign/organisms/delivery_coordinator.rb +342 -0
  63. data/lib/ace/assign/organisms/task_assignment_creator.rb +8 -3
  64. data/lib/ace/assign/version.rb +1 -1
  65. data/lib/ace/assign.rb +13 -0
  66. metadata +107 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7d743c208ce34b070929c7c5cc2acdd200289e7a82e3e2acd62129ec1d22daa5
4
- data.tar.gz: 3b4e13b527152e703f7a489f0c7b123b0676c682f6eccb3bd6f30680cf96ace2
3
+ metadata.gz: f8f85e3c4fd7760b26493ade861cb5a7b1fda59227909762005d75ee2dc14db1
4
+ data.tar.gz: 3a491eefefece8e3e7995f68e4fd84536a3e55e436c503119555ea55a17da464
5
5
  SHA512:
6
- metadata.gz: eeba37f93e80112453a79322c0496b6dc5753f5da072556575836a142827c2a3724848978eec0025598babbe1077def70f77fee49df79dd5ae6f54ea668fdd2d
7
- data.tar.gz: f78cf53f13cbb76fb67d7a72756189063fa39d0dddb8eb3b55c28e7acd16377e0fc0a486b126fafe926791905871610800f719d166a55a1e2e65431fe62a3724
6
+ metadata.gz: 0a47581f03920859a3712c10026b0bd034127dfd640c33d64636d88543108ebc2815b475414eccef721ac5d68db1a625a2538c8ffcc381c02cf851041206bb1e
7
+ data.tar.gz: 1bf276d020c5ff7c2740d9d9a3ccaf9837af09197156ded76af8f7d6ca27cb99bf4b24cfb7f1176b3134cc9ecf732822302a3ddd987355e6ff0dbecfd9ada77c
@@ -1,3 +1,3 @@
1
1
  name: create-pr
2
- skill: as-github-pr-create
3
- instructions: "Create the pull request with --draft before PR review begins."
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 gh pr ready on the draft PR."
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: Release modified packages and update CHANGELOGs following semver
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/publish
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: Release modified packages and update CHANGELOGs following semver
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/publish
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: update-pr-desc
2
- skill: as-github-pr-update
2
+ skill: as-git-pr-update
3
3
  description: Update PR description with implementation summary and final state
4
4
  intent:
5
5
  phrases:
@@ -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-github-pr-create
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://github/pr/update
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 `gh pr ready` on the draft PR."
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
- - Release all modified packages touched by this batch.
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://github/pr/create
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://github/pr/update
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 `gh pr ready` on the draft PR."
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://github/pr/create
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://github/pr/update
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 `gh pr ready` on the draft PR."
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
- - Release all modified packages touched by this batch.
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://github/pr/create
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://github/pr/update
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 `gh pr ready` on the draft PR."
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 '27,50p' $PROJECT_ROOT_PATH/ace-git/handbook/skills/as-github-pr-create/SKILL.md
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/.codex/skills/as-task-plan/SKILL.md
36
+ - type: sed -n '13,36p' $PROJECT_ROOT_PATH/.agents/skills/as-task-plan/SKILL.md
37
37
  sleep: 3s
38
- - type: sed -n '13,49p' $PROJECT_ROOT_PATH/.claude/skills/as-github-pr-create/SKILL.md
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-github-pr-create/SKILL.md
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.