Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
364 commits
Select commit Hold shift + click to select a range
6a64847
Stage 2 Tasks 2.3 + 2.4: bake portable stores into Hooks; drop manife…
aram356 May 23, 2026
82ee8d3
Stage 2 Task 2.5: async ConfigStore, new KvError variants, store regi…
aram356 May 23, 2026
34c9722
Stage 2 Task 2.6 (partial): axum store registries; Spin KV uses new e…
aram356 May 23, 2026
d21db4d
Stage 2 Task 2.6 (partial): fastly store registries
aram356 May 23, 2026
6850aa0
Stage 2 Task 2.6 (partial): spin store registries + paginated list_ke…
aram356 May 23, 2026
f817bcc
Stage 2 Task 2.6 (partial): cloudflare store registries; CloudflareCo…
aram356 May 23, 2026
f76c18a
Stage 2 Task 2.6 (final): axum end-to-end registry dispatch tests
aram356 May 23, 2026
b6f892f
Stage 2 Task 2.7: Kv/Secrets/Config extractors switch to default()/na…
aram356 May 23, 2026
30a68b7
Stage 2 Tasks 2.8 + 2.9: docs migration + Stage 2 ship gate
aram356 May 23, 2026
2c1c54f
Address Stage 2 review: provision app-demo platform bindings; trim de…
aram356 May 24, 2026
893d961
Address Stage 2 follow-up review: explicit-env manifest typos, cloudf…
aram356 May 24, 2026
73d4d61
Refresh edgezero-cli README and scaffold README to match Stage 1 surface
aram356 May 24, 2026
b32f4ff
Address Stage 1 docs review: README feature flags, library API sample…
aram356 May 24, 2026
4c9c645
Spin config dotted-key translation; exclude internal specs from ViteP…
aram356 May 24, 2026
4717cbd
Address Stage 2 review: config registry handler path, axum local-file…
aram356 May 25, 2026
667097c
Address Stage 2 review: unify axum bind contracts, seed local-config …
aram356 May 25, 2026
8942ec2
Address Stage 2 review: spin component field, bind-vs-env precedence,…
aram356 May 26, 2026
b58d072
Refresh stale Stage 2 docs: adapter entrypoints, plan status, Manifes…
aram356 May 26, 2026
95f931d
Refresh plan's Codebase Facts block for post-Stage-2 substrate
aram356 May 26, 2026
1de4b64
App-config schema, #[derive(AppConfig)] macro, env-overlay loader
aram356 May 26, 2026
8a52391
Address Stage 3 review: container rename_all, non-table config, AppCo…
aram356 May 26, 2026
14e36c2
Address Stage 3 review: reject #[serde(skip_serializing_if)] on #[sec…
aram356 May 26, 2026
719f08d
config validate command (raw + typed)
aram356 May 26, 2026
66a89cc
Address Stage 4 review: Spin selector, store_ref collision, app-demo …
aram356 May 26, 2026
b917723
Address Stage 4 review: wire #[validate(nested)] through app-demo + s…
aram356 May 26, 2026
0774256
Drop the [config] wrapper: <name>.toml IS the typed struct
aram356 May 26, 2026
22b41fb
Dispatch adapter-specific validation via an AdapterCheck trait
aram356 May 27, 2026
ef3f14d
Stage 4 review followups: scaffold-test parse, KV docs, env-segment e…
aram356 May 27, 2026
8d8074f
auth command (adapter-trait dispatch, no hardcoded table)
aram356 May 27, 2026
94a0191
Hoist run_native to cli_support + sweep stale CommandRunner refs
aram356 May 27, 2026
d3ec92d
config validate via Adapter trait — adapters own their own rules
aram356 May 27, 2026
9a0369b
Stage 6.1: provision dispatch via Adapter trait + axum impl
aram356 May 27, 2026
d905e42
Stage 6.2: cloudflare provision (wrangler shell-out + wrangler.toml w…
aram356 May 27, 2026
79a54b6
Stage 6.3: fastly provision (fastly CLI shell-out + fastly.toml write…
aram356 May 27, 2026
0933440
Stage 6.4: spin provision (pure spin.toml editing, no shell-out)
aram356 May 27, 2026
bc0a705
Stage 7.1: config push command (trait + axum impl + CLI raw/typed)
aram356 May 27, 2026
74d596a
Stage 7.2: cloudflare config push (wrangler kv bulk put)
aram356 May 27, 2026
d852f3f
Stage 7.3: fastly config push (config-store-entry create per key)
aram356 May 27, 2026
57c7eb3
Stage 7.4: spin config push (pure spin.toml editing, two tables)
aram356 May 27, 2026
3d3f87c
Stage 8.1: app-demo spin.toml — declare manual secret variables
aram356 May 27, 2026
9fdd1f4
Stage 8.2: app-demo integration tests for the typed CLI flow
aram356 May 27, 2026
26fddcc
Stage 8.3: app-demo handlers exercise Kv::named (sessions + cache)
aram356 May 27, 2026
723dafe
Refresh plan status to reflect Stages 6/7/8 progress
aram356 May 27, 2026
a4f7c81
Stage 8.4: generator cli template emits the full 7-command surface
aram356 May 28, 2026
45aef3d
Stage 8.5: app-demo e2e push→AxumConfigStore→handler roundtrip test
aram356 May 28, 2026
7d01061
Stage 8.6: CI wires app-demo workspace into tests + fmt + clippy
aram356 May 28, 2026
a3b7a89
Stage 8.7: cli-walkthrough.md + docs audit + sidebar + build fix
aram356 May 28, 2026
55fe91b
Stage 9.1 (review fix): run_config_push* runs the strict preflight
aram356 May 28, 2026
b531f5a
Stage 9.2 (review fix): Spin secret-value validation mirrors runtime …
aram356 May 28, 2026
2cc85d1
Stage 9.3 (review fix): enforce runtime store-API hard-cutoff
aram356 May 28, 2026
6592918
Stage 9.4 (review fix): assert Spin dry-run preview content (translat…
aram356 May 28, 2026
8ad9040
Stage 9.5 (review fix): refresh PR template, run_tests.sh, migration …
aram356 May 28, 2026
b1b5dca
Stage 10.1 (review fix): full runtime store-API hard-cutoff
aram356 May 28, 2026
6876578
Stage 10.2 (review fix): docs / plan / CLAUDE.md align with hard-cutoff
aram356 May 28, 2026
fd69b49
Scrub stage/task/phase/section refs from source comments
aram356 May 28, 2026
6f067a2
Harden fastly cli: schema-drift detection + partial-fail tracking
aram356 May 28, 2026
a96cf68
Harden cloudflare cli: idempotent provision + lenient push dry-run
aram356 May 28, 2026
65794b3
Spin cli UX polish: per-mode key diagnostics + table migration hint
aram356 May 28, 2026
4e7f014
Doc polish: AuthArgs no-Default rationale + axum from_path JSON shape
aram356 May 28, 2026
56cbf08
Add precedence test for synthesised one-id store registry
aram356 May 28, 2026
b4c5da3
Close remaining L2/L4/L5/L6 self-review followups
aram356 May 28, 2026
fe79025
Close deep-review findings: scaffold + spin inline + fastly half-setu…
aram356 May 28, 2026
6a5d89e
Close all remaining deep-review findings (cloudflare/fastly/spin/scaf…
aram356 May 29, 2026
6274a3f
Close provision capability gap: enforce Single-store on the operator-…
aram356 May 29, 2026
2a3ad63
Fix env precedence + drop axum legacy EDGEZERO_HOST shim
aram356 May 29, 2026
5cc742b
Fix env-overlay prefix shown in scaffold templates + app-demo comments
aram356 May 29, 2026
cea89ed
Close all multi-review findings: platform-name flow + hard-cutoff + t…
aram356 May 29, 2026
9d31015
Hard-cutoff pass: empty-name guard + drop EDGEZERO_KV defaults + Serv…
aram356 May 30, 2026
05f052e
Extract test-fixture consts in cloudflare/fastly/spin cli.rs test mods
aram356 May 30, 2026
684c5f2
Don't log adapter passthrough args — can carry deploy secrets
aram356 May 30, 2026
f2ad3f0
clippy --fix auto-applied for wasm32 adapter targets
aram356 May 30, 2026
83ca833
Make fastly contract test pass wasm32-wasip1 clippy
aram356 May 30, 2026
9c5d77b
Add per-target clippy matrix for adapter wasm builds
aram356 May 30, 2026
49d1d70
Move adapter wasm clippy matrix from test.yml to format.yml
aram356 May 30, 2026
d5d92f7
wasm32 clippy: clean cloudflare context.rs and secret_store.rs
aram356 May 30, 2026
969dd2a
wasm32 clippy: clean cloudflare response.rs and proxy.rs
aram356 May 30, 2026
7da3dc1
wasm32 clippy: clean cloudflare config_store.rs
aram356 May 30, 2026
04aa617
wasm32 clippy: clean cloudflare key_value_store.rs
aram356 May 30, 2026
564a0a8
wasm32 clippy: clean cloudflare lib.rs and request.rs
aram356 May 30, 2026
7eca8cd
wasm32 clippy: clean cloudflare contract.rs
aram356 May 30, 2026
b83d06c
wasm32 clippy: clean spin response/secret/config small files
aram356 May 30, 2026
a432c1e
wasm32 clippy: clean spin lib.rs and key_value_store.rs
aram356 May 30, 2026
3d808ab
wasm32 clippy: clean spin proxy.rs and request.rs
aram356 May 30, 2026
483a8a7
wasm32 clippy: clean spin contract.rs
aram356 May 30, 2026
1438972
Address remaining PR #257 review feedback
aram356 May 31, 2026
487ac5f
Upgrade Spin adapter to spin-sdk 6.0 (WASI Preview 2)
aram356 May 31, 2026
16898f8
Close PR #257 self-review followups: store id validation + docs lint
aram356 May 31, 2026
611064e
Merge origin/chore/strict-clippy into feature/extensible-cli
aram356 May 31, 2026
910739d
Pass strict clippy on wasm32 adapter targets
aram356 Jun 1, 2026
4928cdc
Close PR #257 self-review followups: store id validation + docs lint
aram356 Jun 2, 2026
990feb8
Print log when validating config
aram356 Jun 2, 2026
c61670f
Skip Fastly logger init when no endpoint is configured
aram356 Jun 2, 2026
b4c80e9
Add config push --local for fastly + cloudflare; delegate for spin/axum
aram356 Jun 2, 2026
7655955
Spin config store: switch from variables to KV backend
aram356 Jun 3, 2026
cef8e80
Spin seed handler + run_app_with_seeder for `config push --local`
aram356 Jun 3, 2026
42fed2b
config push: HTTP POST to seed handler for spin; AdapterPushContext
aram356 Jun 4, 2026
dc4ab33
Spin KV-config Stage 5: provision writes config labels to key_value_s…
aram356 Jun 4, 2026
5873523
Spin KV-config Stage 6: drop Spin's variable-name validator
aram356 Jun 4, 2026
048b6cb
Spin KV-config Stage 7: docs + app-demo migration
aram356 Jun 4, 2026
4353a1c
Spin KV-config Stage 8: runtime-config.toml scaffold + plan/spec clos…
aram356 Jun 4, 2026
b3da439
spin: PR-thread review fixes + per-backend-push plan
aram356 Jun 5, 2026
e788714
Address June-02 PR #257 review feedback
aram356 Jun 5, 2026
fc41491
spin: drop /__edgezero/config/seed handler (architecture pivot)
aram356 Jun 5, 2026
d4e392e
spin: per-backend writers (SQLite-direct + Fermyon Cloud shellout)
aram356 Jun 5, 2026
0be7444
spin: address review findings on per-backend dispatcher
aram356 Jun 5, 2026
7dd6ab6
spin: fix `spin cloud key-value set` shape + non-default-label gate +…
aram356 Jun 5, 2026
762c426
spin: fix parallel-test env race, switch cloud push to --app + --labe…
aram356 Jun 5, 2026
af47a2b
spin: fix `link key-value` hint shape; scaffold doc; hermetic mock-sp…
aram356 Jun 5, 2026
1b7342f
Merge origin/chore/strict-clippy into feature/extensible-cli
aram356 Jun 6, 2026
0807767
spin: race-free push tests, defer runtime-config parse for cloud, doc…
aram356 Jun 6, 2026
f1179df
scaffold/cloud-dryrun/docs: fix CF template, validate cloud --dry-run…
aram356 Jun 6, 2026
62f07ef
spin/docs: partial-failure cloud-push diagnostic + 3 stale-doc fixes
aram356 Jun 6, 2026
f374351
spin: silence strict-clippy on cloud partial-failure diagnostic
aram356 Jun 7, 2026
0f2f6df
docs: prettier-format cli-walkthrough Spin config-push bullets
aram356 Jun 7, 2026
b9ae439
docs: outbound HTTP design spec (midbid driver)
aram356 Jun 8, 2026
b09f6a8
docs: scrub consumer-specific terminology from outbound HTTP spec
aram356 Jun 8, 2026
647489a
docs: Fastly SDK correctness pass (round 50)
aram356 Jun 8, 2026
8df9d80
docs: round-50 carry-overs and Spin WASI-write mechanics (round 51)
aram356 Jun 8, 2026
cd3d3a7
Merge remote-tracking branch 'origin/main' into docs/outbound-http-spec
aram356 Jul 2, 2026
d5d7e33
docs: close three completeness gaps in outbound-http spec
aram356 Jul 2, 2026
696c726
docs: close remaining completeness gaps in outbound-http spec
aram356 Jul 2, 2026
c14f0a5
docs: self-review fixes to outbound-http spec additions
aram356 Jul 2, 2026
5345fe9
Merge remote-tracking branch 'origin/main' into docs/outbound-http-spec
aram356 Jul 10, 2026
fc21727
Merge branch 'main' into docs/outbound-http-spec
aram356 Jul 12, 2026
be9d650
docs: outbound-http spec amendments + implementation decisions regist…
aram356 Jul 14, 2026
fe75900
Merge remote-tracking branch 'origin/docs/outbound-http-spec' into do…
aram356 Jul 14, 2026
170c406
docs: compile-verified fixes to outbound-http spec (skeleton-adjudica…
aram356 Jul 15, 2026
0f8e09e
docs: resolve four outbound-http policy decisions + CLI-gate skeleton
aram356 Jul 15, 2026
341d042
docs: fix verification-review findings (gate-class propagation + stal…
aram356 Jul 16, 2026
970f1f6
docs: Phase 1a implementation plan (EdgeError 502/504 + time.rs primi…
aram356 Jul 16, 2026
b8fca01
fix: review findings in Phase 1a plan + spec pseudocode contradictions
aram356 Jul 16, 2026
de45a24
fix: strict-clippy contract, shared trait-default static, Fastly erro…
aram356 Jul 17, 2026
f1f204d
fix: strict-lint gate (compile-verified), capability schema, Fastly e…
aram356 Jul 17, 2026
6a9d419
fix: remaining review findings (fail-open gate, CLI/Fastly seams, lin…
aram356 Jul 17, 2026
1c1c1c9
fix: review findings (lifetime bug, StoredError, Fastly cache bound) …
aram356 Jul 17, 2026
e635add
fix(plan): rustfmt-canonical test snippets; spec appendix from_hours …
aram356 Jul 18, 2026
adeb1bb
fix(spec): repair rustdoc damaged by the over-aggressive comment cleanup
aram356 Jul 18, 2026
6597539
fix(spec): baked-manifest fail-open, Fastly bucket overshoot, nonexis…
aram356 Jul 18, 2026
ac5e11b
fix(spec): Spin early-response race (H3) + run_demo seam, ManifestCon…
aram356 Jul 18, 2026
b078324
fix: revert wrong Fastly cache model (session-scoped, not cross-reque…
aram356 Jul 19, 2026
649d789
fix: Cloudflare abort, Spin error map, Fastly Tier2 seam, capability …
aram356 Jul 19, 2026
579fe56
fix: Fastly cache Send+Sync (Mutex, not RefCell), capability deny_unk…
aram356 Jul 19, 2026
ff6b4ba
fix: adapter design findings (Axum decode, CF/Spin cancellation, capa…
aram356 Jul 19, 2026
1358d3f
Merge branch 'main' into docs/outbound-http-spec
aram356 Aug 7, 2026
b8060a0
Merge branch 'main' into docs/outbound-http-spec
aram356 Aug 7, 2026
e2a011e
Merge branch 'main' into docs/outbound-http-spec
aram356 Aug 10, 2026
d64ba83
Merge remote-tracking branch 'origin/main' into docs/outbound-http-spec
aram356 Aug 18, 2026
3788f04
docs(outbound-http): resolve review round + fix spec conventions
aram356 Aug 28, 2026
5a50d57
docs(outbound-http): tighten design and phase 1a plan
aram356 Sep 3, 2026
0b710f0
Merge remote-tracking branch 'origin/main' into docs/outbound-http-spec
aram356 Sep 3, 2026
3d3d48d
docs(inbound-body): document memory and extractor limits
aram356 Sep 3, 2026
dfda040
docs(outbound-http): resolve deep review findings
aram356 Sep 4, 2026
fcefdde
Merge branch 'main' into docs/outbound-http-spec
aram356 Sep 6, 2026
668e094
docs: finalize outbound HTTP design and phase 1a plan
aram356 Sep 7, 2026
f5aa778
feat(core): add typed gateway errors
aram356 Sep 7, 2026
c110313
feat(core): add time module (Deadline + budget constants)
aram356 Sep 7, 2026
acb6e63
docs: add outbound HTTP implementation plans
aram356 Sep 7, 2026
12965da
docs: harden outbound HTTP design and plans
aram356 Sep 8, 2026
645dc39
docs(outbound): close lifecycle contract gaps
aram356 Sep 9, 2026
67747e0
feat(core): implement outbound HTTP contracts
aram356 Sep 9, 2026
5cf9f26
feat(axum): implement outbound HTTP contracts
aram356 Sep 9, 2026
b1ccf02
feat(core): add outbound capability manifest schema
aram356 Sep 9, 2026
fbb5509
feat(cloudflare): implement outbound capability contracts
aram356 Sep 9, 2026
1f694fb
feat(cli): enforce outbound capabilities
aram356 Sep 9, 2026
9974696
fix(cli): pin capability-checked runtime targets
aram356 Sep 9, 2026
d5fe880
test(spin): execute WASI HTTP SDK resources
aram356 Sep 9, 2026
9e4513a
feat(spin): implement outbound HTTP contracts
aram356 Sep 9, 2026
e423276
feat(fastly): implement outbound HTTP contracts
aram356 Sep 9, 2026
647b543
feat(spin): publish outbound capability levels
aram356 Sep 9, 2026
7852878
feat(scaffold): generate outbound HTTP clients
aram356 Sep 9, 2026
7a68534
refactor(app-demo): migrate to outbound HTTP API
aram356 Sep 9, 2026
f5be49c
fix(adapters): bound response stream conversion
aram356 Sep 9, 2026
1476b60
refactor(core): remove legacy proxy API
aram356 Sep 9, 2026
235612b
fix(outbound): preserve adapter response marker
aram356 Sep 9, 2026
3e66506
docs: publish outbound HTTP and capabilities guide
aram356 Sep 9, 2026
2905f74
ci: enforce outbound HTTP completion matrix
aram356 Sep 9, 2026
0bbdffd
feat(core): add ingress admission contract
aram356 Sep 9, 2026
5a14d69
feat(core): bound ingress config extraction
aram356 Sep 9, 2026
9272898
feat: address outbound lifecycle requirements
aram356 Sep 10, 2026
13f701b
fix(ci): cover target-specific adapter builds
aram356 Sep 10, 2026
66a5427
fix(ci): lint app-demo compatibility fixtures
aram356 Sep 10, 2026
e72620d
fix(ci): exercise lazy request contracts
aram356 Sep 10, 2026
474f723
fix(scaffold): propagate request reconstruction errors
aram356 Sep 10, 2026
8266096
fix(outbound): harden lifecycle contracts
aram356 Sep 10, 2026
b5ca169
fix(ci): gate adapter test helpers
aram356 Sep 10, 2026
f59edc4
docs: record outbound hardening verification
aram356 Sep 10, 2026
24300b1
feat: align demo and generated lifecycle policies
aram356 Sep 10, 2026
59bc290
ci: install generator verification components
aram356 Sep 10, 2026
9a4c930
docs: close demo generator alignment plan
aram356 Sep 10, 2026
124236c
feat(ingress): bound fallback request bodies
aram356 Sep 10, 2026
75d342a
fix(outbound): harden adapter lifecycle semantics
aram356 Sep 11, 2026
51e90ca
feat(ingress): transfer fallback grants and responses
aram356 Sep 11, 2026
fdda8a5
feat(ingress): align axum fallback lifecycle
aram356 Sep 11, 2026
324420b
test(cli): pin fallback response mappings
aram356 Sep 11, 2026
ffb0693
test(ingress): harden fallback lifecycle coverage
aram356 Sep 11, 2026
5028151
test(ingress): cover edge adapter fallback lifecycle
aram356 Sep 11, 2026
a3c7795
feat(outbound): inject application clocks into adapters
aram356 Sep 11, 2026
ce66f19
fix(outbound): harden injected clock boundaries
aram356 Sep 11, 2026
1349291
refactor(ingress): share adapter fallback dispatch paths
aram356 Sep 11, 2026
12bb76b
fix(adapters): close ingress and clock review gaps
aram356 Sep 11, 2026
f3fe8da
fix(cloudflare): preserve authoritative response headers
aram356 Sep 11, 2026
bc6f5c8
fix(outbound): close final review gaps
aram356 Sep 11, 2026
6feeae4
fix(ci): gate Cloudflare helper import
aram356 Sep 11, 2026
6c3e105
fix(outbound): align adapter runtime contracts
aram356 Sep 11, 2026
e88fd03
refactor(cfg): audit adapter feature boundaries
aram356 Sep 12, 2026
120dd2a
fix(ci): scope Fastly lint expectations
aram356 Sep 12, 2026
c5541a4
fix(ingress): enforce Spin pending read deadlines
aram356 Sep 12, 2026
7825556
docs(capabilities): publish config support matrix
aram356 Sep 12, 2026
e0f741e
feat: complete outbound HTTP and response lifecycle support
aram356 Sep 14, 2026
8155b06
fix: restore outbound provider CI contracts
aram356 Sep 14, 2026
b1024cc
fix: harden outbound lifecycle contracts
aram356 Sep 14, 2026
7717826
fix: restore Cloudflare wasm lint gate
aram356 Sep 14, 2026
609f16a
fix(outbound): close final lifecycle review gaps
aram356 Sep 15, 2026
24100dd
fix(ci): fetch demo dependencies before offline audit
aram356 Sep 15, 2026
61457d7
feat(outbound): add completion-driven batch control
aram356 Sep 15, 2026
cdaefb7
fix(outbound): type batch termination
aram356 Sep 16, 2026
f530797
fix(ci): avoid indexed cutoff assertions
aram356 Sep 16, 2026
1d47bc0
docs(outbound): close batch termination plan
aram356 Sep 16, 2026
57a8fcb
fix(outbound): preserve batch driver failures
aram356 Sep 17, 2026
3d87d5b
docs(plan): complete batch driver failure delivery
aram356 Sep 17, 2026
98a1b87
fix(outbound): harden batch and Fastly egress contracts
aram356 Sep 17, 2026
543b782
fix(outbound): preserve early Fastly batch timeouts
aram356 Sep 17, 2026
5eccff8
fix(fastly): satisfy CLI item ordering
aram356 Sep 18, 2026
fc8d7e9
docs(outbound): clarify batch cancellation lifecycle
aram356 Sep 18, 2026
4790a14
docs(outbound): deduplicate budget source contract
aram356 Sep 18, 2026
3142ae0
docs: design response completion and ingress abort
aram356 Sep 19, 2026
a4ef2d4
feat(core): add response-scoped egress completion
aram356 Sep 19, 2026
760cc4e
feat(core): carry completion through ingress admission
aram356 Sep 19, 2026
a641094
feat(axum): abort rejected ingress at connection boundary
aram356 Sep 19, 2026
18bdb38
feat(adapters): propagate ingress abort without a response
aram356 Sep 19, 2026
0bc4c6c
feat(app): make application assembly fallible
aram356 Sep 19, 2026
9b31515
docs: align consumers with ingress lifecycle hard cut
aram356 Sep 19, 2026
059ec71
test: close lifecycle hard-cut coverage
aram356 Sep 19, 2026
351698c
docs: complete lifecycle implementation plan
aram356 Sep 19, 2026
03cdba9
feat(core): harden lifecycle and bounded reads
aram356 Sep 20, 2026
ac69b35
feat(core): allow detached ingress abort decisions
aram356 Sep 20, 2026
90bfdeb
Merge origin/main into docs/outbound-http-spec
aram356 Sep 20, 2026
1e7e056
docs(plan): record detached ingress verification
aram356 Sep 20, 2026
23a1eb2
docs: define response egress composition and deadlines
aram356 Sep 20, 2026
38f61a1
feat(core): compose response egress completions
aram356 Sep 20, 2026
ce61f92
feat(core): require detached response deadlines
aram356 Sep 20, 2026
db3e3d9
test(adapters): migrate detached egress deadlines
aram356 Sep 20, 2026
66adc87
feat: align detached response egress examples
aram356 Sep 20, 2026
4e0d574
fix: align generated response lifecycle
aram356 Sep 20, 2026
9ca2530
fix: harden response egress legacy scan
aram356 Sep 20, 2026
e846a07
docs(plan): record response egress verification
aram356 Sep 20, 2026
0d84247
ci: consolidate adapter clippy checks
aram356 Sep 20, 2026
46f8595
feat(core): add response-relative egress deadlines
aram356 Sep 21, 2026
325134e
fix(core): preserve framework error response contracts
aram356 Sep 24, 2026
6904869
fix(core): preserve mandatory error headers
aram356 Sep 24, 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
73 changes: 57 additions & 16 deletions .github/workflows/format.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,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 @@ -75,28 +75,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

Expand All @@ -114,7 +127,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 @@ -124,13 +137,34 @@ 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}"

format-docs:
runs-on: ubuntu-latest
Expand All @@ -144,7 +178,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 @@ -162,3 +196,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
90 changes: 79 additions & 11 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,26 +35,45 @@ 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
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
components: "clippy, rustfmt"
toolchain: ${{ steps.rust-version.outputs.rust-version }}

- name: Add wasm targets
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

- name: No placeholder pins
run: ./scripts/check_no_placeholder_pins.sh

- name: No legacy typed reads
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: Nested AppConfig audit
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 @@ -68,18 +87,38 @@ jobs:
- name: Run workspace tests
run: cargo test --workspace --all-targets

- name: Run native outbound adapter contracts
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: Adapter CLI dispatch tests
run: cargo test -p edgezero-adapter-fastly --all-targets --features cli

- name: Verify exact outbound capability matrices
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
run: cargo check --workspace --all-targets --features "fastly cloudflare spin"

- name: Check native adapter feature matrices
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
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

# `examples/app-demo` is excluded from the root workspace, so
# `cargo test --workspace` above does not cover it. Run its own
Expand All @@ -101,6 +140,13 @@ jobs:
working-directory: examples/app-demo
run: cargo test --locked --workspace --all-targets

- name: Check app-demo wasm targets
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

adapter-wasm-tests:
name: ${{ matrix.adapter }} wasm tests
runs-on: ubuntu-latest
Expand All @@ -112,14 +158,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

Expand All @@ -139,7 +188,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 Down Expand Up @@ -213,8 +262,8 @@ jobs:
echo "$install_dir" >> "$GITHUB_PATH"
export PATH="$install_dir:$PATH"
version="${{ steps.wasmtime-version.outputs.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 @@ -235,7 +284,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 @@ -245,7 +312,8 @@ 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 target
run: cargo check -p edgezero-adapter-${{ matrix.adapter }} --features ${{ matrix.adapter }} --target ${{ matrix.target }}
- name: Check ${{ matrix.adapter }} wasm feature matrix
run: bash scripts/check_adapter_feature_matrix.sh ${{ matrix.adapter }} ${{ matrix.target }}
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
14 changes: 8 additions & 6 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ CI workflows under `.github/workflows/`.

```
crates/
edgezero-core/ # Core: routing, extractors, middleware, proxy, body, errors
edgezero-core/ # Core: routing, extractors, middleware, outbound HTTP, body, errors
edgezero-macros/ # Proc macros: #[action], #[app]
edgezero-adapter/ # Adapter registry and traits
edgezero-adapter-fastly/ # Fastly Compute bridge (wasm32-wasip1)
Expand Down Expand Up @@ -134,11 +134,13 @@ impl Middleware for MyMiddleware {
}
```

### Proxy
### Outbound HTTP

Use `ProxyService` with adapter-specific clients (`FastlyProxyClient`,
`CloudflareProxyClient`, `SpinProxyClient`). Keep proxy logic provider-agnostic
in core.
Handlers obtain `HttpClient` from `RequestContext::http_client()`, construct
`OutboundRequest` values, and consume `OutboundResponse` or per-slot
`OutboundSlotResult` outcomes. Keep provider transport logic in adapter-specific
`*OutboundClient` implementations and use the capability matrix for behavioral
differences.

### Logging

Expand Down Expand Up @@ -168,7 +170,7 @@ Each adapter follows the same structure:
- `context.rs` — platform-specific request context
- `request.rs` — platform request → core request conversion
- `response.rs` — core response → platform response conversion
- `proxy.rs` — platform-specific proxy client
- `outbound.rs` — platform-specific outbound HTTP client
- `logger.rs` — platform-specific logging init
- `cli.rs` — adapter dispatch behind the `cli` feature: `build` / `deploy` / `serve` (legacy) plus `Adapter::execute` for `auth` (login/logout/status) and dedicated trait methods `provision` (Stage 6 — platform-resource creation) and `push_config_entries` (Stage 7 — `config push` writeback). Self-registers via `#[ctor]` into the `edgezero-adapter` registry.

Expand Down
Loading
Loading