Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
315 commits
Select commit Hold shift + click to select a range
d2f79f2
Fix spin CI: pin wasmtime via .tool-versions + direct GitHub tarball
aram356 May 19, 2026
459eee5
Address PR review comments
aram356 May 19, 2026
fb2e816
Surface invalid handler paths via compile_error! instead of panicking
aram356 May 19, 2026
308204f
Document pub_with_shorthand with verbatim clippy diagnostic
aram356 May 19, 2026
67d0cdf
Add design spec for extensible edgezero-cli library
aram356 May 19, 2026
a78284c
Expand CLI extensions spec to cover all 7 sub-projects
aram356 May 19, 2026
f1fdbfe
Apply review feedback and add secret annotation to CLI extensions spec
aram356 May 19, 2026
2e6904b
Expand spec for multi-store manifest + finalize naming and validate s…
aram356 May 20, 2026
0c1e118
Apply second-pass review: runtime API completeness, Cloudflare KV, se…
aram356 May 20, 2026
197b4f9
Third-pass review: async ConfigStore, env overlay, extractor refactor
aram356 May 20, 2026
1b41ad7
Fourth-pass review: manifest discrimination, Hooks split, env coercio…
aram356 May 20, 2026
f0aed20
Fifth-pass review: hard cutoff, Spin as first-class store adapter, on…
aram356 May 20, 2026
27a6169
Sixth-pass review: close Spin integration design holes
aram356 May 20, 2026
fd2ef43
Seventh-pass review + dev→demo rename + documentation step
aram356 May 20, 2026
1533464
Eighth-pass review: three minor fixes (no blockers remain)
aram356 May 20, 2026
d7eff52
Ninth-pass review: three minor notes (reviewer sign-off, no blockers)
aram356 May 20, 2026
fe5dce1
Add implementation plan for CLI extensions (8-commit PR)
aram356 May 20, 2026
a542f28
Fix six plan-review findings (plan + spec)
aram356 May 20, 2026
1e6f3f3
Tighten plan: four review findings before execution
aram356 May 20, 2026
23b76ca
Plan: wire new commands into the default binary, upgrade scaffold, al…
aram356 May 20, 2026
c63dad0
Plan: fix three crate-dependency gaps for typed-config wiring
aram356 May 20, 2026
df7751e
Plan: generator context for config type name + validator workspace seed
aram356 May 20, 2026
82be804
Plan: fix generated-CLI import path + guarantee valid NameUpperCamel …
aram356 May 20, 2026
166c2df
Fixed formatting
aram356 May 20, 2026
4e814ba
Address PR review: stale scaffold deps + KV pagination scan-cap bug
aram356 May 20, 2026
1d582dd
Commit 1: extensible edgezero-cli library + generator + app-demo-cli
aram356 May 20, 2026
06f4b72
Make `demo` example-only; `serve --adapter axum` runs the axum adapter
aram356 May 20, 2026
3f6151d
Plan: mark Commit 1 done, fix stale branch/path, expand Fastly in Com…
aram356 May 20, 2026
e5a9a4f
Spec: document the namespaced args API (edgezero_cli::args::*)
aram356 May 20, 2026
8a00fe5
Address PR review: scaffold templates fail their own clippy/test gate
aram356 May 20, 2026
5d5f92d
Merge remote-tracking branch 'origin/main' into chore/strict-clippy
aram356 May 20, 2026
f6acd93
Merge remote-tracking branch 'origin/chore/strict-clippy' into featur…
aram356 May 21, 2026
247cb74
demo: run app-demo via run_app for full manifest setup
aram356 May 21, 2026
0b0c914
Plan/spec: rename "Commit N" to "Stage N"
aram356 May 21, 2026
4565b30
Formatting
aram356 May 21, 2026
6463ba1
Make demo a contributor-only command; rename feature to demo-example
aram356 May 21, 2026
8d16ba9
Fix binary name, stale dev docs, and scaffold drift
aram356 May 21, 2026
e29b749
Generate path dependencies to the local edgezero checkout
aram356 May 21, 2026
cc7ff45
Verify the full generated workspace compiles, not just the CLI crate
aram356 May 21, 2026
0c2919e
Merge remote-tracking branch 'origin/main' into chore/strict-clippy
aram356 May 21, 2026
ca357c4
Fix generated-README serve command; align plan/spec with 4-command CLI
aram356 May 21, 2026
3d1ed25
Drop redundant cfg attributes in spin KV/secret store modules
aram356 May 21, 2026
5fe5834
Merge remote-tracking branch 'origin/chore/strict-clippy' into featur…
aram356 May 21, 2026
2277072
Wire generated-project compile check into CI; fix stale plan lines
aram356 May 21, 2026
1d95345
Fix generated wasm adapters and project-name sanitisation
aram356 May 21, 2026
72ec5ee
Plan: clear stale PR #253 gating and five-built-ins references
aram356 May 21, 2026
58c8e91
Spec/plan: revise Stage 2 to the portable-manifest + EDGEZERO__ design
aram356 May 21, 2026
f5bd432
Stage 2 Task 2.1: portable manifest store schema
aram356 May 22, 2026
46248f9
Stage 2 Task 2.2: EDGEZERO__* environment-config layer
aram356 May 22, 2026
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
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
13 changes: 10 additions & 3 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 @@ -114,7 +114,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 @@ -144,7 +144,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 +162,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
60 changes: 53 additions & 7 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,13 @@ 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
Expand All @@ -55,6 +56,14 @@ jobs:
- 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: 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 +77,32 @@ jobs:
- name: Run workspace tests
run: cargo test --workspace --all-targets

- name: Run native outbound adapter contracts
run: |
scripts/run_test_nonzero.sh send_all_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 send_all_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 send_all_dispatches_every_slot_before_wait cargo test --offline --locked -p edgezero-adapter-fastly --no-default-features --features test-utils --test contract
scripts/run_test_nonzero.sh send_all_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: 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 +124,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 +142,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 +172,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 @@ -235,7 +268,19 @@ 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 outbound concurrency wasm sentinel
if: matrix.adapter == 'fastly'
env:
${{ matrix.runner_env }}: ${{ matrix.runner_value }}
run: scripts/run_test_nonzero.sh send_all_dispatches_every_slot_before_wait 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

# The colocated runtime unit tests (config-store resolver, chunk
# remediation) need the `fastly` feature and only RUN under Viceroy — the
Expand All @@ -245,7 +290,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 }}
run: cargo check --offline --locked -p edgezero-adapter-${{ matrix.adapter }} --no-default-features --features ${{ matrix.adapter }} --target ${{ matrix.target }}
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
29 changes: 19 additions & 10 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading