Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
395 commits
Select commit Hold shift + click to select a range
d485bef
Stage 6.1: provision dispatch via Adapter trait + axum impl
aram356 May 27, 2026
a5535de
Stage 6.2: cloudflare provision (wrangler shell-out + wrangler.toml w…
aram356 May 27, 2026
2cf1d0d
Stage 6.3: fastly provision (fastly CLI shell-out + fastly.toml write…
aram356 May 27, 2026
b38271e
Stage 6.4: spin provision (pure spin.toml editing, no shell-out)
aram356 May 27, 2026
357a58b
Stage 7.1: config push command (trait + axum impl + CLI raw/typed)
aram356 May 27, 2026
89abc59
Stage 7.2: cloudflare config push (wrangler kv bulk put)
aram356 May 27, 2026
4598da0
Stage 7.3: fastly config push (config-store-entry create per key)
aram356 May 27, 2026
79d7b20
Stage 7.4: spin config push (pure spin.toml editing, two tables)
aram356 May 27, 2026
1261e3b
Stage 8.1: app-demo spin.toml — declare manual secret variables
aram356 May 27, 2026
2bcd66c
Stage 8.2: app-demo integration tests for the typed CLI flow
aram356 May 27, 2026
7ea0e82
Stage 8.3: app-demo handlers exercise Kv::named (sessions + cache)
aram356 May 27, 2026
5e6c98f
Refresh plan status to reflect Stages 6/7/8 progress
aram356 May 27, 2026
c765044
Stage 8.4: generator cli template emits the full 7-command surface
aram356 May 28, 2026
82d3e5d
Stage 8.5: app-demo e2e push→AxumConfigStore→handler roundtrip test
aram356 May 28, 2026
c4d998c
Stage 8.6: CI wires app-demo workspace into tests + fmt + clippy
aram356 May 28, 2026
56d12ce
Stage 8.7: cli-walkthrough.md + docs audit + sidebar + build fix
aram356 May 28, 2026
a078acb
Stage 9.1 (review fix): run_config_push* runs the strict preflight
aram356 May 28, 2026
8d734a8
Stage 9.2 (review fix): Spin secret-value validation mirrors runtime …
aram356 May 28, 2026
66ff8cc
Stage 9.3 (review fix): enforce runtime store-API hard-cutoff
aram356 May 28, 2026
a59fda4
Stage 9.4 (review fix): assert Spin dry-run preview content (translat…
aram356 May 28, 2026
e6cdafd
Stage 9.5 (review fix): refresh PR template, run_tests.sh, migration …
aram356 May 28, 2026
7dc0cdb
Stage 10.1 (review fix): full runtime store-API hard-cutoff
aram356 May 28, 2026
693ca89
Stage 10.2 (review fix): docs / plan / CLAUDE.md align with hard-cutoff
aram356 May 28, 2026
2595f53
Scrub stage/task/phase/section refs from source comments
aram356 May 28, 2026
f2d705c
Harden fastly cli: schema-drift detection + partial-fail tracking
aram356 May 28, 2026
b2a81d7
Harden cloudflare cli: idempotent provision + lenient push dry-run
aram356 May 28, 2026
845c2ee
Spin cli UX polish: per-mode key diagnostics + table migration hint
aram356 May 28, 2026
ed44525
Doc polish: AuthArgs no-Default rationale + axum from_path JSON shape
aram356 May 28, 2026
7f0b2dc
Add precedence test for synthesised one-id store registry
aram356 May 28, 2026
6c07f5a
Close remaining L2/L4/L5/L6 self-review followups
aram356 May 28, 2026
ce77183
Close deep-review findings: scaffold + spin inline + fastly half-setu…
aram356 May 28, 2026
87fb6ef
Close all remaining deep-review findings (cloudflare/fastly/spin/scaf…
aram356 May 29, 2026
a713d10
Close provision capability gap: enforce Single-store on the operator-…
aram356 May 29, 2026
a76fe68
Fix env precedence + drop axum legacy EDGEZERO_HOST shim
aram356 May 29, 2026
4c1a375
Fix env-overlay prefix shown in scaffold templates + app-demo comments
aram356 May 29, 2026
851aee4
Close all multi-review findings: platform-name flow + hard-cutoff + t…
aram356 May 29, 2026
7a48de7
Hard-cutoff pass: empty-name guard + drop EDGEZERO_KV defaults + Serv…
aram356 May 30, 2026
ea35362
Extract test-fixture consts in cloudflare/fastly/spin cli.rs test mods
aram356 May 30, 2026
37a7309
Don't log adapter passthrough args — can carry deploy secrets
aram356 May 30, 2026
a48a2ef
clippy --fix auto-applied for wasm32 adapter targets
aram356 May 30, 2026
9479d32
Make fastly contract test pass wasm32-wasip1 clippy
aram356 May 30, 2026
aacfa6a
Add per-target clippy matrix for adapter wasm builds
aram356 May 30, 2026
201a5a6
Move adapter wasm clippy matrix from test.yml to format.yml
aram356 May 30, 2026
6345221
wasm32 clippy: clean cloudflare context.rs and secret_store.rs
aram356 May 30, 2026
38db306
wasm32 clippy: clean cloudflare response.rs and proxy.rs
aram356 May 30, 2026
f022f61
wasm32 clippy: clean cloudflare config_store.rs
aram356 May 30, 2026
8a2db78
wasm32 clippy: clean cloudflare key_value_store.rs
aram356 May 30, 2026
c9cc90d
wasm32 clippy: clean cloudflare lib.rs and request.rs
aram356 May 30, 2026
048bb6a
wasm32 clippy: clean cloudflare contract.rs
aram356 May 30, 2026
065c9b4
wasm32 clippy: clean spin response/secret/config small files
aram356 May 30, 2026
7ae578e
wasm32 clippy: clean spin lib.rs and key_value_store.rs
aram356 May 30, 2026
f4aeeb6
wasm32 clippy: clean spin proxy.rs and request.rs
aram356 May 30, 2026
1e40f2a
wasm32 clippy: clean spin contract.rs
aram356 May 30, 2026
1f45a0e
Address remaining PR #257 review feedback
aram356 May 31, 2026
a788865
Upgrade Spin adapter to spin-sdk 6.0 (WASI Preview 2)
aram356 May 31, 2026
db6159a
Close PR #257 self-review followups: store id validation + docs lint
aram356 May 31, 2026
0fe8c8f
Merge origin/chore/strict-clippy into feature/extensible-cli
aram356 May 31, 2026
8c6a26b
Pass strict clippy on wasm32 adapter targets
aram356 Jun 1, 2026
6d01ad6
Close PR #257 self-review followups: store id validation + docs lint
aram356 Jun 2, 2026
90437eb
Print log when validating config
aram356 Jun 2, 2026
8ef412c
Skip Fastly logger init when no endpoint is configured
aram356 Jun 2, 2026
c1bc171
Add config push --local for fastly + cloudflare; delegate for spin/axum
aram356 Jun 2, 2026
805dda4
Spin config store: switch from variables to KV backend
aram356 Jun 3, 2026
21f0b72
Spin seed handler + run_app_with_seeder for `config push --local`
aram356 Jun 3, 2026
ffed5b9
config push: HTTP POST to seed handler for spin; AdapterPushContext
aram356 Jun 4, 2026
bb50235
Spin KV-config Stage 5: provision writes config labels to key_value_s…
aram356 Jun 4, 2026
30729af
Spin KV-config Stage 6: drop Spin's variable-name validator
aram356 Jun 4, 2026
00f6bac
Spin KV-config Stage 7: docs + app-demo migration
aram356 Jun 4, 2026
8813d24
Spin KV-config Stage 8: runtime-config.toml scaffold + plan/spec clos…
aram356 Jun 4, 2026
02af450
spin: PR-thread review fixes + per-backend-push plan
aram356 Jun 5, 2026
45f552a
Address June-02 PR #257 review feedback
aram356 Jun 5, 2026
76759ee
spin: drop /__edgezero/config/seed handler (architecture pivot)
aram356 Jun 5, 2026
32f066d
spin: per-backend writers (SQLite-direct + Fermyon Cloud shellout)
aram356 Jun 5, 2026
4189f70
spin: address review findings on per-backend dispatcher
aram356 Jun 5, 2026
b55a6c4
spin: fix `spin cloud key-value set` shape + non-default-label gate +…
aram356 Jun 5, 2026
19e8811
spin: fix parallel-test env race, switch cloud push to --app + --labe…
aram356 Jun 5, 2026
0e47777
spin: fix `link key-value` hint shape; scaffold doc; hermetic mock-sp…
aram356 Jun 5, 2026
8bb0eb7
Merge origin/chore/strict-clippy into feature/extensible-cli
aram356 Jun 6, 2026
a392a39
spin: race-free push tests, defer runtime-config parse for cloud, doc…
aram356 Jun 6, 2026
7484114
scaffold/cloud-dryrun/docs: fix CF template, validate cloud --dry-run…
aram356 Jun 6, 2026
1b10e72
spin/docs: partial-failure cloud-push diagnostic + 3 stale-doc fixes
aram356 Jun 6, 2026
b35d30c
spin: silence strict-clippy on cloud partial-failure diagnostic
aram356 Jun 7, 2026
d08df5c
docs: prettier-format cli-walkthrough Spin config-push bullets
aram356 Jun 7, 2026
0bde8cd
docs: outbound HTTP design spec (consumer driver)
aram356 Jun 8, 2026
96320d6
docs: scrub consumer-specific terminology from outbound HTTP spec
aram356 Jun 8, 2026
2db077b
docs: Fastly SDK correctness pass (round 50)
aram356 Jun 8, 2026
8919e67
docs: round-50 carry-overs and Spin WASI-write mechanics (round 51)
aram356 Jun 8, 2026
3e6e52d
Merge remote-tracking branch 'origin/main' into docs/outbound-http-spec
aram356 Jul 2, 2026
eb915d0
docs: close three completeness gaps in outbound-http spec
aram356 Jul 2, 2026
f840960
docs: close remaining completeness gaps in outbound-http spec
aram356 Jul 2, 2026
a7832c1
docs: self-review fixes to outbound-http spec additions
aram356 Jul 2, 2026
2606b6f
Merge remote-tracking branch 'origin/main' into docs/outbound-http-spec
aram356 Jul 10, 2026
67aa2f7
Merge branch 'main' into docs/outbound-http-spec
aram356 Jul 12, 2026
d1873a4
docs: outbound-http spec amendments + implementation decisions regist…
aram356 Jul 14, 2026
aad51ee
Merge remote-tracking branch 'origin/docs/outbound-http-spec' into do…
aram356 Jul 14, 2026
f2233d3
docs: compile-verified fixes to outbound-http spec (skeleton-adjudica…
aram356 Jul 15, 2026
3995b2f
docs: resolve four outbound-http policy decisions + CLI-gate skeleton
aram356 Jul 15, 2026
6b97988
docs: fix verification-review findings (gate-class propagation + stal…
aram356 Jul 16, 2026
5f3be4b
docs: Phase 1a implementation plan (EdgeError 502/504 + time.rs primi…
aram356 Jul 16, 2026
e2e35f2
fix: review findings in Phase 1a plan + spec pseudocode contradictions
aram356 Jul 16, 2026
0ffb1c3
fix: strict-clippy contract, shared trait-default static, Fastly erro…
aram356 Jul 17, 2026
517f9f6
fix: strict-lint gate (compile-verified), capability schema, Fastly e…
aram356 Jul 17, 2026
bdfdc42
fix: remaining review findings (fail-open gate, CLI/Fastly seams, lin…
aram356 Jul 17, 2026
8e648c6
fix: review findings (lifetime bug, StoredError, Fastly cache bound) …
aram356 Jul 17, 2026
020529c
fix(plan): rustfmt-canonical test snippets; spec appendix from_hours …
aram356 Jul 18, 2026
bba4428
fix(spec): repair rustdoc damaged by the over-aggressive comment cleanup
aram356 Jul 18, 2026
4f8d6ea
fix(spec): baked-manifest fail-open, Fastly bucket overshoot, nonexis…
aram356 Jul 18, 2026
c737e80
fix(spec): Spin early-response race (H3) + run_demo seam, ManifestCon…
aram356 Jul 18, 2026
d08c615
fix: revert wrong Fastly cache model (session-scoped, not cross-reque…
aram356 Jul 19, 2026
92d0983
fix: Cloudflare abort, Spin error map, Fastly Tier2 seam, capability …
aram356 Jul 19, 2026
b8593c3
fix: Fastly cache Send+Sync (Mutex, not RefCell), capability deny_unk…
aram356 Jul 19, 2026
e8ef932
fix: adapter design findings (Axum decode, CF/Spin cancellation, capa…
aram356 Jul 19, 2026
f6b12de
Merge branch 'main' into docs/outbound-http-spec
aram356 Aug 7, 2026
dab146a
Merge branch 'main' into docs/outbound-http-spec
aram356 Aug 7, 2026
e12a832
Merge branch 'main' into docs/outbound-http-spec
aram356 Aug 10, 2026
1b10017
Merge remote-tracking branch 'origin/main' into docs/outbound-http-spec
aram356 Aug 18, 2026
2897401
docs(outbound-http): resolve review round + fix spec conventions
aram356 Aug 28, 2026
e73f8e5
docs(outbound-http): tighten design and phase 1a plan
aram356 Sep 3, 2026
edadd39
Merge remote-tracking branch 'origin/main' into docs/outbound-http-spec
aram356 Sep 3, 2026
32fca0e
docs(inbound-body): document memory and extractor limits
aram356 Sep 3, 2026
92ff240
docs(outbound-http): resolve deep review findings
aram356 Sep 4, 2026
8f00d90
Merge branch 'main' into docs/outbound-http-spec
aram356 Sep 6, 2026
4f42390
docs: finalize outbound HTTP design and phase 1a plan
aram356 Sep 7, 2026
bc99061
feat(core): add typed gateway errors
aram356 Sep 7, 2026
1eee6eb
feat(core): add time module (Deadline + budget constants)
aram356 Sep 7, 2026
b78802d
docs: add outbound HTTP implementation plans
aram356 Sep 7, 2026
60795c5
docs: harden outbound HTTP design and plans
aram356 Sep 8, 2026
eb5d19c
docs(outbound): close lifecycle contract gaps
aram356 Sep 9, 2026
6f7e41c
feat(core): implement outbound HTTP contracts
aram356 Sep 9, 2026
bd1cc4b
feat(axum): implement outbound HTTP contracts
aram356 Sep 9, 2026
06a1f95
feat(core): add outbound capability manifest schema
aram356 Sep 9, 2026
f4a178c
feat(cloudflare): implement outbound capability contracts
aram356 Sep 9, 2026
36b0752
feat(cli): enforce outbound capabilities
aram356 Sep 9, 2026
1d1b0e9
fix(cli): pin capability-checked runtime targets
aram356 Sep 9, 2026
0621173
test(spin): execute WASI HTTP SDK resources
aram356 Sep 9, 2026
0e398d6
feat(spin): implement outbound HTTP contracts
aram356 Sep 9, 2026
0d033a8
feat(fastly): implement outbound HTTP contracts
aram356 Sep 9, 2026
d0eb756
feat(spin): publish outbound capability levels
aram356 Sep 9, 2026
0dc3272
feat(scaffold): generate outbound HTTP clients
aram356 Sep 9, 2026
d1e5292
refactor(app-demo): migrate to outbound HTTP API
aram356 Sep 9, 2026
680899f
fix(adapters): bound response stream conversion
aram356 Sep 9, 2026
a97b103
refactor(core): remove legacy proxy API
aram356 Sep 9, 2026
eddc483
fix(outbound): preserve adapter response marker
aram356 Sep 9, 2026
94e9ebd
docs: publish outbound HTTP and capabilities guide
aram356 Sep 9, 2026
5c2ad13
ci: enforce outbound HTTP completion matrix
aram356 Sep 9, 2026
6158fb7
feat(core): add ingress admission contract
aram356 Sep 9, 2026
a3ad5b7
feat(core): bound ingress config extraction
aram356 Sep 9, 2026
a17f733
feat: address outbound lifecycle requirements
aram356 Sep 10, 2026
fb722e7
fix(ci): cover target-specific adapter builds
aram356 Sep 10, 2026
cedefac
fix(ci): lint app-demo compatibility fixtures
aram356 Sep 10, 2026
86f6e83
fix(ci): exercise lazy request contracts
aram356 Sep 10, 2026
4cb67c2
fix(scaffold): propagate request reconstruction errors
aram356 Sep 10, 2026
1b101ac
fix(outbound): harden lifecycle contracts
aram356 Sep 10, 2026
4aa38ab
fix(ci): gate adapter test helpers
aram356 Sep 10, 2026
0a6d511
docs: record outbound hardening verification
aram356 Sep 10, 2026
91066d2
feat: align demo and generated lifecycle policies
aram356 Sep 10, 2026
8cc17c5
ci: install generator verification components
aram356 Sep 10, 2026
053d38f
docs: close demo generator alignment plan
aram356 Sep 10, 2026
68e5906
feat(ingress): bound fallback request bodies
aram356 Sep 10, 2026
3e7da48
fix(outbound): harden adapter lifecycle semantics
aram356 Sep 11, 2026
5716505
feat(ingress): transfer fallback grants and responses
aram356 Sep 11, 2026
86acb54
feat(ingress): align axum fallback lifecycle
aram356 Sep 11, 2026
fbe88a8
test(cli): pin fallback response mappings
aram356 Sep 11, 2026
95225d7
test(ingress): harden fallback lifecycle coverage
aram356 Sep 11, 2026
6e8954b
test(ingress): cover edge adapter fallback lifecycle
aram356 Sep 11, 2026
4abd1e2
feat(outbound): inject application clocks into adapters
aram356 Sep 11, 2026
e88aea5
fix(outbound): harden injected clock boundaries
aram356 Sep 11, 2026
34276d6
refactor(ingress): share adapter fallback dispatch paths
aram356 Sep 11, 2026
4faa59d
fix(adapters): close ingress and clock review gaps
aram356 Sep 11, 2026
e961a4c
fix(cloudflare): preserve authoritative response headers
aram356 Sep 11, 2026
923c03e
fix(outbound): close final review gaps
aram356 Sep 11, 2026
12cca8c
fix(ci): gate Cloudflare helper import
aram356 Sep 11, 2026
a997e00
fix(outbound): align adapter runtime contracts
aram356 Sep 11, 2026
7524726
refactor(cfg): audit adapter feature boundaries
aram356 Sep 12, 2026
244c793
fix(ci): scope Fastly lint expectations
aram356 Sep 12, 2026
fc1491a
fix(ingress): enforce Spin pending read deadlines
aram356 Sep 12, 2026
4ea9ce4
docs(capabilities): publish config support matrix
aram356 Sep 12, 2026
b60ae83
feat: complete outbound HTTP and response lifecycle support
aram356 Sep 14, 2026
9ed3b9d
fix: restore outbound provider CI contracts
aram356 Sep 14, 2026
28f7516
fix: harden outbound lifecycle contracts
aram356 Sep 14, 2026
b9cbbdb
fix: restore Cloudflare wasm lint gate
aram356 Sep 14, 2026
84e3e75
fix(outbound): close final lifecycle review gaps
aram356 Sep 15, 2026
d23ac81
fix(ci): fetch demo dependencies before offline audit
aram356 Sep 15, 2026
c14361b
feat(outbound): add completion-driven batch control
aram356 Sep 15, 2026
ebb9dfc
fix(outbound): type batch termination
aram356 Sep 16, 2026
02771f1
fix(ci): avoid indexed cutoff assertions
aram356 Sep 16, 2026
6b1e707
docs(outbound): close batch termination plan
aram356 Sep 16, 2026
ea3de8f
fix(outbound): preserve batch driver failures
aram356 Sep 17, 2026
a47400c
docs(plan): complete batch driver failure delivery
aram356 Sep 17, 2026
6221c45
fix(outbound): harden batch and Fastly egress contracts
aram356 Sep 17, 2026
5ff5620
fix(outbound): preserve early Fastly batch timeouts
aram356 Sep 17, 2026
2e7a994
fix(fastly): satisfy CLI item ordering
aram356 Sep 18, 2026
bfdeadf
docs(outbound): clarify batch cancellation lifecycle
aram356 Sep 18, 2026
c20444a
docs(outbound): deduplicate budget source contract
aram356 Sep 18, 2026
4fc571d
docs: design response completion and ingress abort
aram356 Sep 19, 2026
317e9d4
feat(core): add response-scoped egress completion
aram356 Sep 19, 2026
6496e38
feat(core): carry completion through ingress admission
aram356 Sep 19, 2026
57092b5
feat(axum): abort rejected ingress at connection boundary
aram356 Sep 19, 2026
e34795b
feat(adapters): propagate ingress abort without a response
aram356 Sep 19, 2026
111a34b
feat(app): make application assembly fallible
aram356 Sep 19, 2026
477bbbb
docs: align consumers with ingress lifecycle hard cut
aram356 Sep 19, 2026
4ece0ce
test: close lifecycle hard-cut coverage
aram356 Sep 19, 2026
f7bf087
docs: complete lifecycle implementation plan
aram356 Sep 19, 2026
d240d38
feat(core): harden lifecycle and bounded reads
aram356 Sep 20, 2026
a32e4e7
feat(core): allow detached ingress abort decisions
aram356 Sep 20, 2026
cb91564
Merge origin/main into docs/outbound-http-spec
aram356 Sep 20, 2026
366d49f
docs(plan): record detached ingress verification
aram356 Sep 20, 2026
d276c11
docs: define response egress composition and deadlines
aram356 Sep 20, 2026
9d25fb4
feat(core): compose response egress completions
aram356 Sep 20, 2026
c59864b
feat(core): require detached response deadlines
aram356 Sep 20, 2026
71ed199
test(adapters): migrate detached egress deadlines
aram356 Sep 20, 2026
5988bed
feat: align detached response egress examples
aram356 Sep 20, 2026
97b328f
fix: align generated response lifecycle
aram356 Sep 20, 2026
f0ca3eb
fix: harden response egress legacy scan
aram356 Sep 20, 2026
44b1cf5
docs(plan): record response egress verification
aram356 Sep 20, 2026
6e28bca
ci: consolidate adapter clippy checks
aram356 Sep 20, 2026
851f73e
feat(core): add response-relative egress deadlines
aram356 Sep 21, 2026
2e3e79c
fix(core): preserve framework error response contracts
aram356 Sep 24, 2026
a1f0ca2
fix(core): preserve mandatory error headers
aram356 Sep 24, 2026
53bd6ff
fix(cli): isolate template dependency feature
aram356 Sep 25, 2026
6969fa9
Merge remote-tracking branch 'origin/main' into docs/outbound-http-spec
aram356 Sep 25, 2026
8b29079
feat(adapter): expose platform memory ceilings
aram356 Sep 27, 2026
d523e77
fix(app): centralize platform-aware construction
aram356 Sep 27, 2026
4189710
fix: harden outbound clock and decoder contracts
aram356 Sep 27, 2026
2b4d22b
fix: gate spin clock regression helper
aram356 Sep 27, 2026
6fe77d4
docs: specify platform resource metadata
aram356 Sep 29, 2026
02d4fa1
feat(core): model typed platform resource facts
aram356 Sep 29, 2026
ca221c7
feat(core): validate platform memory envelopes
aram356 Sep 29, 2026
ab4ee50
feat(adapters): publish platform resource metadata
aram356 Sep 29, 2026
b52e2c0
docs(outbound): clarify batch observation cutoff
aram356 Sep 29, 2026
89173af
fix(core): support generic platform facts
aram356 Sep 29, 2026
8fa8429
docs: publish platform resource contracts
aram356 Sep 29, 2026
62153bc
docs: record platform resource verification
aram356 Sep 29, 2026
491df84
docs: complete platform resource delivery record
aram356 Sep 29, 2026
97b1a7e
feat(outbound): decode deflate and type passthrough reasons
aram356 Sep 29, 2026
69b86ca
fix(outbound): close adapter lifecycle and scaffold gaps
aram356 Sep 29, 2026
74f864b
fix(fastly): order shared items for CLI-only lint
aram356 Sep 29, 2026
c84996a
fix: preserve declared config bindings and defer Spin opens
aram356 Oct 2, 2026
04353fc
Bound config envelope JSON structure before materialization
aram356 Oct 3, 2026
e1c80b1
refactor: construct ordinary JSON with json!
aram356 Oct 3, 2026
5527b58
test: preserve failed Cloudflare config binding contracts
aram356 Oct 3, 2026
dfd439c
fix(logging): separate boot diagnostics from runtime filtering
aram356 Oct 6, 2026
9211183
fix: validate response EOF and batch driver finalization
aram356 Oct 6, 2026
950cb81
docs: complete PR 275 changelog
aram356 Oct 6, 2026
91f4af3
Merge main and share outbound batch and response policy
aram356 Oct 7, 2026
2cecc2e
Bound Axum HTTP/1 ingress before application admission
aram356 Oct 7, 2026
d1a8157
fix(axum): bound config snapshots before serving
aram356 Oct 8, 2026
633bd84
test(cli): isolate demo startup store state
aram356 Oct 8, 2026
ea66eff
Bound provider config reads and add lifecycle qualification probes
aram356 Oct 8, 2026
28038cc
Merge main while preserving portable HTTP lifecycle contracts
aram356 Oct 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/agents/code-architect.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ architectural principles:

3. **Thin adapters**: each adapter translates platform types to/from core types.
Business logic never lives in adapters. The adapter file structure is:
`context.rs`, `request.rs`, `response.rs`, `proxy.rs`, `logger.rs`, `cli.rs`.
`context.rs`, `request.rs`, `response.rs`, `outbound.rs`, `logger.rs`, `cli.rs`.

4. **Contract testing**: every adapter has `tests/contract.rs` that validates
request/response mapping. New adapters must follow this pattern.
Expand Down
85 changes: 67 additions & 18 deletions .github/workflows/format.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:

- name: Retrieve Rust version
id: rust-version
run: echo "rust-version=$(grep '^rust ' .tool-versions | awk '{print $2}')" >> $GITHUB_OUTPUT
run: echo "rust-version=$(grep '^rust ' .tool-versions | awk '{print $2}')" >> "$GITHUB_OUTPUT"
shell: bash

- name: Set up rust toolchain
Expand Down Expand Up @@ -84,28 +84,41 @@ jobs:
working-directory: examples/app-demo
run: cargo clippy --workspace --all-targets --all-features -- -D warnings

adapter-wasm-clippy:
name: ${{ matrix.adapter }} wasm clippy
adapter-clippy:
name: ${{ matrix.check_name }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- adapter: cloudflare
target: wasm32-unknown-unknown
features: cloudflare
check_name: cloudflare wasm clippy
feature_sets: |-
cloudflare
cloudflare,test-utils
- adapter: fastly
target: wasm32-wasip1
features: fastly
# The `cli` feature is a valid wasip1 build combination (the CLI host
# code compiled for the guest target); gate it so a dead-code or
# portability regression there is caught, not only in the fastly-only build.
- adapter: fastly
target: wasm32-wasip1
features: fastly cli
check_name: fastly wasm clippy
# The `cli` feature is valid on wasip1. Lint it independently so
# feature unification cannot mask target-specific cfg mistakes.
feature_sets: |-
fastly
fastly,cli
fastly,test-utils
fastly,cli,test-utils
- adapter: spin
target: wasm32-wasip2
features: spin
check_name: spin wasm clippy
feature_sets: |-
spin
spin,test-utils
- adapter: axum
target: native
check_name: axum native clippy
feature_sets: |-
axum
axum,test-utils
steps:
- uses: actions/checkout@v6
with:
Expand All @@ -126,7 +139,7 @@ jobs:

- name: Retrieve Rust version
id: rust-version
run: echo "rust-version=$(grep '^rust ' .tool-versions | awk '{print $2}')" >> $GITHUB_OUTPUT
run: echo "rust-version=$(grep '^rust ' .tool-versions | awk '{print $2}')" >> "$GITHUB_OUTPUT"
shell: bash

- name: Set up Rust tool chain
Expand All @@ -136,17 +149,46 @@ jobs:
components: clippy

- name: Add wasm target
if: matrix.target != 'native'
run: rustup target add ${{ matrix.target }}

- name: Fetch dependencies (locked)
run: cargo fetch --locked

- name: Clippy ${{ matrix.adapter }} (${{ matrix.features }}) on ${{ matrix.target }}
run: cargo clippy -p edgezero-adapter-${{ matrix.adapter }} --features "${{ matrix.features }}" --target ${{ matrix.target }} --all-targets -- -D warnings
- name: Clippy ${{ matrix.adapter }} feature combinations on ${{ matrix.target }}
env:
ADAPTER: ${{ matrix.adapter }}
FEATURE_SETS: ${{ matrix.feature_sets }}
TARGET: ${{ matrix.target }}
run: |
target_args=()
if [[ "${TARGET}" != "native" ]]; then
target_args=(--target "${TARGET}")
fi

while IFS= read -r features; do
echo "==> edgezero-adapter-${ADAPTER} ${TARGET} features=[${features}]"
cargo clippy \
--package "edgezero-adapter-${ADAPTER}" \
--no-default-features \
--features "${features}" \
"${target_args[@]}" \
--all-targets \
-- \
-D warnings
done <<<"${FEATURE_SETS}"

- name: Clippy ${{ matrix.adapter }} lifecycle fixture
if: matrix.features != 'fastly cli'
run: cargo clippy --locked --manifest-path tests/fixtures/reusable-app/Cargo.toml -p fixture-${{ matrix.adapter }} --target ${{ matrix.target }} --all-targets -- -D warnings
env:
ADAPTER: ${{ matrix.adapter }}
TARGET: ${{ matrix.target }}
run: |
target_args=()
if [[ "${TARGET}" != "native" ]]; then
target_args=(--target "${TARGET}")
fi
cargo clippy --locked --manifest-path tests/fixtures/reusable-app/Cargo.toml \
-p "fixture-${ADAPTER}" "${target_args[@]}" --all-targets -- -D warnings

format-docs:
runs-on: ubuntu-latest
Expand All @@ -162,7 +204,7 @@ jobs:
- name: Retrieve Node.js version
id: node-version
working-directory: .
run: echo "node-version=$(grep '^nodejs ' .tool-versions | awk '{print $2}')" >> $GITHUB_OUTPUT
run: echo "node-version=$(grep '^nodejs ' .tool-versions | awk '{print $2}')" >> "$GITHUB_OUTPUT"
shell: bash

- name: Use Node.js
Expand All @@ -180,3 +222,10 @@ jobs:

- name: Run Prettier (check)
run: npm run format

- name: Check outbound documentation contract
working-directory: .
run: node scripts/check_outbound_docs_contract.mjs

- name: Build documentation
run: npm run build
127 changes: 111 additions & 16 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,18 @@ jobs:
- name: Set up Rust tool chain
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
components: "clippy, rustfmt"
toolchain: ${{ steps.rust-version.outputs.rust-version }}

- name: Install wasm targets for generated-project checks
if: matrix.suite == 'cli'
if: matrix.suite == 'cli' || matrix.suite == 'workspace' || matrix.suite == 'app-demo'
run: rustup target add wasm32-wasip1 wasm32-wasip2 wasm32-unknown-unknown

- name: Fetch dependencies (locked)
run: cargo fetch --locked
run: |
cargo fetch --locked
cargo fetch --locked --manifest-path examples/app-demo/Cargo.toml
cargo fetch --locked --manifest-path tests/fixtures/reusable-app/Cargo.toml

- name: No placeholder pins
if: matrix.suite == 'workspace'
Expand All @@ -65,6 +69,28 @@ jobs:
if: matrix.suite == 'workspace'
run: ./scripts/check_no_legacy_typed_reads.sh

# These roots are the active API surface. Historical design and plan
# documents under docs/superpowers intentionally remain immutable.
- name: No legacy outbound API
run: bash scripts/check_outbound_legacy_api.sh

- name: Outbound documentation contract
run: node scripts/check_outbound_docs_contract.mjs

- name: Build strict public API documentation
env:
RUSTDOCFLAGS: -D warnings
run: cargo doc --offline --locked --workspace --all-features --no-deps

- name: Brotli dependency contract
run: node scripts/check_brotli_dependency_contract.mjs

- name: Flate dependency contract
run: node scripts/check_flate_dependency_contract.mjs

- name: Serde JSON map contract
run: node scripts/check_serde_json_map_contract.mjs

- name: Nested AppConfig audit
if: matrix.suite == 'cli'
run: cargo run -q --bin check_no_nested_app_config --features nested-app-config-check -- examples/app-demo crates/edgezero-cli/src/templates
Expand All @@ -75,11 +101,9 @@ jobs:

- name: Lifecycle fixture host tests
if: matrix.suite == 'workspace'
run: >-
cargo test --locked
--manifest-path tests/fixtures/reusable-app/Cargo.toml
-p fixture-harness
-p fixture-core
run: |
cargo test --locked --manifest-path tests/fixtures/reusable-app/Cargo.toml -p fixture-harness -p fixture-core --features fixture-core/qualification
node --test scripts/qualify_response_egress.test.mjs

- name: Check Axum lifecycle fixture
if: matrix.suite == 'axum'
Expand All @@ -88,10 +112,38 @@ jobs:
--manifest-path tests/fixtures/reusable-app/Cargo.toml
-p fixture-axum

- name: Check opt-in lifecycle qualification fixtures
if: matrix.suite == 'workspace'
# These are compile-only identities, never deployed qualification evidence.
env:
EDGEZERO_QUALIFICATION_REVISION: "0000000000000000000000000000000000000000"
EDGEZERO_QUALIFICATION_ARTIFACT: "0000000000000000000000000000000000000000000000000000000000000000"
run: |
cargo check --locked --manifest-path tests/fixtures/reusable-app/Cargo.toml -p fixture-axum --features qualification
cargo check --locked --manifest-path tests/fixtures/reusable-app/Cargo.toml -p fixture-fastly --features qualification --bin fixture-fastly-qualification --target wasm32-wasip1
cargo check --locked --manifest-path tests/fixtures/reusable-app/Cargo.toml -p fixture-cloudflare --features qualification --target wasm32-unknown-unknown
cargo check --locked --manifest-path tests/fixtures/reusable-app/Cargo.toml -p fixture-spin --features qualification --target wasm32-wasip2

- name: Run workspace tests
if: matrix.suite == 'workspace'
run: cargo test --workspace --all-targets

- name: Bundled demo logging contract
if: matrix.suite == 'cli'
run: scripts/run_test_nonzero.sh demo_respects_off_without_hiding_terminal_errors cargo test --offline --locked -p edgezero-cli --features demo-example --test demo_logging

- name: Run native outbound adapter contracts
if: matrix.suite == 'workspace'
run: |
scripts/run_test_nonzero.sh batch_preflight_precedence_and_indices cargo test --offline --locked -p edgezero-adapter-axum --no-default-features --features axum,test-utils --test contract
scripts/run_test_nonzero.sh batch_preflight_precedence_and_indices cargo test --offline --locked -p edgezero-adapter-cloudflare --no-default-features --features test-utils --test contract
scripts/run_test_nonzero.sh batch_preflight_rejects_streamed_slots_without_poisoning_siblings cargo test --offline --locked -p edgezero-adapter-fastly --no-default-features --features test-utils --test contract
scripts/run_test_nonzero.sh batch_preflight_precedence_and_indices cargo test --offline --locked -p edgezero-adapter-spin --no-default-features --features test-utils --test contract

# The adapter CLI dispatch (build/deploy/stage/healthcheck/rollback) and
# its tests live behind the `cli` feature, which the unfeatured
# `cargo test --workspace` step above does not enable — so none of those
# tests compile or run there. Exercise them explicitly.
- name: Run EdgeZero CLI tests
if: matrix.suite == 'cli'
run: cargo test -p edgezero-cli --all-targets
Expand All @@ -108,13 +160,28 @@ jobs:
--no-default-features
--features cli

- name: Verify exact outbound capability matrices
if: matrix.suite == 'workspace'
run: |
scripts/run_test_nonzero.sh adapter_capability_matrix_matches_contracts cargo test --offline --locked -p edgezero-adapter-axum --no-default-features --features cli --lib adapter_capability_matrix_matches_contracts
scripts/run_test_nonzero.sh adapter_capability_matrix_matches_contracts cargo test --offline --locked -p edgezero-adapter-cloudflare --no-default-features --features cli --lib adapter_capability_matrix_matches_contracts
scripts/run_test_nonzero.sh adapter_capability_matrix_matches_contracts cargo test --offline --locked -p edgezero-adapter-fastly --no-default-features --features cli --lib adapter_capability_matrix_matches_contracts
scripts/run_test_nonzero.sh adapter_capability_matrix_matches_contracts cargo test --offline --locked -p edgezero-adapter-spin --no-default-features --features cli --lib adapter_capability_matrix_matches_contracts

- name: Check feature compilation
if: matrix.suite == 'workspace'
run: cargo check --workspace --all-targets --features "fastly cloudflare spin"

- name: Check native adapter feature matrices
if: matrix.suite == 'workspace'
run: |
for adapter in axum cloudflare fastly spin; do
bash scripts/check_adapter_feature_matrix.sh "${adapter}" native
done

- name: Verify a generated project compiles
if: matrix.suite == 'cli'
run: cargo test -p edgezero-cli --test generated_project_builds -- --ignored
run: scripts/run_test_nonzero.sh --ignored generated_workspace_compiles cargo test --offline --locked -p edgezero-cli --test generated_project_builds

- name: Run Axum host tests
if: matrix.suite == 'axum'
Expand All @@ -125,6 +192,13 @@ jobs:
working-directory: examples/app-demo
run: cargo test --locked --workspace --all-targets

- name: Check app-demo wasm targets
if: matrix.suite == 'app-demo'
working-directory: examples/app-demo
run: |
cargo check --locked -p app-demo-adapter-cloudflare --target wasm32-unknown-unknown --no-default-features --features cloudflare
cargo check --locked -p app-demo-adapter-fastly --target wasm32-wasip1 --no-default-features --features fastly
cargo check --locked -p app-demo-adapter-spin --target wasm32-wasip2 --no-default-features --features spin
cargo-test:
name: cargo test
needs: host-tests
Expand All @@ -147,14 +221,17 @@ jobs:
target: wasm32-unknown-unknown
runner_env: CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUNNER
runner_value: wasm-bindgen-test-runner
sentinel: dispatch_runs_router_and_returns_response
- adapter: fastly
target: wasm32-wasip1
runner_env: CARGO_TARGET_WASM32_WASIP1_RUNNER
runner_value: viceroy run
sentinel: dispatch_runs_router_and_returns_response
- adapter: spin
target: wasm32-wasip2
runner_env: CARGO_TARGET_WASM32_WASIP2_RUNNER
runner_value: wasmtime run
runner_value: wasmtime run -W component-model-async=y -S p3=y -S http=y
sentinel: router_dispatches_get_and_returns_response
steps:
- uses: actions/checkout@v6
with:
Expand Down Expand Up @@ -257,8 +334,8 @@ jobs:
echo "$install_dir" >> "$GITHUB_PATH"
export PATH="$install_dir:$PATH"
version="$WASMTIME_VERSION"
# Compare exact versions so a pin like `44.0.1` does not silently
# accept `wasmtime 44.0.10` from a stale cache or runner-provided
# Compare exact versions so a pin like `48.0.2` does not silently
# accept `wasmtime 48.0.20` from a stale cache or runner-provided
# binary.
actual="$(wasmtime --version 2>/dev/null | awk '{print $2}' || true)"
if [ "$actual" != "$version" ]; then
Expand All @@ -279,7 +356,25 @@ jobs:
- name: Run ${{ matrix.adapter }} wasm tests
env:
${{ matrix.runner_env }}: ${{ matrix.runner_value }}
run: cargo test -p edgezero-adapter-${{ matrix.adapter }} --features ${{ matrix.adapter }} --target ${{ matrix.target }} --test contract
run: scripts/run_test_nonzero.sh ${{ matrix.sentinel }} cargo test --offline --locked -p edgezero-adapter-${{ matrix.adapter }} --no-default-features --features ${{ matrix.adapter }},test-utils --target ${{ matrix.target }} --test contract

- name: Run Fastly closed lifecycle wasm sentinel
if: matrix.adapter == 'fastly'
env:
${{ matrix.runner_env }}: ${{ matrix.runner_value }}
run: scripts/run_test_nonzero.sh closed_lifecycle_orders_hooks_and_returns_state_after_delivery cargo test --offline --locked -p edgezero-adapter-fastly --no-default-features --features fastly,test-utils --target wasm32-wasip1 --test contract

- name: Run Spin WASI HTTP SDK resource tests
if: matrix.adapter == 'spin'
env:
${{ matrix.runner_env }}: ${{ matrix.runner_value }}
run: scripts/run_test_nonzero.sh spin_error_code_table_is_exhaustive cargo test --offline --locked -p edgezero-adapter-spin --no-default-features --features spin,test-utils --target wasm32-wasip2 --test sdk_resources

- name: Run Cloudflare outbound runtime unit tests
if: matrix.adapter == 'cloudflare'
env:
${{ matrix.runner_env }}: ${{ matrix.runner_value }}
run: scripts/run_test_nonzero.sh streamed_upload_eof_yields_before_final_precedence cargo test --offline --locked -p edgezero-adapter-cloudflare --no-default-features --features cloudflare,test-utils --target wasm32-unknown-unknown --lib

# The colocated runtime unit tests (config-store resolver, chunk
# remediation) need the `fastly` feature and only RUN under Viceroy — the
Expand All @@ -289,8 +384,11 @@ jobs:
if: matrix.adapter == 'fastly'
env:
${{ matrix.runner_env }}: ${{ matrix.runner_value }}
run: cargo test -p edgezero-adapter-fastly --features fastly --target wasm32-wasip1 --lib
working-directory: crates/edgezero-adapter-fastly
run: ../../scripts/run_test_nonzero.sh backend_creation_error_table_is_exhaustive cargo test --offline --locked --no-default-features --features fastly,test-utils --lib

- name: Check ${{ matrix.adapter }} wasm feature matrix
run: bash scripts/check_adapter_feature_matrix.sh ${{ matrix.adapter }} ${{ matrix.target }}
- name: Fastly reusable HTTP smoke
if: matrix.adapter == 'fastly'
run: ./scripts/smoke_test_reusable_app.sh --adapter fastly --suite smoke
Expand All @@ -305,9 +403,6 @@ jobs:
if-no-files-found: ignore
retention-days: 14

- name: Check ${{ matrix.adapter }} wasm target
run: cargo check -p edgezero-adapter-${{ matrix.adapter }} --features ${{ matrix.adapter }} --target ${{ matrix.target }}

- name: Check ${{ matrix.adapter }} lifecycle fixture
run: >-
cargo check --locked
Expand Down
12 changes: 3 additions & 9 deletions .tool-versions
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
fastly 15.1.0
nodejs 24.12.0
rust 1.95.0
# spin-cli is not pinned by asdf-style version managers (no
# asdf-spin plugin in widespread use). spin-sdk ~6.0 in the
# workspace imports wasi:http/types@0.3.0-rc-2026-03-15, which
# the Spin 3.6.x runtime does not provide; Spin 3.7+ is required
# for the demo's Spin adapter to boot. Install matching CLI
# manually (https://spinframework.dev/install) before running
# smoke_test_config_key_override.sh; otherwise set SKIP_SPIN=1.
viceroy 0.17.0
wasmtime 44.0.1
spin 4.1.0
viceroy 0.21.0
wasmtime 48.0.2
Loading
Loading