@defrex/autobuild 0.10.1 → 0.12.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.
- package/README.md +3 -1
- package/SPEC.md +237 -23
- package/bin/ab-dispatch-kernel.ts +1 -1
- package/docs/architecture.md +66 -4
- package/docs/configuration.md +137 -19
- package/docs/hosted-dispatcher.md +17 -2
- package/docs/hosted-service.md +214 -0
- package/docs/mcp.md +8 -2
- package/docs/operator-api.md +107 -7
- package/docs/remote-store-protocol.md +189 -144
- package/docs/remote-ticket-protocol.md +111 -18
- package/docs/setup.md +173 -16
- package/docs/ticket-dependencies.md +1 -1
- package/package.json +7 -6
- package/packages/core/src/cli/attention.ts +209 -0
- package/packages/core/src/cli/binary.ts +3 -3
- package/packages/core/src/cli/configured-store.ts +17 -0
- package/packages/core/src/cli/connect.ts +261 -0
- package/packages/core/src/cli/dashboard/model.ts +8 -5
- package/packages/core/src/cli/dashboard/render.ts +37 -7
- package/packages/core/src/cli/dispatch-frontend.ts +16 -1
- package/packages/core/src/cli/dispatch-process.ts +25 -7
- package/packages/core/src/cli/dispatch.ts +247 -47
- package/packages/core/src/cli/dispatcher-liveness.ts +91 -0
- package/packages/core/src/cli/help.ts +45 -13
- package/packages/core/src/cli/init-validation.ts +27 -2
- package/packages/core/src/cli/main.ts +41 -15
- package/packages/core/src/cli/mcp.ts +7 -1
- package/packages/core/src/cli/pr-summary-publication.ts +220 -0
- package/packages/core/src/cli/pr-summary.ts +2 -0
- package/packages/core/src/cli/project-credentials.ts +132 -0
- package/packages/core/src/cli/repo-state.ts +15 -2
- package/packages/core/src/cli/repository-status.ts +45 -5
- package/packages/core/src/cli/self-update.ts +10 -0
- package/packages/core/src/cli/store-opening.ts +22 -14
- package/packages/core/src/cli/terminals.ts +0 -10
- package/packages/core/src/cli/ticket.ts +8 -1
- package/packages/core/src/cli/upgrade-compatibility.ts +80 -0
- package/packages/core/src/cli/wait.ts +84 -17
- package/packages/core/src/cli/watch.ts +350 -68
- package/packages/core/src/config/live.ts +4 -0
- package/packages/core/src/config/schema.ts +65 -11
- package/packages/core/src/connection.ts +86 -0
- package/packages/core/src/events/catalog.ts +10 -2
- package/packages/core/src/events/globs.ts +8 -3
- package/packages/core/src/events/payloads.ts +44 -0
- package/packages/core/src/events/repository.ts +64 -2
- package/packages/core/src/integration/harness.ts +2 -1
- package/packages/core/src/kernel/__snapshots__/reducer-registry.test.ts.snap +148 -83
- package/packages/core/src/kernel/dispatch-status.ts +9 -1
- package/packages/core/src/kernel/dispatcher-liveness.ts +70 -0
- package/packages/core/src/kernel/engine.ts +24 -0
- package/packages/core/src/kernel/generators/build-log.ts +10 -0
- package/packages/core/src/kernel/log-index.ts +17 -0
- package/packages/core/src/kernel/pr-summary.ts +89 -0
- package/packages/core/src/kernel/reducer-registry.ts +12 -0
- package/packages/core/src/kernel/reducer.ts +8 -0
- package/packages/core/src/kernel/ticket-source-health.ts +30 -0
- package/packages/core/src/ontology.ts +1 -0
- package/packages/core/src/operator/index.ts +7 -0
- package/packages/core/src/operator/query.ts +44 -19
- package/packages/core/src/operator/ticket-source-backend.ts +1 -0
- package/packages/core/src/operator/tickets.ts +6 -8
- package/packages/core/src/plugin-sdk/index.ts +1 -0
- package/packages/core/src/plugins/manifest.ts +5 -3
- package/packages/core/src/plugins/runtimes.ts +3 -1
- package/packages/core/src/ports/forge/fake.ts +13 -1
- package/packages/core/src/ports/forge/github-transport.ts +36 -1
- package/packages/core/src/ports/forge/github.ts +29 -5
- package/packages/core/src/ports/forge/local-git.ts +12 -4
- package/packages/core/src/ports/forge/summary-marker.ts +8 -0
- package/packages/core/src/ports/runner/session-env.ts +1 -0
- package/packages/core/src/ports/tickets/contract.ts +25 -0
- package/packages/core/src/ports/tickets/create.ts +11 -3
- package/packages/core/src/ports/tickets/fake.ts +10 -8
- package/packages/core/src/ports/tickets/file.ts +1 -0
- package/packages/core/src/ports/tickets/hosted-index.ts +0 -3
- package/packages/core/src/ports/tickets/linear.ts +241 -49
- package/packages/core/src/ports/tickets/remote-protocol.ts +3 -0
- package/packages/core/src/ports/tickets/remote.ts +1 -0
- package/packages/core/src/ports/types.ts +17 -0
- package/packages/core/src/ports/workspace/build-execution.ts +5 -1
- package/packages/core/src/ports/workspace/create.ts +11 -2
- package/packages/core/src/ports/workspace/distribution-archive.ts +3 -5
- package/packages/core/src/ports/workspace/harvest-execution.ts +3 -1
- package/packages/core/src/ports/workspace/local-build-execution.ts +8 -1
- package/packages/core/src/ports/workspace/vercel-sandbox.ts +47 -19
- package/packages/core/src/processes/build-execution-state.ts +1 -1
- package/packages/core/src/processes/build-runner.ts +87 -26
- package/packages/core/src/processes/dispatch-failure-budget.ts +83 -0
- package/packages/core/src/processes/dispatcher.ts +336 -83
- package/packages/core/src/processes/harvest-child.ts +1 -0
- package/packages/core/src/processes/harvest-execution-state.ts +19 -2
- package/packages/core/src/processes/harvest-runner.ts +142 -100
- package/packages/core/src/processes/phase-failure-budget.ts +1 -0
- package/packages/core/src/processes/publication-loss.ts +18 -1
- package/packages/core/src/processes/repo-view.ts +2 -1
- package/packages/core/src/store/adapter.ts +1 -0
- package/packages/core/src/store/contract.ts +109 -0
- package/packages/core/src/store/digest.ts +14 -2
- package/packages/core/src/store/local/store.ts +18 -5
- package/packages/core/src/store/remote/client.ts +1 -1
- package/packages/core/src/store/remote/compatibility.ts +90 -0
- package/packages/core/src/store/remote/credentials.ts +28 -0
- package/packages/core/src/store/remote/index.ts +14 -1
- package/packages/core/src/store/remote/protocol.ts +26 -0
- package/packages/core/src/store/remote/token.ts +74 -13
- package/packages/core/src/store/repo-state-events.ts +49 -59
- package/packages/core/src/store/types.ts +5 -1
- package/packages/core/src/testing/index.ts +7 -0
- package/skills/guide/SKILL.md +175 -26
- package/skills/guide/references/operator-api.md +135 -13
- package/skills/guide/references/plugin-authoring.md +10 -2
- package/skills/guide/references/remote-store-protocol.md +189 -144
- package/skills/guide/references/remote-ticket-protocol.md +111 -18
- package/skills/guide/references/setup.md +173 -16
- package/skills/guide/references/ticket-dependencies.md +1 -1
- package/skills/operate/SKILL.md +159 -34
- package/templates/hosted-service/package.json +13 -0
- package/templates/hosted-service/vercel.json +7 -0
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ needs an authenticated [`gh` CLI](https://cli.github.com) or an exported
|
|
|
24
24
|
<!-- release-install:start -->
|
|
25
25
|
|
|
26
26
|
```sh
|
|
27
|
-
bun add -g @defrex/autobuild@0.
|
|
27
|
+
bun add -g @defrex/autobuild@0.12.0
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
<!-- release-install:end -->
|
|
@@ -174,3 +174,5 @@ routine escalations, leaving you only the real product calls.
|
|
|
174
174
|
## License
|
|
175
175
|
|
|
176
176
|
[Apache License 2.0](LICENSE).
|
|
177
|
+
|
|
178
|
+
Deploy your own store and dashboard with the [hosted service setup](docs/hosted-service.md).
|
package/SPEC.md
CHANGED
|
@@ -233,6 +233,19 @@ Small, independently runnable, crash-safe:
|
|
|
233
233
|
- **ingesters** — other outer-loop processes turning signals into proposals (§12).
|
|
234
234
|
- **operator** — UI process(es); see §14.
|
|
235
235
|
|
|
236
|
+
Ticket-source ready scans run immediately when no completed measurement exists,
|
|
237
|
+
then every
|
|
238
|
+
`ticketScanIntervalSeconds` (default 60 seconds, a positive integer). Actual
|
|
239
|
+
tick spacing is the floor when the configured interval is shorter. A
|
|
240
|
+
same-repository `pr.merged`, `build.completed`, or `build.aborted` fact forces
|
|
241
|
+
another scan on the next tick; changed ready criteria also force a scan.
|
|
242
|
+
Housekeeping keeps its ordinary tick cadence. Between scans, queue depth and
|
|
243
|
+
standing diagnostics repeat the last completed measurement, including across
|
|
244
|
+
process restarts. Tickets groomed directly in the tracker are picked up within
|
|
245
|
+
one scan interval plus one tick when capacity permits. Observation while intake
|
|
246
|
+
is off shares the cadence; an observation measurement cannot suppress a fresh
|
|
247
|
+
admission scan when intake is enabled.
|
|
248
|
+
|
|
236
249
|
### 3.4 The event log spine
|
|
237
250
|
|
|
238
251
|
Build processes append typed events to per-build logs; repository-scoped outer
|
|
@@ -568,9 +581,8 @@ registry already exposes bounded repository reads). Each source's cursor
|
|
|
568
581
|
advances only through a recorded trigger naming that source, so a crash
|
|
569
582
|
between scan and start cannot skip or duplicate a wake, and other builds' —
|
|
570
583
|
and the journal's — matching events re-trigger on later ticks. Sessions with
|
|
571
|
-
empty wake settings are never woken. The
|
|
572
|
-
|
|
573
|
-
default plus the repository-journal events `ab watch --repository` follows.
|
|
584
|
+
empty wake settings are never woken. The legacy hosted wake settings retain their event defaults independently of
|
|
585
|
+
the actionable CLI watch projection.
|
|
574
586
|
|
|
575
587
|
**Crash recovery.** A turn invocation that dies without an outcome leaves the
|
|
576
588
|
session `running` with a silent open stream; the tick's reaper fails such a
|
|
@@ -688,7 +700,8 @@ conformance suite):
|
|
|
688
700
|
hosted HTTP service, selected by an `http(s)://` reference. Kernels,
|
|
689
701
|
sandboxes, terminal dashboards, and later human-facing pages share this
|
|
690
702
|
service tier; it owns token authorization, protocol write validation,
|
|
691
|
-
artifact policy, and
|
|
703
|
+
artifact policy, release-line compatibility, and independent protocol
|
|
704
|
+
enforcement. The
|
|
692
705
|
later human routes share its deployment so a browser or second service never
|
|
693
706
|
receives the machine signing secret. Artifacts remain content-by-value. The
|
|
694
707
|
documented [remote store protocol](docs/remote-store-protocol.md) is the
|
|
@@ -697,6 +710,24 @@ conformance suite):
|
|
|
697
710
|
client, is the conformance bar. Autobuild does not load in-process BuildStore
|
|
698
711
|
plugins. Git worktrees and default file tickets necessarily remain local.
|
|
699
712
|
|
|
713
|
+
A service accepts stable clients from its own `major.minor` release line and
|
|
714
|
+
the two preceding minor lines in the same major. A major starts a new family:
|
|
715
|
+
X.0 accepts only X.0, X.1 accepts X.0/X.1, and X.2 onward accepts three lines.
|
|
716
|
+
Patch versions are interchangeable in both directions and must never change
|
|
717
|
+
the protocol. Upgrade the service first, then projects independently within
|
|
718
|
+
its window. Supported release lines retain their wire handlers and known
|
|
719
|
+
protocol identities; an unknown protocol is refused independently of version.
|
|
720
|
+
Malformed, missing, and prerelease identities are refused with HTTP 409.
|
|
721
|
+
A newer client is told to upgrade the service; a client below the window is
|
|
722
|
+
told to upgrade the project's Autobuild. Diagnostics name the service version
|
|
723
|
+
and supported range.
|
|
724
|
+
|
|
725
|
+
Unauthenticated `GET /health` publishes `ok`, `autobuildVersion`,
|
|
726
|
+
`protocolVersion`, and `supportedClientRange: { minVersion, maxVersionExclusive }`.
|
|
727
|
+
The range is inclusive at the minimum and exclusive at the maximum; a 0.11.x
|
|
728
|
+
service publishes `>=0.9.0 <0.12.0`. Health needs no credentials, version
|
|
729
|
+
headers, or available backend.
|
|
730
|
+
|
|
700
731
|
`subscribe` is specced in the interface; the v2.0 implementation is polling
|
|
701
732
|
`getEvents(since)`. True push comes later.
|
|
702
733
|
|
|
@@ -721,6 +752,43 @@ longer grows with the number of past dispatcher invocations. The journal
|
|
|
721
752
|
itself stays append-only: full replay remains the normative truth, and
|
|
722
753
|
`ab watch` still sees every recorded fact.
|
|
723
754
|
|
|
755
|
+
#### Hosted connected projects
|
|
756
|
+
|
|
757
|
+
The product's hosted service keeps a durable PostgreSQL project registry,
|
|
758
|
+
independent of BuildStore repository journals and ticket data. Entries record
|
|
759
|
+
normalized repository origin, addition timestamp and adding identity. An
|
|
760
|
+
append-only journal records additions/removals; latest sequence determines
|
|
761
|
+
membership. Removal never deletes build, event, artifact or ticket history;
|
|
762
|
+
re-registration restores access and records fresh addition metadata.
|
|
763
|
+
|
|
764
|
+
Database-authorized owners administer it without redeploying through
|
|
765
|
+
`ab-hosted-store projects list`, `projects add REPOSITORY --user IDENTITY`, and
|
|
766
|
+
`projects remove REPOSITORY --user IDENTITY`. Attribution is declared by the
|
|
767
|
+
administrator; ordinary store/project tokens cannot administer registration.
|
|
768
|
+
All allowlisted signed-in users own every registered project (single-owner
|
|
769
|
+
model). Per-project memberships and machine credential boundaries are deferred.
|
|
770
|
+
|
|
771
|
+
Dashboard discovery, MCP `repositories.list` and every repository tool call,
|
|
772
|
+
and all operator API routes for every operator credential consult current
|
|
773
|
+
membership. Unregistered operator paths return not-found before execution.
|
|
774
|
+
Registry failures fail closed and transient initialization can retry.
|
|
775
|
+
The dashboard selection lives at `/?repo=<URL-encoded normalized origin>`;
|
|
776
|
+
missing/invalid selections canonicalize to the first active entry, and an
|
|
777
|
+
empty registry issues no project data/control requests.
|
|
778
|
+
|
|
779
|
+
The hosted dispatcher queries the registry each authorized invocation when
|
|
780
|
+
`AB_DISPATCHER_REPOSITORIES` is unset. An explicit list is intersected with
|
|
781
|
+
current registration in its configured order. Empty registration is a
|
|
782
|
+
successful zero-project tick. Removal stops later invocations, without
|
|
783
|
+
cancelling already-started work or changing machine-route token authority.
|
|
784
|
+
|
|
785
|
+
`AB_WEB_REPOSITORIES` is deprecated: the first initialization with a nonempty
|
|
786
|
+
CSV imports absent projects once per database as `system:AB_WEB_REPOSITORIES`.
|
|
787
|
+
The import and durable marker share one transaction and mutation lock across
|
|
788
|
+
processes. Absence does not consume the marker. Restarts or later variable
|
|
789
|
+
edits cannot resurrect removals. Deployments migrate the pinned schema before
|
|
790
|
+
starting services; runtime initialization never runs DDL.
|
|
791
|
+
|
|
724
792
|
### 7.3 Persistence granularity
|
|
725
793
|
|
|
726
794
|
Required phase outputs persist at **phase/round boundaries**; a killed phase
|
|
@@ -768,8 +836,27 @@ Four base-selection invariants make this safe with Git:
|
|
|
768
836
|
|
|
769
837
|
### 7.5 What the PR gets
|
|
770
838
|
|
|
771
|
-
|
|
772
|
-
|
|
839
|
+
One marked summary comment contains verdict history, verification results,
|
|
840
|
+
and links into the store. Built-in forges discover its per-build marker on
|
|
841
|
+
every refresh and edit it, recreating it only after confirmed absence. The
|
|
842
|
+
full audit trail is queryable, not committed to the branch.
|
|
843
|
+
|
|
844
|
+
Summary publication is best effort, once per completed phase occurrence,
|
|
845
|
+
after sessions end; attaching artifacts performs no summary write. Durable
|
|
846
|
+
claim-before-write facts consume the occurrence budget even across crashes.
|
|
847
|
+
Rate limits stop that occurrence and persist a cooldown (provider headers or
|
|
848
|
+
at least one minute) before a later phase may catch up. Failures never fail
|
|
849
|
+
artifact designation or phase completion. Bodies are capped at 65,536 UTF-16
|
|
850
|
+
code units. Oversized projections are deposited as a non-attached `pr-summary`
|
|
851
|
+
artifact; a compact comment provides the exact pinned download command.
|
|
852
|
+
Current-API plugins retain `commentOnPr` and receive the same bounded calls;
|
|
853
|
+
legacy plugins may append instead of editing.
|
|
854
|
+
|
|
855
|
+
Local runners publish under their build lease. Remote guests record durable
|
|
856
|
+
summary boundary requests and yield; only the credentialed dispatcher settles
|
|
857
|
+
those requests, after guest execution ends and under exclusive ownership,
|
|
858
|
+
before replacement execution or workspace cleanup. Attempts and request
|
|
859
|
+
dispositions survive restart and do not alter pipeline routing.
|
|
773
860
|
|
|
774
861
|
Any agent session can explicitly designate an exact deposited artifact as a PR
|
|
775
862
|
attachment through `ab artifact put <kind> <file> --attach`. Designation is a
|
|
@@ -789,8 +876,8 @@ dispatcher reclaims them after the build reaches a terminal outcome, while
|
|
|
789
876
|
store artifacts remain under the store's retention policy. Upload/validation/timeout failures record follow-up
|
|
790
877
|
observations and preserve the complete text projection; they never fail
|
|
791
878
|
verification or block finalize. Agents receive no forge credentials. A
|
|
792
|
-
designation after the PR exists
|
|
793
|
-
post-steps and post-reconcile verifiers need no custom phase.
|
|
879
|
+
designation after the PR exists is included at the completed phase boundary,
|
|
880
|
+
so finalize post-steps and post-reconcile verifiers need no custom phase.
|
|
794
881
|
|
|
795
882
|
### 7.6 Streams (the third primitive)
|
|
796
883
|
|
|
@@ -912,7 +999,7 @@ AB_STORE # store URL or local path
|
|
|
912
999
|
AB_BUILD # build slug
|
|
913
1000
|
AB_PHASE # current phase (+ round)
|
|
914
1001
|
AB_SESSION # session id
|
|
915
|
-
AB_TOKEN #
|
|
1002
|
+
AB_TOKEN # signed credential for this exact phase session (remote store)
|
|
916
1003
|
```
|
|
917
1004
|
|
|
918
1005
|
A harvest session instead carries `AB_REPO`, `AB_HARVEST`, and an `AB_PHASE`
|
|
@@ -920,14 +1007,18 @@ of `synthesize@N` or `review@N`. The AgentRunner invocation argument is
|
|
|
920
1007
|
opaque: a build skill receives its slug; a harvest skill receives its run id.
|
|
921
1008
|
The CLI resolves identity from ambient auth. Every build process holds an
|
|
922
1009
|
interface-enforced build-scoped Store handle. At the phase CLI opening boundary,
|
|
923
|
-
|
|
924
|
-
|
|
1010
|
+
both local and remote handles are wrapped with authority over exactly
|
|
1011
|
+
`AB_BUILD` or `AB_REPO`. Before launch, the dispatcher exchanges its project credential with the service
|
|
1012
|
+
for a build or prepared harvest-execution grant. After recording a session start,
|
|
1013
|
+
the runner exchanges that grant for an exact phase-session grant. The remote
|
|
1014
|
+
handle forwards only this delegated credential; the service enforces its project,
|
|
1015
|
+
resource and session boundaries on the wire. Build and
|
|
925
1016
|
repository resources cannot cross, and naming another resource to a Store
|
|
926
1017
|
operation cannot widen either handle. Event-bearing writes attributed to an
|
|
927
1018
|
agent must name the ambient `AB_SESSION`; non-agent writes remain allowed so the
|
|
928
1019
|
CLI can perform its existing trusted kernel plumbing, including finalize.
|
|
929
|
-
Operator and kernel processes with no agent identity markers retain unscoped
|
|
930
|
-
Store access. Three read-only forms are also valid inside a phase: `ab build
|
|
1020
|
+
Operator and kernel processes with no agent identity markers retain interface-unscoped
|
|
1021
|
+
Store handles; remote authorization still limits access to the credential project. Three read-only forms are also valid inside a phase: `ab build
|
|
931
1022
|
status` and `ab artifact download` may read only `AB_BUILD`, while `ab builds`
|
|
932
1023
|
is denied because collection access cannot represent one build. A complete
|
|
933
1024
|
Harvest identity has repository scope and cannot use those build/admin reads.
|
|
@@ -936,10 +1027,60 @@ If any build or Harvest identity marker is present, the corresponding
|
|
|
936
1027
|
partial, empty, malformed, shared-only, or mixed identity fails before Store
|
|
937
1028
|
access rather than falling back to operator authority. `AB_STORE` and
|
|
938
1029
|
`AB_TOKEN` alone remain operator selection and credentials, not identity.
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
1030
|
+
Dispatcher machine authority is an opaque, revocable credential for exactly one
|
|
1031
|
+
registered project. The service keeps only a digest of its random secret and
|
|
1032
|
+
credential metadata (creator, creation, last use, expiry and revocation), and
|
|
1033
|
+
checks both credential status and project registration on each request. It
|
|
1034
|
+
checks actual build/session/stream ownership and filters collections server-side.
|
|
1035
|
+
Explicit project mismatch is 403; missing and foreign indirect IDs share 404.
|
|
1036
|
+
Remote project build creation allocates a fresh slug and branch; the returned
|
|
1037
|
+
record is authoritative. Local adapters retain exact-slug behavior.
|
|
1038
|
+
|
|
1039
|
+
Owners issue/list/revoke credentials with deployment-local `ab-hosted-store
|
|
1040
|
+
credentials` commands. Retired deployment-wide and repository-less operator
|
|
1041
|
+
tokens are rejected with migration guidance. An explicit versioned owner-only
|
|
1042
|
+
break-glass admin is the sole machine cross-project exception. Internal signed
|
|
1043
|
+
owner delegation is short-lived, repository-bound and operator-only. The hosted
|
|
1044
|
+
dispatcher issues stored credentials with immutable dispatcher purpose (raw
|
|
1045
|
+
store and tickets only) per invocation and keeps them valid through configured
|
|
1046
|
+
expiry. Already issued delegated grants do not depend on that parent expiry.
|
|
1047
|
+
Owner-issued project credentials attribute operator writes to their recorded
|
|
1048
|
+
creator. Agents never receive the dispatcher's project credential. Delegated
|
|
1049
|
+
reads retain access to same-project repository state; build mutations target only
|
|
1050
|
+
that build, and harvest mutations target only the prepared run and execution,
|
|
1051
|
+
its artifacts and streams, with heartbeat authority for its adopted lease holder.
|
|
1052
|
+
Phase grants also enforce agent session attribution. They cannot create builds or
|
|
1053
|
+
operator sessions, administer repositories, invoke operator routes, or delegate.
|
|
1054
|
+
A runner can delegate only to a recorded session within its own authority.
|
|
1055
|
+
|
|
1056
|
+
Delegated grants have no fixed wall-clock expiry. The service checks signed
|
|
1057
|
+
bindings against authoritative durable lifecycle facts on every request and
|
|
1058
|
+
fails closed if those reads fail. Active, paused and escalated builds may outlive
|
|
1059
|
+
a dispatcher restart or a week-long parent credential. Build termination,
|
|
1060
|
+
harvest execution/run termination, or the phase's own session end retires the
|
|
1061
|
+
corresponding grant after a 60-second evidence grace window. A durable ending
|
|
1062
|
+
permanently closes that grant; recovered harvest executions use fresh durable
|
|
1063
|
+
authorizations and fresh grants. Project removal denies all its grants immediately.
|
|
1064
|
+
Local-store projects require no exchange.
|
|
1065
|
+
|
|
1066
|
+
Hosted ticket operations are gated by grant kind: build-runner and build-phase
|
|
1067
|
+
grants have no access; harvest-phase grants can only list-ready, get and read
|
|
1068
|
+
dependency-states; harvest-runner grants can also create proposals. All other
|
|
1069
|
+
ticket mutations require project or admin authority. Refusals name the grant
|
|
1070
|
+
kind and operation.
|
|
1071
|
+
|
|
1072
|
+
Ticket admission uses the credential project. Hosted tickets, comments, blockers, creation-key
|
|
1073
|
+
deduplication and assets are partitioned by registered repository, never team.
|
|
1074
|
+
Lifecycle comes from that project's latest durable effective configuration
|
|
1075
|
+
(triage Backlog, claim Doing, completion Done by default; configurable
|
|
1076
|
+
`doneState`). Owner admin ticket requests explicitly select a registered
|
|
1077
|
+
repository. The service has no Linear ticket backend: external tracker and
|
|
1078
|
+
file sources remain dispatcher-side, and service ticket surfaces refuse those
|
|
1079
|
+
projects with actionable source feedback. Legacy team queues migrate atomically
|
|
1080
|
+
to their sole configured claimant; conflicts stop unchanged for an owner
|
|
1081
|
+
assignment and rerun. See the hosted service migration procedure.
|
|
1082
|
+
See the remote store, remote ticket and operator protocol references for wire
|
|
1083
|
+
and revocation details. Least privilege comes from code, not prompt instructions.
|
|
943
1084
|
|
|
944
1085
|
Every phase and harvest turn also receives a runner-controlled `PATH` prefix
|
|
945
1086
|
containing a private `ab` launcher from the same Autobuild distribution that
|
|
@@ -1206,6 +1347,17 @@ be narrowed to the ambient build — and `--repo` constrains every call to one
|
|
|
1206
1347
|
repository. Mutating tools attribute their writes to the sessionless operator
|
|
1207
1348
|
identity, exactly as the other operator commands do.
|
|
1208
1349
|
|
|
1350
|
+
### 8.10 Hosted project connection
|
|
1351
|
+
|
|
1352
|
+
`ab connect <service-url>` requests owner browser approval for the normalized
|
|
1353
|
+
origin, registers the project, and saves a project credential outside the
|
|
1354
|
+
checkout. `ab connect` reports its status; `ab disconnect` revokes and removes
|
|
1355
|
+
only that credential, retaining project data. Store precedence is `--store`,
|
|
1356
|
+
nonblank `AB_STORE`, `[store] url`, then local state. `AB_TOKEN` overrides saved
|
|
1357
|
+
credentials. Configured services without credentials fail closed. Connection
|
|
1358
|
+
commands require a network origin and are unavailable in phase sessions.
|
|
1359
|
+
|
|
1360
|
+
|
|
1209
1361
|
## 9. AgentRunner
|
|
1210
1362
|
|
|
1211
1363
|
Session-based, because review loops need memory:
|
|
@@ -1606,6 +1758,18 @@ event-level mechanics live in the repository catalog and reducer tests):
|
|
|
1606
1758
|
|
|
1607
1759
|
## 13. Ticket source policy
|
|
1608
1760
|
|
|
1761
|
+
**Hosted tickets are project-scoped.** A project credential selects one registered
|
|
1762
|
+
repository; an owner selects a registered repository explicitly. Team and state
|
|
1763
|
+
fields from clients convey no authority or lifecycle policy. Tickets, comments,
|
|
1764
|
+
blockers, creation-key deduplication and assets are isolated by repository.
|
|
1765
|
+
The project's latest effective configuration supplies hosted lifecycle names:
|
|
1766
|
+
triage Backlog, claimed Doing, completion Done (`doneState`) and create/proposal
|
|
1767
|
+
equal to triage by default; `readyState` is required. Configured roles may overlap.
|
|
1768
|
+
The service has no Linear backend and never relays external ticket sources.
|
|
1769
|
+
Projects using Linear, files or plugins keep their direct dispatcher connection;
|
|
1770
|
+
service ticket surfaces refuse with project/source feedback instead of empty data.
|
|
1771
|
+
|
|
1772
|
+
|
|
1609
1773
|
The TicketSource **initiates and receives projections; it is never consulted
|
|
1610
1774
|
mid-build and never used as artifact storage.** Dispatch reads the ticket
|
|
1611
1775
|
(including the spec) as part of initiation — at claim time, or on a later tick
|
|
@@ -1858,7 +2022,8 @@ with illustrative members:
|
|
|
1858
2022
|
| Spec | `spec.imported`, `spec.authored`, `spec.revised` (optionally carrying `assets`, a re-pin of the ticket's assets, §6.3) |
|
|
1859
2023
|
| Sessions | `session.started`; `session.ended` with transcript ref and usage (ordinary completion — the analysis corpus), or `session.ended {outcome: reclaimed, reclaimedBy: {instance, resumedFromSeq}}` (explicit transcriptless takeover) |
|
|
1860
2024
|
| Plan/code loops | `plan.started` … `plan-review.verdict`; `implement.started` … `code-review.verdict` |
|
|
1861
|
-
| Verify/finalize | `verify.started {step, attempt, feedback?}`, `verify.completed {step, outcome}`, `finalize.completed {pr}`, `finalize.step-completed {step, ok, headSha?}` |
|
|
2025
|
+
| Verify/finalize | `verify.started {step, attempt, feedback?}`, `verify.completed {step, outcome, skipCause?}`, `verify.reconcile-policy-captured {reconcileSeq, steps}`, `finalize.completed {pr}`, `finalize.step-started {step}`, `finalize.step-completed {step, ok, headSha?}` |
|
|
2026
|
+
| PR summary | Kernel-authored `pr-summary.requested {occurrence, boundary}`, `pr-summary.attempted {occurrence, boundary, pr}`, `pr-summary.result {attempt, outcome, eligibleAfter?}`, `pr-summary.settled {request, disposition}`; sequence identities correlate durable starts, completed boundaries, attempts, and handoffs (§7.5) |
|
|
1862
2027
|
| PR attachments | `pr-attachment.designated`, `pr-attachment.hosted`, `pr-attachment.reclaimed`, `pr-attachment.reclaim-failed` |
|
|
1863
2028
|
| Post-PR [D1] | `pr.merged`, `pr.conflicted`, `reconcile.progress-checked`, `reconcile.started`, `reconcile.completed` |
|
|
1864
2029
|
| Cross-cutting | `observation.recorded`, `escalation.raised`, `phase.failed` |
|
|
@@ -1962,8 +2127,18 @@ ordinary dispatcher tick provisions the workspace, atomically imports the spec,
|
|
|
1962
2127
|
posts the ticket notice once, and launches the runner. Claim-time auto-merge
|
|
1963
2128
|
attribution retained by `build.created` is materialized as the ordinary
|
|
1964
2129
|
human-authored request before launch. A failed boundary appends `dispatch.failed
|
|
1965
|
-
{stage,attempt,error}` and stays queued for another tick
|
|
1966
|
-
|
|
2130
|
+
{stage,attempt,error}` and stays queued for another tick until its budget is
|
|
2131
|
+
exhausted. Dispatch failures share a `[policy].maxDispatchAttempts` budget
|
|
2132
|
+
(default 3) across
|
|
2133
|
+
create, workspace, spec, comment, and launch stages. Exhaustion raises one
|
|
2134
|
+
`dispatch-failure-limit` policy escalation naming the latest stage and error,
|
|
2135
|
+
and parks dispatch until answered. Both bare `ab answer <slug>` retries and
|
|
2136
|
+
text guidance grant a fresh budget; abort does not. Confirmed runner attachment
|
|
2137
|
+
clears the streak. Recovery-provider workspace failures belong exclusively to
|
|
2138
|
+
the infrastructure budget. Exhaustion is repaired from durable facts on restart
|
|
2139
|
+
before further dispatch work.
|
|
2140
|
+
|
|
2141
|
+
A discard request is honored only while the build remains queued; one that races with runner
|
|
1967
2142
|
attachment is inert and cannot tear down live work. A human discard waits out
|
|
1968
2143
|
any unexpired execution lease, then releases a partial workspace and stale
|
|
1969
2144
|
lease, returns the ticket to Ready, and appends `build.completed {outcome:
|
|
@@ -2169,7 +2344,8 @@ fresh from `origin`, and records the resolved SHA on `reconcile.started` — kno
|
|
|
2169
2344
|
used (§15.3). The agent merges that base into the branch guided by the spec,
|
|
2170
2345
|
plan, and implement-notes, with the explicit charge to regress against
|
|
2171
2346
|
neither; the resolution lands as a merge commit, and because reconciliation
|
|
2172
|
-
changed code, **`verify:*`
|
|
2347
|
+
changed code, **`verify:*` starts a fresh cycle**, subject to the captured
|
|
2348
|
+
post-reconcile policy (default: re-run all applicable steps). A resolution the agent judges
|
|
2173
2349
|
risky — semantic conflicts, spec-relevant choices — escalates rather than
|
|
2174
2350
|
guesses. Reconcile skips `code-review` by default (escalation covers the
|
|
2175
2351
|
judgment cases; policy can force it).
|
|
@@ -2243,6 +2419,7 @@ ordinary boundary reload resumes.
|
|
|
2243
2419
|
```toml
|
|
2244
2420
|
baseBranch = "main"
|
|
2245
2421
|
capacity = 3 # concurrent builds for this repo
|
|
2422
|
+
ticketScanIntervalSeconds = 60 # positive integer; ready scans, with tick spacing as floor
|
|
2246
2423
|
forge = "github" # builtin: github | local-git; or a plugin name
|
|
2247
2424
|
plugins = ["./plugins/local.ts", "@acme/autobuild-plugin"]
|
|
2248
2425
|
|
|
@@ -2300,6 +2477,7 @@ sessionBudgetSeconds = 7200 # optional role override
|
|
|
2300
2477
|
sessionBudgetSeconds = 3600 # non-infinite default for build agent sessions
|
|
2301
2478
|
stallRounds = 3
|
|
2302
2479
|
maxVerifyAttempts = 3
|
|
2480
|
+
maxDispatchAttempts = 3
|
|
2303
2481
|
maxSetupAttempts = 3
|
|
2304
2482
|
maxInfrastructureAttempts = 3
|
|
2305
2483
|
maxReconcileAttempts = 3
|
|
@@ -2350,7 +2528,7 @@ decide where a build's effective configuration is composed from:
|
|
|
2350
2528
|
|---|---|---|
|
|
2351
2529
|
| Build-owned (pinned) | `[verify]` and `[verify.<step>]`, `[finalize]` and `[finalize.<step>]`, `[commands]`, `[workspace]` (provider and config, including `provisioning` and `runtimeProvisioning`) | The build's own branch: its branch head once it has published commits, otherwise the recorded base commit its workspace was cut from. The exact commit is recorded once per deposit in the effective-config artifact metadata — except in checkout mode when the worktree read cannot be attributed to the branch-head commit: because the worktree file has uncommitted edits, because the clean/dirty comparison could not be performed (non-git workspace or a transient git error), or because the branch head never carried the file. The deposit then records the source `worktree-dirty` and no commit, because no commit claims the worktree bytes (the build still runs them). |
|
|
2352
2530
|
| Deployment-owned (live) | `[roles]` (runtime, model, args, alternates, per-role `sessionBudgetSeconds`) and `[policy]` (budgets, retry bounds, stall and harvest knobs) | The dispatcher's live snapshot; an accepted reload delivers these to active builds. |
|
|
2353
|
-
| Dispatcher-owned | `baseBranch`, `capacity`, `forge`, `plugins`, `pr`, `tickets`, `orchestrator` | The dispatcher's live snapshot; the build runner never interprets them. |
|
|
2531
|
+
| Dispatcher-owned | `baseBranch`, `capacity`, `ticketScanIntervalSeconds`, `forge`, `plugins`, `pr`, `tickets`, `orchestrator` | The dispatcher's live snapshot; the build runner never interprets them. |
|
|
2354
2532
|
|
|
2355
2533
|
A build's pipeline definition is therefore composed from the build's own
|
|
2356
2534
|
branch: in origin mode the dispatcher reads `autobuild.toml` at the build's
|
|
@@ -2372,9 +2550,12 @@ artifact deposited on reload changes only those sections. In-flight
|
|
|
2372
2550
|
environments are never re-provisioned; a fresh build from the new base is the
|
|
2373
2551
|
path for a changed provisioning definition.
|
|
2374
2552
|
|
|
2375
|
-
|
|
2553
|
+
Three configurable narrowing mechanisms govern which verify steps run, all
|
|
2376
2554
|
resolving to the ordinary `skipped` outcome so exclusions stay queryable:
|
|
2377
2555
|
|
|
2556
|
+
- **Post-reconcile policy.** The cycle snapshot resolves repository and step
|
|
2557
|
+
`afterReconcile` settings before any plan or path exclusions, including for
|
|
2558
|
+
`always` steps. It applies only after a completed reconcile.
|
|
2378
2559
|
- **Plan selection.** An approved plan may declare the complete subset of
|
|
2379
2560
|
optional verify steps warranted by the spec, in strict front matter
|
|
2380
2561
|
validated at deposit. The selection paired with the approving review
|
|
@@ -2388,6 +2569,30 @@ resolving to the ordinary `skipped` outcome so exclusions stay queryable:
|
|
|
2388
2569
|
match skips without launching anything; a Git failure is infrastructure and
|
|
2389
2570
|
fails closed, never a synthetic skip.
|
|
2390
2571
|
|
|
2572
|
+
|
|
2573
|
+
#### Post-reconcile verification policy
|
|
2574
|
+
|
|
2575
|
+
Post-reconcile verification defaults to enabled: `[verify].afterReconcile = true`.
|
|
2576
|
+
Set it to `false` to retain pre-reconcile verification and skip all steps after
|
|
2577
|
+
reconciliation. An optional boolean `[verify.<step>].afterReconcile` overrides
|
|
2578
|
+
the repository setting in either direction; overrides require a configured step.
|
|
2579
|
+
For example, set `afterReconcile = false` in `[verify]` and
|
|
2580
|
+
`afterReconcile = true` in `[verify.types]` to keep only that step re-running.
|
|
2581
|
+
|
|
2582
|
+
The kernel freezes the resolved ordered policy in
|
|
2583
|
+
`verify.reconcile-policy-captured` at the next engine action after reconcile
|
|
2584
|
+
completion. Live configuration changes apply at that boundary; a cycle already
|
|
2585
|
+
started keeps its policy through recovery. Historical cycles already started
|
|
2586
|
+
without a captured policy retain the rerun-all behavior. Initial verification
|
|
2587
|
+
and verification after subsequent code review always use ordinary applicability.
|
|
2588
|
+
Policy exclusion precedes plan selection and paths, including `always = true`.
|
|
2589
|
+
Enabled steps still follow plan selection and path rules. Excluded steps record
|
|
2590
|
+
`verify.completed` with outcome `skipped`, `skipCause = "post-reconcile-policy"`,
|
|
2591
|
+
and a reason naming the setting. Dashboards and PR summaries call this
|
|
2592
|
+
"skipped by post-reconcile policy"; it is never a pass. Forge-side required
|
|
2593
|
+
checks and branch protections still gate merge. For excluded steps, merged code
|
|
2594
|
+
is not re-verified, so breakage that only exists in the combination can land.
|
|
2595
|
+
|
|
2391
2596
|
### 16.3 Skill installation: vendored, namespaced, editable [D11]
|
|
2392
2597
|
|
|
2393
2598
|
This project ships 11 canonical default skills for the fixed phases, the
|
|
@@ -2469,6 +2674,15 @@ install failure is fatal and does not merge against the wrong defaults.
|
|
|
2469
2674
|
`--no-self-update` always selects merge-only
|
|
2470
2675
|
behavior. An exact version may be older than the installed version.
|
|
2471
2676
|
|
|
2677
|
+
Before installation or project writes, upgrades targeting a hosted store probe
|
|
2678
|
+
its public health range. An incompatible target produces a directional warning
|
|
2679
|
+
(service first for a newer target, project upgrade for a stale target) and
|
|
2680
|
+
continues. A legacy health response has an exact-version contract; different
|
|
2681
|
+
targets warn that the service needs the compatibility-window release. Failed,
|
|
2682
|
+
timed-out, or malformed probes warn that connectivity could not be verified
|
|
2683
|
+
and may fail after upgrade, then continue. Merge-only and replacement-process
|
|
2684
|
+
handoffs check the distribution actually applied before skill writes.
|
|
2685
|
+
|
|
2472
2686
|
Upgrade records its successful work in one local commit on the target's current
|
|
2473
2687
|
HEAD by default. The exact ownership boundary is the reported skills' canonical
|
|
2474
2688
|
`.agents` trees, pristine records, and `.claude` discovery paths, plus
|
|
@@ -23,7 +23,7 @@ try {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
const stop = new AbortController()
|
|
26
|
-
const requestStop = (): void => stop.abort()
|
|
26
|
+
const requestStop = (signal?: string): void => stop.abort(signal)
|
|
27
27
|
// Keep both handlers installed through the complete graceful drain. The first
|
|
28
28
|
// targeted SIGINT comes from the supervisor; later foreground-group signals
|
|
29
29
|
// must not regain their default disposition inside an open claim tick.
|
package/docs/architecture.md
CHANGED
|
@@ -333,7 +333,19 @@ head is a no-op; Git/Forge failures stay failure-tolerant observations.
|
|
|
333
333
|
**Verify gating.** `packages/core/src/ontology.ts` owns the canonical
|
|
334
334
|
`pass | fail | skipped` outcome (only `fail` routes back to implement or
|
|
335
335
|
consumes attempts; a skip satisfies one step without being passing
|
|
336
|
-
evidence).
|
|
336
|
+
evidence). Three kernel-authored skip sources narrow the configured universe:
|
|
337
|
+
post-reconcile policy, approved plan selection, and changed paths.
|
|
338
|
+
The engine captures the ordered effective `afterReconcile` policy in
|
|
339
|
+
`verify.reconcile-policy-captured` at the action after reconciliation completes,
|
|
340
|
+
before verification starts. Log-index replay keeps it scoped to that completion;
|
|
341
|
+
subsequent config changes cannot replace it mid-cycle. Historical already-started
|
|
342
|
+
cycles without a snapshot retain rerun-all behavior. A later code-review approval
|
|
343
|
+
restores ordinary verification. Policy exclusions precede plan/path applicability
|
|
344
|
+
and carry `skipCause: "post-reconcile-policy"` plus a setting-specific reason.
|
|
345
|
+
The shared dashboard model renders that reason, as does the PR summary.
|
|
346
|
+
Excluded steps do not re-verify merged code, so combination-only breakage can
|
|
347
|
+
land; forge requirements and reconcile budgets remain independent.
|
|
348
|
+
For enabled steps,
|
|
337
349
|
`packages/core/src/kernel/plan-verify-selection.ts` resolves an approved plan's front-matter
|
|
338
350
|
selection (applied at the planner's `ab done` in `packages/core/src/cli/terminals.ts`,
|
|
339
351
|
snapshotted by the engine at approval), and
|
|
@@ -341,7 +353,7 @@ snapshotted by the engine at approval), and
|
|
|
341
353
|
selectors, resolved by the build runner via `git diff` against the initial
|
|
342
354
|
branch-cut base (or the refreshed base promoted by a completed reconcile).
|
|
343
355
|
This verify-only base is deliberately independent from implementation's
|
|
344
|
-
focused review range.
|
|
356
|
+
focused review range. All narrowing mechanisms produce the ordinary
|
|
345
357
|
queryable skipped outcome; Git failure is infrastructure and fails closed,
|
|
346
358
|
never a synthetic skip. Verify escalation routing is also explicit in the
|
|
347
359
|
engine: guidance answering an agent verifier's own `ab escalate` returns to the
|
|
@@ -579,7 +591,7 @@ slug routing. Upgrade performs the same composition lazily at its first merge
|
|
|
579
591
|
conflict.
|
|
580
592
|
|
|
581
593
|
`packages/core/src/cli/repo-state.ts` owns repository identity and store precedence
|
|
582
|
-
(`--store` > `AB_STORE` > `.autobuild/`); `packages/core/src/cli/store-opening.ts` is the
|
|
594
|
+
(`--store` > `AB_STORE` > `[store] url` > `.autobuild/`); `packages/core/src/cli/store-opening.ts` is the
|
|
583
595
|
production store composition boundary shared by finite sessionless queries and
|
|
584
596
|
phase sessions. Its shared scoping primitive preserves remote token composition
|
|
585
597
|
and adds local ambient authority only for filesystem stores. The dedicated
|
|
@@ -599,7 +611,15 @@ phase-only commands report their complete runner context when run by hand.
|
|
|
599
611
|
correlations, and pending cleanup without coupling to a producer or verify-step
|
|
600
612
|
name. `packages/core/src/cli/pr-attachments.ts` performs optional image hosting through the
|
|
601
613
|
narrow Forge capability, while `packages/core/src/cli/pr-summary.ts` renders the same complete
|
|
602
|
-
text projection for finalize and late designations.
|
|
614
|
+
text projection for finalize and late designations. `cli/pr-summary-publication.ts`
|
|
615
|
+
coalesces these at completed phase boundaries with durable attempt, result,
|
|
616
|
+
cooldown, request, and disposition facts. Built-in forges upsert one hidden
|
|
617
|
+
per-build marker; legacy plugins keep the existing bounded `commentOnPr` API.
|
|
618
|
+
Oversized bodies become a compact pinned download of a full `pr-summary`
|
|
619
|
+
store artifact. Local runners publish under their lease; remote guests request
|
|
620
|
+
and yield, and dispatcher settlement fences ended execution and owns the
|
|
621
|
+
publication lease before launching replacement work. Summary failure never
|
|
622
|
+
changes phase outcomes. The GitHub release transport
|
|
603
623
|
lives in `packages/core/src/ports/forge/github-pr-attachments.ts`; terminal-build reclamation
|
|
604
624
|
and retry facts remain dispatcher janitor duty.
|
|
605
625
|
|
|
@@ -876,3 +896,45 @@ because they cannot be manufactured safely against a live account.
|
|
|
876
896
|
|
|
877
897
|
Provisioning or scheduling these credentials/resources in CI is deliberately
|
|
878
898
|
out of scope; live runs remain explicit.
|
|
899
|
+
|
|
900
|
+
## Hosted project registry
|
|
901
|
+
|
|
902
|
+
`packages/postgres-store/src/projects.ts` owns a narrow project registry port
|
|
903
|
+
beside BuildStore. Schema v10 adds an independent append-only project journal
|
|
904
|
+
and singleton mutation/bootstrap lock and marker, with no build/ticket foreign
|
|
905
|
+
keys. Active entries reduce the latest sequence per origin; timestamps are
|
|
906
|
+
metadata, not ordering. Runtime opens assert schema and never run DDL.
|
|
907
|
+
`ab-hosted-store projects` administers registrations using database authority.
|
|
908
|
+
The service exposes one lazy live reader to the operator server, web gateway,
|
|
909
|
+
MCP and server-rendered repository picker. Initialization failures clear the
|
|
910
|
+
cached promise for retry. The dispatcher opens its own shared pool and queries
|
|
911
|
+
membership each invocation. See [owner workflow](setup.md#connected-projects).
|
|
912
|
+
|
|
913
|
+
## Delegated execution authority
|
|
914
|
+
|
|
915
|
+
`store/remote/credentials.ts` owns the credential exchange client independently
|
|
916
|
+
of the BuildStore persistence port. The hosted service's `delegated-authority.ts`
|
|
917
|
+
validates issuance, durable lifecycle bindings and the 60-second terminal grace;
|
|
918
|
+
`machine-auth.ts` authenticates these signed version-2 grants as delegated
|
|
919
|
+
principals. `remote-store-server.ts` enforces resource mutations before deposits,
|
|
920
|
+
including body-selected and addressed-stream resources. Operator routes reject
|
|
921
|
+
these principals. Ticket routes deny build grants and allow harvest grants only the reads and
|
|
922
|
+
runner filing operations they require. Ticket sources and assets are partitioned
|
|
923
|
+
by the authenticated project.
|
|
924
|
+
|
|
925
|
+
Dispatch prepares harvest claims using `HarvestRunner.run(true)` before issuing
|
|
926
|
+
an execution grant. `harvest.execution.authorized` binds the selected run,
|
|
927
|
+
execution and adopted lease holder; the guest resumes only that prepared run.
|
|
928
|
+
Local completion records `harvest.execution.ended`; hosted completion retains
|
|
929
|
+
its provider release fact. Recovery controls remain trusted dispatcher work.
|
|
930
|
+
Execution launch auth is transient and separate from serialized identity. Runners
|
|
931
|
+
request exact phase grants after session-start facts and before runtime calls.
|
|
932
|
+
Workspace plugin factories receive an exchange callback and a scrubbed environment,
|
|
933
|
+
while local children and sandbox bootstrap/launch replace inherited authority.
|
|
934
|
+
Service requests reread durable state; detached executions need neither renewal
|
|
935
|
+
secrets nor their original dispatcher. Local stores retain their existing path.
|
|
936
|
+
Project onboarding uses `cli/connect.ts`, user-level `cli/project-credentials.ts`,
|
|
937
|
+
the shared `connection.ts` wire types, and Postgres `connections.ts`. Approval
|
|
938
|
+
commits registry membership, a credential digest, and the outcome atomically.
|
|
939
|
+
The web connection routes authenticate the existing Better Auth session and
|
|
940
|
+
reuse the sign-in/consent layout; CLI polling uses a separate private capability.
|