Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
955267f
phase 0: specify workflows M0-M4 and validate runtime contracts
tyrchen Oct 25, 2026
7915281
phase 1: capture stable Lambda resource and invocation identity
tyrchen Oct 25, 2026
0f78041
phase 1: own validated deployment artifacts and roll back staging
tyrchen Oct 25, 2026
93bd1ec
phase 1: supervise cancellable invocation and backend cleanup
tyrchen Oct 26, 2026
4da7df3
phase 1: add bounded shared Lambda control protocol
tyrchen Oct 26, 2026
2c50c2d
phase 1: own runtime sessions and confirm event delivery
tyrchen Oct 26, 2026
95282c4
phase 1: migrate Native execution to shared runtime HTTP sessions
tyrchen Oct 26, 2026
6779f93
phase 1: supervise Linux Lambda relay and qualify real image execution
tyrchen Oct 26, 2026
6d31238
phase 1: own ordered host Lambda control sessions and shared stream w…
tyrchen Oct 26, 2026
8a5d652
phase 1: pin bounded Docker transport contracts before consumer integ…
tyrchen Oct 26, 2026
7cadafd
phase 1: bound JSON before Docker metadata model deserialization
tyrchen Oct 26, 2026
8f11974
phase 1: own bounded Docker wire IO and qualify real image control st…
tyrchen Oct 26, 2026
906a259
phase 1: resolve immutable image platforms and retain validated execu…
tyrchen Oct 26, 2026
25a1199
phase 1: retain owned image pins and validate unpacked deployment art…
tyrchen Oct 26, 2026
cfc894f
phase 1: guard image deployment settlement and capture live artifact …
tyrchen Oct 26, 2026
3713d6f
phase 1: supervise asynchronous image deployments and wire provider a…
tyrchen Oct 26, 2026
0cef73b
phase 1: enforce side-effect-free code validation and bounded deploym…
tyrchen Oct 26, 2026
6528215
phase 1: close strict Lambda and authentication boundary checks
tyrchen Oct 26, 2026
58da6b2
phase 1: close dependency advisories and preserve strict ZIP validation
tyrchen Oct 26, 2026
7731e26
phase 1: retain exclusive directory leases through image cleanup
tyrchen Oct 26, 2026
df69fbf
phase 1: retain bounded function logs independently of control IO
tyrchen Oct 26, 2026
9c8f23d
phase 1: bind container allocation to immutable runtime policy
tyrchen Oct 26, 2026
832d39a
phase 1: retain environment lifecycle ownership through recovery
tyrchen Oct 26, 2026
de91fc0
phase 1: retain bounded warm pool dispatch and result ownership
tyrchen Oct 26, 2026
8f284c7
phase 1: arm handler timeouts at consumed runtime delivery
tyrchen Oct 26, 2026
9a74c85
phase 1: isolate invocation log windows from diagnostic tails
tyrchen Oct 26, 2026
2e92c30
phase 1: preserve pre-delivery initialization errors through retirement
tyrchen Oct 26, 2026
c184564
phase 1: retain resumable per-call pool cleanup settlement
tyrchen Oct 26, 2026
e5c4dc3
phase 1: compose real Docker Lambda execution through provider and HTTP
tyrchen Oct 26, 2026
d766ea8
phase 1: qualify Docker networks and actual kernel resource limits
tyrchen Oct 26, 2026
1a715ae
phase 1: persist container intents and reconcile historical allocations
tyrchen Oct 26, 2026
9937246
phase 2: generate Step Functions model and exact JSON timestamps
tyrchen Oct 26, 2026
fb03acc
phase 2: implement bounded typed Step Functions HTTP transport
tyrchen Oct 26, 2026
460dc89
phase 2: compile bounded ASL paths and immutable payload semantics
tyrchen Oct 26, 2026
ff6f365
phase 2: compile bounded Choice predicates with exact timestamp ordering
tyrchen Oct 26, 2026
45ee5eb
phase 2: compile and resolve bounded Wait sources
tyrchen Oct 26, 2026
b6e5b51
phase 2: implement bounded ASL intrinsic expressions
tyrchen Oct 26, 2026
6c45434
phase 2: implement compiled templates and state data-flow phases
tyrchen Oct 26, 2026
cb07e43
phase 2: compile sequential ASL machines into scoped immutable IR
tyrchen Oct 26, 2026
4b2b6bc
phase 2: execute sequential ASL transitions with explicit resource ef…
tyrchen Oct 26, 2026
afdbfd8
phase 2: supervise ASL executions with retained cleanup and official …
tyrchen Oct 26, 2026
70014c5
phase 2: bridge ASL tasks to real Lambda with owned cleanup
tyrchen Oct 26, 2026
5949769
phase 2: retain workflow resource and execution registry ownership
tyrchen Oct 26, 2026
65456d4
phase 2: adapt workflow APIs with retained stable pagination
tyrchen Oct 26, 2026
48b4ad7
phase 2: compose real workflow gateway and resumable shutdown
tyrchen Oct 26, 2026
ea97f97
phase 2: qualify real workflow runtime with ordinary SDKs
tyrchen Oct 26, 2026
d8a28d0
phase 3: compile bounded lexical workflow scopes for M2
tyrchen Oct 26, 2026
a389ef7
phase 3: interpret lazy structured frame effects for M2
tyrchen Oct 26, 2026
005df5a
phase 3: own bounded execution frames and retirement for M2
tyrchen Oct 26, 2026
b7ccff9
phase 3 (M2): own structured execution resources and causal history
tyrchen Oct 26, 2026
1a8fb2f
phase 3 (M2): enable bounded Parallel and Map in the real service
tyrchen Oct 26, 2026
f49cf03
phase 3 (M2): atomically own child registry execution and cleanup
tyrchen Oct 26, 2026
816f5b0
phase 3: bind nested ASL tasks to retained registry execution
tyrchen Oct 26, 2026
c89b413
phase 4: implement owned callback token registry foundation
tyrchen Oct 27, 2026
5af099e
phase 4: prepare callback parameters with typed history provenance
tyrchen Oct 27, 2026
fb3fd1a
phase 4: bind observed Lambda callback invocation ownership
tyrchen Oct 27, 2026
6e585ed
phase 4: defer callback parameters until attempt registration
tyrchen Oct 27, 2026
6ba9f12
phase 4: consume registered ASL callbacks with retained runtime owner…
tyrchen Oct 27, 2026
448c03a
phase 4: route public callbacks through the registered runtime owner
tyrchen Oct 27, 2026
b0ed5bf
phase 4: install callback service and qualify actual handler SDKs
tyrchen Oct 27, 2026
d6d83b7
phase 5: close compression advisories before workflow persistence
tyrchen Oct 27, 2026
a2a3a59
phase 5: bound snapshot CBOR before workflow restore
tyrchen Oct 27, 2026
3e4b09e
phase 5: retain sealed workflow state and export durable snapshots
tyrchen Oct 27, 2026
82bfc54
phase 5 (M4): stage atomic workflow registry restore
tyrchen Oct 27, 2026
16c9b27
phase 5 (M4): persist workflow archives across owned process restarts
tyrchen Oct 27, 2026
a9b9f60
phase 5 (M4): keep the implementation evidence table contiguous
tyrchen Oct 27, 2026
43054d3
phase 5 (M4): qualify pure workflow latency and loop responsiveness
tyrchen Oct 27, 2026
9758b65
phase 5 (M4): freeze native resource suites and publish the workflow …
tyrchen Oct 27, 2026
35adc84
phase 1 (M0): persist private image-pin ownership and recovery
tyrchen Oct 27, 2026
76ffd4b
phase 1 (M0): bind Docker ownership to persistent engine identity
tyrchen Oct 27, 2026
2005597
phase 1 (M0): reconcile recorded namespaces with complete observed in…
tyrchen Oct 27, 2026
8bb6bb4
phase 1 (M0): retain controlled image pulls through preparation
tyrchen Oct 27, 2026
167f1aa
phase 1 (M0): validate Docker settings and private registry credentials
tyrchen Oct 27, 2026
feb31df
phase 1 (M0): prove gateway reachability from pinned containers
tyrchen Oct 27, 2026
2029e0c
phase 1 (M0): activate qualified production Docker image startup
tyrchen Oct 27, 2026
535c4e7
phase 1 (M0): qualify custom RIC and immutable image revisions
tyrchen Oct 27, 2026
6c9f3cd
phase 1 (M0): qualify Image faults and public cancellation
tyrchen Oct 27, 2026
2a79d30
phase 1 (M0): retain image preparation admission through physical set…
tyrchen Oct 27, 2026
dfa35d3
phase 1 (M0): qualify Docker IO expiry and incompatible image failures
tyrchen Oct 27, 2026
0d2b166
phase 1 (M0): close real image runtime and admission qualification
tyrchen Oct 27, 2026
f201803
phase 5 (M4): reacquire immutable image leases for archive restore
tyrchen Oct 27, 2026
372b95e
phase 5 (M4): restore immutable image archives through startup
tyrchen Oct 27, 2026
4959ffa
phase 5 (M4): add bounded ZIP code and volume transport
tyrchen Oct 27, 2026
d66fd9c
phase 5 (M4): add durable code namespace recovery
tyrchen Oct 27, 2026
e336044
phase 5 (M4): retain producing code-volume ownership
tyrchen Oct 27, 2026
bf57fdf
phase 5 (M4): execute provided ZIP through owned Docker runtime
tyrchen Oct 30, 2026
2e16744
phase 5 (M4): restore bounded provided ZIP archives
tyrchen Oct 31, 2026
2bc7db7
phase 5 review: reconcile D93 decision qualification status
tyrchen Oct 31, 2026
8bc116d
phase 5 (M4): qualify official Node image execution
tyrchen Oct 31, 2026
d5a6c79
phase 5 (M4): qualify explicit local image SDK credentials (D95)
tyrchen Oct 31, 2026
eb2e4dc
phase 4/5: qualify M3 callbacks through real Lambda images
tyrchen Oct 31, 2026
9f670d6
phase 5: specify the M4 Pulumi image lifecycle consumer
tyrchen Oct 31, 2026
b5abb6f
phase 5: qualify managed Pulumi image Lambda lifecycle
tyrchen Oct 31, 2026
0f7749c
phase 5: specify server-container qualification
tyrchen Oct 31, 2026
658ad61
phase 5: qualify actual Rustack server containers
tyrchen Oct 31, 2026
26231ff
phase 5: specify release image and Action qualification
tyrchen Oct 31, 2026
cf8dd24
phase 5: qualify release images and composite Action
tyrchen Oct 31, 2026
9a62641
phase 5: measure pure workflows directly on arm64 Linux
tyrchen Oct 31, 2026
4e7f27a
phase 5: qualify image runtime performance and preserve fixture sources
tyrchen Oct 31, 2026
d4dacf2
phase 5: provision and attest an isolated rootless Docker daemon
tyrchen Oct 31, 2026
60a46e0
phase 5: finish workflow consumers and source-bound qualification
tyrchen Nov 1, 2026
fd8d997
phase 5: record isolated rootful qualification and preserved resources
tyrchen Nov 1, 2026
7d908df
phase 5: add original LocalStack workflow compatibility probes
tyrchen Nov 1, 2026
63ef18b
phase 5: match observed AWS workflow behavior
tyrchen Nov 1, 2026
c234d30
fix: align workflow CI assertions and cleanup synchronization
tyrchen Nov 1, 2026
805f464
chore: update ignore
tyrchen Nov 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 8 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,11 @@ docs/
specs/
*.md
LICENSE
**/.env
**/.env.*
**/node_modules
**/__pycache__
**/.venv
**/.pulumi
.DS_Store
**/.DS_Store
2 changes: 1 addition & 1 deletion .github/actions/load-image/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ runs:
using: "composite"
steps:
- name: Download image artifact
uses: actions/download-artifact@v4
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: rustack-image
path: /tmp
Expand Down
60 changes: 60 additions & 0 deletions .github/workflows/promote-docker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: promote-docker

on:
workflow_dispatch:
inputs:
candidate_run_id:
description: Successful same-commit release-docker candidate run
required: true
type: string
qualification_run_id:
description: Successful same-commit qualify-workflows run
required: true
type: string
version:
description: Numeric major.minor.patch version to promote
required: true
type: string

permissions:
contents: read
actions: read

jobs:
promote:
runs-on: ubuntu-24.04-arm
timeout-minutes: 30
permissions:
contents: read
actions: read
packages: write
env:
GH_TOKEN: ${{ github.token }}
CANDIDATE_RUN_ID: ${{ inputs.candidate_run_id }}
QUALIFICATION_RUN_ID: ${{ inputs.qualification_run_id }}
RELEASE_VERSION: ${{ inputs.version }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
run-id: ${{ inputs.qualification_run_id }}
name: workflows-qualified-release
github-token: ${{ github.token }}
path: ${{ runner.temp }}/qualification
- name: Recheck raw qualification before registry login
run: make workflows-release-preflight WORKFLOWS_RELEASE_BUNDLE="${{ runner.temp }}/qualification"
- uses: docker/login-action@81c6f93d4bc991e510b342a00b419b3bb4efc5c6 # v4.7.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Promote the qualified archives without rebuilding
run: make workflows-release-promote WORKFLOWS_RELEASE_BUNDLE="${{ runner.temp }}/qualification"
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: workflows-promotion-receipt
path: ${{ runner.temp }}/qualification/promotion.json
if-no-files-found: error
54 changes: 54 additions & 0 deletions .github/workflows/qualify-workflows.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: qualify-workflows

on:
workflow_dispatch:
inputs:
candidate_run_id:
description: Successful same-commit release-docker run containing the exact archives
required: true
type: string
evidence_run_id:
description: Successful same-commit run containing the complete workflows-evidence artifact
required: true
type: string

permissions:
contents: read
actions: read

jobs:
assemble:
runs-on: ubuntu-24.04-arm
timeout-minutes: 15
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Fence source runs
env:
GH_TOKEN: ${{ github.token }}
CANDIDATE_RUN_ID: ${{ inputs.candidate_run_id }}
EVIDENCE_RUN_ID: ${{ inputs.evidence_run_id }}
run: make workflows-release-input-runs
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
run-id: ${{ inputs.evidence_run_id }}
name: workflows-evidence
github-token: ${{ github.token }}
path: ${{ runner.temp }}/qualification
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
run-id: ${{ inputs.candidate_run_id }}
pattern: release-candidate-*
merge-multiple: true
github-token: ${{ github.token }}
path: ${{ runner.temp }}/qualification
- name: Require complete raw evidence and exact candidates
run: make verify-workflows WORKFLOWS_RELEASE_BUNDLE="${{ runner.temp }}/qualification" WORKFLOWS_RELEASE_REPORT="${{ runner.temp }}/qualification/release-report.json"
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: workflows-qualified-release
path: ${{ runner.temp }}/qualification/
if-no-files-found: error
retention-days: 30
compression-level: 0
108 changes: 50 additions & 58 deletions .github/workflows/release-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,71 +2,63 @@ name: release-docker

on:
push:
tags:
- v*
tags: [v*]
workflow_dispatch:

# Candidates are local Docker archives. Publication belongs to promote-docker.
permissions:
contents: read
packages: write

env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository_owner }}/rustack

jobs:
# Wait for the build workflow to pass before pushing the Docker image.
wait-for-build:
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest
candidate:
strategy:
fail-fast: false
matrix:
include:
- architecture: arm64
runner: ubuntu-24.04-arm
- architecture: amd64
runner: ubuntu-24.04
runs-on: ${{ matrix.runner }}
timeout-minutes: 90
steps:
- name: Wait for build workflow
uses: lewagon/wait-on-check-action@v1.3.4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.ref }}
repo-token: ${{ secrets.GITHUB_TOKEN }}
check-name: build-rust (ubuntu-latest)
wait-interval: 15
allowed-conclusions: success

build-and-push:
needs: [wait-for-build]
if: always() && (needs.wait-for-build.result == 'success' || github.event_name == 'workflow_dispatch')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Set up QEMU (for multi-arch builds)
uses: docker/setup-qemu-action@v3

- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Docker metadata
id: docker-meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=semver,pattern={{version}},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
type=semver,pattern={{major}}.{{minor}},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
type=semver,pattern={{major}},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
type=raw,value=latest

- name: Build and push
uses: docker/build-push-action@v6
persist-credentials: false
- uses: docker/setup-buildx-action@f87e5991a6d7451dcb8d9637bfbc97413f497069 # v4.4.1
- name: Allocate candidate directory
run: mkdir -m 700 "${{ runner.temp }}/candidate"
- name: Build without publication
uses: docker/build-push-action@c3c9e263c25d99ce0380d002d59b67737d91b0dc # v7.4.0
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.docker-meta.outputs.tags }}
labels: ${{ steps.docker-meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
platforms: linux/${{ matrix.architecture }}
push: false
provenance: false
tags: rustack/workflows-release:integration-${{ matrix.architecture }}
outputs: type=docker,dest=${{ runner.temp }}/candidate/release-${{ matrix.architecture }}.tar
cache-from: type=gha,scope=release-${{ matrix.architecture }}
cache-to: type=gha,mode=max,scope=release-${{ matrix.architecture }}
- name: Load and seal exact archive
env:
ARCHITECTURE: ${{ matrix.architecture }}
CANDIDATE: ${{ runner.temp }}/candidate
run: |
docker image load --input "$CANDIDATE/release-$ARCHITECTURE.tar"
make workflows-release-seal WORKFLOWS_ARCH="$ARCHITECTURE" WORKFLOWS_RELEASE_BUNDLE="$CANDIDATE"
- name: Record execution scope
env:
ARCHITECTURE: ${{ matrix.architecture }}
run: |
if [ "$ARCHITECTURE" = amd64 ]; then
echo 'D100: distribution build only; Linux x86_64 execution is waived.' >> "$GITHUB_STEP_SUMMARY"
else
echo 'Candidate awaits complete exact-image platform qualification; no promotion occurred.' >> "$GITHUB_STEP_SUMMARY"
fi
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: release-candidate-${{ matrix.architecture }}
path: ${{ runner.temp }}/candidate/
if-no-files-found: error
retention-days: 30
compression-level: 0
Loading
Loading