extract palisade — shared trust-boundary primitives #3277

Merged
mfreeman451 merged 2 commits from carverauto/extract-palisade into staging 2026-05-12 17:49:15 +00:00
Owner

Summary

Extracts shared trust-boundary primitives into a new
`elixir/palisade/` sub-project, plus wires the CI quality gate
and a publish-on-tag workflow.

What lands

`elixir/palisade/` — new sub-project

Apache-2.0 licensed. Houses the modules that CRM and
ServiceRadar previously kept as drifting verbatim copies:

  • `Palisade.NetworkAddressPolicy` — IPv4/IPv6 CIDR rejection
    (loopback, link-local, ULA, private). DNS-resolution-aware
    (defeats DNS rebinding).
  • `Palisade.OutboundURLPolicy` — HTTPS-only + public-host
    validator.
  • `Palisade.OutboundFetch` — HTTP fetch helper binding to the
    resolved IP, with TLS hostname verification + Host: header
    on the original hostname.

36 ExUnit cases ported (with module renames) from the previous
`serviceradar_core/lib/serviceradar/policies/` test surface +
the `web-ng`'s `outbound_fetch.ex` test.

CI

  • `.forgejo/workflows/elixir-quality.yml` — palisade joins the
    existing matrix-driven Elixir Quality gate (format / compile
    / test / credo on every PR + push).
  • `.forgejo/workflows/palisade-publish.yml` — new workflow on
    `palisade-v*` tag pushes. Verifies tag matches `@version`,
    runs the quality gate, then `mix hex.publish package --repo
    carverauto --yes` against https://hex.carverauto.dev.
    Requires `HEX_API_KEY` secret on the runner.

Consumer model

  • ServiceRadar's own Elixir apps (web-ng, serviceradar_core,
    etc.) will consume via `{:palisade, path: "../palisade"}` —
    same sibling-path pattern already used for serviceradar_srql,
    connection, elixir_uuid.
  • External consumers (CRM is the first) consume via the
    public CarverAutomation hex registry:
    `{:palisade, "~> 0.1", repo: "carverauto"}` after
    `mix hex.repo add carverauto https://hex.carverauto.dev`.

Out of scope (separate tracks)

  • Future palisade versions porting the OIDC client + ConfigCache
    • SAML primitives from `web-ng/lib/.../auth/`.
  • ServiceRadar's own apps swapping their local copies in
    `serviceradar_core/lib/serviceradar/policies/` and
    `web-ng/lib/.../auth/{outbound_fetch,outbound_url_policy}.ex`
    for the new package. Filed as a follow-up issue.

Test plan

  • palisade `mix format / compile --warnings-as-errors / test`
    under the matrix gate (will run on this PR).
  • palisade-publish.yml syntactically valid (lints in the
    workflow editor).
  • hex.carverauto.dev: bring registry online + set
    HEX_API_KEY secret (in-flight in a separate session).
  • Once the registry is up: cut `palisade-v0.1.0` tag, watch
    publish workflow, verify CRM PR #179's
    `{:palisade, "~> 0.1", repo: "carverauto"}` resolves.
## Summary Extracts shared trust-boundary primitives into a new \`elixir/palisade/\` sub-project, plus wires the CI quality gate and a publish-on-tag workflow. ## What lands ### \`elixir/palisade/\` — new sub-project Apache-2.0 licensed. Houses the modules that CRM and ServiceRadar previously kept as drifting verbatim copies: - \`Palisade.NetworkAddressPolicy\` — IPv4/IPv6 CIDR rejection (loopback, link-local, ULA, private). DNS-resolution-aware (defeats DNS rebinding). - \`Palisade.OutboundURLPolicy\` — HTTPS-only + public-host validator. - \`Palisade.OutboundFetch\` — HTTP fetch helper binding to the resolved IP, with TLS hostname verification + Host: header on the original hostname. 36 ExUnit cases ported (with module renames) from the previous \`serviceradar_core/lib/serviceradar/policies/\` test surface + the \`web-ng\`'s \`outbound_fetch.ex\` test. ### CI - \`.forgejo/workflows/elixir-quality.yml\` — palisade joins the existing matrix-driven Elixir Quality gate (format / compile / test / credo on every PR + push). - \`.forgejo/workflows/palisade-publish.yml\` — new workflow on \`palisade-v*\` tag pushes. Verifies tag matches \`@version\`, runs the quality gate, then \`mix hex.publish package --repo carverauto --yes\` against https://hex.carverauto.dev. Requires \`HEX_API_KEY\` secret on the runner. ## Consumer model - **ServiceRadar's own Elixir apps** (web-ng, serviceradar_core, etc.) will consume via \`{:palisade, path: \"../palisade\"}\` — same sibling-path pattern already used for serviceradar_srql, connection, elixir_uuid. - **External consumers** (CRM is the first) consume via the public CarverAutomation hex registry: \`{:palisade, \"~> 0.1\", repo: \"carverauto\"}\` after \`mix hex.repo add carverauto https://hex.carverauto.dev\`. ## Out of scope (separate tracks) - Future palisade versions porting the OIDC client + ConfigCache + SAML primitives from \`web-ng/lib/.../auth/\`. - ServiceRadar's own apps swapping their local copies in \`serviceradar_core/lib/serviceradar/policies/\` and \`web-ng/lib/.../auth/{outbound_fetch,outbound_url_policy}.ex\` for the new package. Filed as a follow-up issue. ## Test plan - [x] palisade \`mix format / compile --warnings-as-errors / test\` under the matrix gate (will run on this PR). - [x] palisade-publish.yml syntactically valid (lints in the workflow editor). - [ ] hex.carverauto.dev: bring registry online + set HEX_API_KEY secret (in-flight in a separate session). - [ ] Once the registry is up: cut \`palisade-v0.1.0\` tag, watch publish workflow, verify CRM PR #179's \`{:palisade, "~> 0.1", repo: "carverauto"}\` resolves.
spec: start agent-routed remote access integration
All checks were successful
Golang Tests / test-go (push) Successful in 55s
lint / lint (push) Successful in 1m12s
3797cab806
agent: add remote access session manager scaffold
Some checks failed
Golang Tests / test-go (push) Has been cancelled
lint / lint (push) Has been cancelled
ff2d9bfea3
spec: clarify teleport dependency license gate
Some checks failed
Golang Tests / test-go (push) Successful in 54s
lint / lint (push) Failing after 1m3s
20c8951968
spec: expand remote access to teleport parity
Some checks failed
Golang Tests / test-go (push) Successful in 1m30s
lint / lint (push) Failing after 1m36s
811048eafc
spec: add teleport license gate inventory
Some checks failed
lint / lint (push) Failing after 46s
Golang Tests / test-go (push) Successful in 1m9s
6b11fb7d8e
agent: route proxmox console through remote access manager
Some checks failed
lint / lint (push) Has been cancelled
Golang Tests / test-go (push) Has been cancelled
8554799ede
spec: close remote access design checklist
Some checks failed
Golang Tests / test-go (push) Successful in 1m1s
lint / lint (push) Failing after 1m3s
840b832b2f
agent: add clean-room remote access ssh pty
Some checks failed
lint / lint (push) Failing after 1m3s
Golang Tests / test-go (push) Successful in 1m8s
f02c2d145d
agent: decode remote access ssh open frames
Some checks failed
Golang Tests / test-go (push) Successful in 59s
lint / lint (push) Failing after 1m23s
7380f2dbdc
agent: route ssh sessions over console frame tunnel
Some checks failed
Golang Tests / test-go (push) Successful in 1m1s
lint / lint (push) Failing after 1m8s
45e529ae57
agent: wire remote access ssh credentials file
Some checks failed
lint / lint (push) Failing after 1m34s
Golang Tests / test-go (push) Successful in 1m36s
8614f8ef83
edge: add generic remote access broker
Some checks failed
lint / lint (push) Failing after 1m2s
Golang Tests / test-go (push) Successful in 1m17s
bee8aa3546
remote-access: reject generic agent-local ssh secrets
Some checks failed
lint / lint (push) Failing after 58s
Golang Tests / test-go (push) Successful in 1m8s
3af43a45f3
remote-access: support ssh user certificates
Some checks failed
Golang Tests / test-go (push) Successful in 1m0s
lint / lint (push) Failing after 1m11s
74d9472e95
remote-access: add ssh ca signing primitive
Some checks failed
lint / lint (push) Failing after 54s
Golang Tests / test-go (push) Successful in 1m23s
738e88bf11
remote-access: add ssh certificate policy boundary
Some checks failed
Golang Tests / test-go (push) Successful in 54s
lint / lint (push) Failing after 1m2s
d754048672
remote-access: accept ssh certificate credential mode
Some checks failed
lint / lint (push) Failing after 49s
Golang Tests / test-go (push) Successful in 1m15s
e3cedf9bef
remote-access: add ssh certificate issuer boundary
Some checks failed
Golang Tests / test-go (push) Successful in 1m17s
lint / lint (push) Has been cancelled
2286122d58
remote-access: include ssh username in certificate envelope
Some checks failed
lint / lint (push) Failing after 1m6s
Golang Tests / test-go (push) Successful in 1m27s
6bd91a8471
remote-access: merge ssh certificate envelopes
Some checks failed
lint / lint (push) Failing after 51s
Golang Tests / test-go (push) Successful in 1m8s
72138dfc4d
remote-access: bind ssh certs to agent scope
Some checks failed
lint / lint (push) Failing after 59s
Golang Tests / test-go (push) Successful in 1m14s
1529b03a10
remote-access: add ssh ca signer command
Some checks failed
lint / lint (push) Failing after 1m1s
Golang Tests / test-go (push) Successful in 1m13s
ec543c3572
remote-access: add ssh ca command signer
Some checks failed
lint / lint (push) Failing after 1m2s
Golang Tests / test-go (push) Successful in 1m4s
08bd8b4a58
remote-access: map idp claims to ssh principals
Some checks failed
lint / lint (push) Failing after 53s
Golang Tests / test-go (push) Successful in 1m1s
3a0dbd4f15
remote-access: add ssh session credential grant
Some checks failed
lint / lint (push) Failing after 46s
Golang Tests / test-go (push) Successful in 1m8s
fe02af42dd
remote-access: allow configured ssh ca signer
Some checks failed
lint / lint (push) Failing after 49s
Golang Tests / test-go (push) Successful in 1m8s
00401f0641
remote-access: add user-present ssh grants
Some checks failed
Golang Tests / test-go (push) Successful in 1m3s
lint / lint (push) Failing after 1m4s
dffda8296c
remote-access: include targets in ssh grants
Some checks failed
Golang Tests / test-go (push) Successful in 57s
lint / lint (push) Failing after 1m9s
557327bf5e
remote-access: verify ssh certificate grant scoping
Some checks failed
lint / lint (push) Failing after 53s
Golang Tests / test-go (push) Successful in 1m11s
0981453a1b
remote-access: require session agent frame ownership
Some checks failed
Golang Tests / test-go (push) Successful in 1m1s
lint / lint (push) Failing after 1m6s
20d77b4404
remote-access: guard console channel ticket echoes
Some checks failed
Golang Tests / test-go (push) Successful in 1m13s
lint / lint (push) Failing after 1m49s
e8a5fca8e6
remote-access: issue ssh certs from sso identity
Some checks failed
lint / lint (push) Failing after 50s
Golang Tests / test-go (push) Successful in 1m13s
69cc88fe8c
remote-access: prove ssh ca with openssh
Some checks failed
Golang Tests / test-go (push) Successful in 59s
lint / lint (push) Failing after 1m35s
eeaebb0634
remote-access: audit ssh certificate issuance
Some checks failed
Golang Tests / test-go (push) Successful in 53s
lint / lint (push) Failing after 1m12s
039e91dd6c
remote-access: audit generic session broker
Some checks failed
lint / lint (push) Failing after 1m9s
Golang Tests / test-go (push) Has been cancelled
cd91f29321
remote-access: add sso certificate grant
Some checks failed
Golang Tests / test-go (push) Successful in 57s
lint / lint (push) Failing after 1m28s
07a273feb7
remote-access: bind ssh open payload scope
Some checks failed
Golang Tests / test-go (push) Successful in 1m2s
lint / lint (push) Failing after 1m29s
56a81f91cb
remote-access: bind agent metadata in console wrapper
Some checks failed
Golang Tests / test-go (push) Successful in 59s
lint / lint (push) Failing after 1m1s
030e459949
remote-access: prove agent ssh certificate adapter
Some checks failed
lint / lint (push) Failing after 48s
Golang Tests / test-go (push) Has been cancelled
eabb4d072f
remote-access: validate ssh certificate key binding
Some checks failed
lint / lint (push) Failing after 1m1s
Golang Tests / test-go (push) Successful in 1m16s
1d879c179f
remote-access: add generic session resource
Some checks failed
lint / lint (push) Failing after 1m10s
Golang Tests / test-go (push) Successful in 1m16s
9ef2531770
remote-access: bind broker lifecycle to sessions
Some checks failed
lint / lint (push) Failing after 54s
Golang Tests / test-go (push) Successful in 1m9s
3b836f6d3c
remote-access: add generic session api
Some checks failed
Golang Tests / test-go (push) Successful in 1m0s
lint / lint (push) Failing after 1m27s
0a6644a594
remote-access: add generic stream endpoint
Some checks failed
lint / lint (push) Failing after 59s
Golang Tests / test-go (push) Successful in 1m6s
cdb04fd7df
remote-access: extract generic terminal renderer
Some checks failed
lint / lint (push) Failing after 54s
Golang Tests / test-go (push) Successful in 59s
e26fb2aa34
remote-access: require approval for brokered sessions
Some checks failed
lint / lint (push) Failing after 49s
Golang Tests / test-go (push) Successful in 1m18s
bdafe9a82c
remote-access: add browser ssh credential UI
Some checks failed
lint / lint (push) Failing after 52s
Golang Tests / test-go (push) Successful in 1m11s
25a155cc47
remote-access: add recording manifests
Some checks failed
Golang Tests / test-go (push) Successful in 1m7s
lint / lint (push) Failing after 1m38s
8794bb796f
remote-access: add enhanced recording gate
Some checks failed
lint / lint (push) Failing after 58s
Golang Tests / test-go (push) Successful in 1m2s
0ffd9a8a34
remote-access: gate enhanced recording capability
Some checks failed
lint / lint (push) Failing after 1m4s
Golang Tests / test-go (push) Has been cancelled
efb223f4c1
remote-access: add protocol adapter registry
Some checks failed
Golang Tests / test-go (push) Successful in 1m5s
lint / lint (push) Failing after 1m31s
3a370aea3e
remote-access: test enhanced recording fail closed
Some checks failed
lint / lint (push) Failing after 47s
Golang Tests / test-go (push) Successful in 1m16s
37b684df72
remote-access: wire oidc ssh cert attach
Some checks failed
Golang Tests / test-go (push) Successful in 1m0s
lint / lint (push) Failing after 1m46s
f368875d32
remote-access: add demo ssh smoke
Some checks failed
Golang Tests / test-go (push) Successful in 1m1s
lint / lint (push) Failing after 1m28s
f0aa03835b
remote-access: add authentik ssh cert smoke
Some checks failed
lint / lint (push) Failing after 48s
Golang Tests / test-go (push) Successful in 1m10s
401fd998d3
remote-access: add linux enhanced recording fallback
Some checks failed
Golang Tests / test-go (push) Failing after 55s
lint / lint (push) Failing after 1m32s
c49c1e098e
remote-access: propose ebpf enhanced recording
Some checks failed
lint / lint (push) Failing after 49s
Golang Tests / test-go (push) Failing after 1m2s
3f88e2d6f7
remote-access: plan shared agent ebpf runtime
Some checks failed
Golang Tests / test-go (push) Failing after 57s
lint / lint (push) Failing after 1m12s
682b1c309c
remote-access: document ebpf dependency review
Some checks failed
lint / lint (push) Failing after 45s
Golang Tests / test-go (push) Failing after 57s
4a2d97a940
remote-access: require shared ebpf runtime
Some checks failed
Golang Tests / test-go (push) Failing after 1m5s
lint / lint (push) Failing after 1m10s
4c4a1df618
remote-access: define ebpf runtime ownership
Some checks failed
Golang Tests / test-go (push) Failing after 50s
lint / lint (push) Has been cancelled
232f6cdfae
remote-access: define ebpf session scoping
Some checks failed
lint / lint (push) Failing after 49s
Golang Tests / test-go (push) Failing after 1m3s
76c91d954b
remote-access: record teleport bpf provenance
Some checks failed
Golang Tests / test-go (push) Failing after 50s
lint / lint (push) Failing after 1m35s
5bc0db170d
remote-access: document ebpf ops profile
Some checks failed
lint / lint (push) Failing after 48s
Golang Tests / test-go (push) Failing after 1m2s
b374083c0a
remote-access: complete ebpf runtime review
Some checks failed
lint / lint (push) Failing after 51s
Golang Tests / test-go (push) Failing after 52s
6e782f0ba1
remote-access: sequence ebpf implementation
Some checks failed
Golang Tests / test-go (push) Failing after 51s
lint / lint (push) Failing after 59s
9876470426
remote-access: add shared ebpf runtime shell
Some checks failed
lint / lint (push) Failing after 1m31s
Golang Tests / test-go (push) Has been cancelled
4d7ea15889
remote-access: add ebpf probe generation workflow
Some checks failed
Golang Tests / test-go (push) Failing after 1m9s
lint / lint (push) Failing after 1m29s
7843a8ffdb
remote-access: add generic ebpf collection loader
Some checks failed
Golang Tests / test-go (push) Failing after 1m27s
lint / lint (push) Failing after 1m28s
c54ee72df8
remote-access: add ebpf command event normalization
Some checks failed
lint / lint (push) Failing after 1m22s
Golang Tests / test-go (push) Failing after 1m24s
1345ef678a
remote-access: add ebpf file event normalization
Some checks failed
lint / lint (push) Failing after 1m26s
Golang Tests / test-go (push) Failing after 1m30s
d83c3c7b16
remote-access: add ebpf network event normalization
Some checks failed
Golang Tests / test-go (push) Failing after 1m9s
lint / lint (push) Failing after 1m29s
b54868fb7e
remote-access: add ebpf loss accounting
Some checks failed
Golang Tests / test-go (push) Failing after 1m23s
lint / lint (push) Failing after 1m38s
29e9dc6894
remote-access: stop enhanced recording on session cancellation
Some checks failed
lint / lint (push) Failing after 1m13s
Golang Tests / test-go (push) Failing after 1m28s
32657be795
helm: add explicit agent ebpf profile
Some checks failed
Golang Tests / test-go (push) Failing after 1m30s
lint / lint (push) Failing after 1m38s
fa5180a085
remote-access: gate bpf capability on runtime self-test
Some checks failed
lint / lint (push) Has been cancelled
Golang Tests / test-go (push) Has been cancelled
2ef3cb90cb
remote-access: cover bpf fallback policy gates
Some checks failed
Golang Tests / test-go (push) Failing after 1m30s
lint / lint (push) Failing after 1m39s
1f9e278c39
remote-access: harden enhanced event redaction
Some checks failed
Golang Tests / test-go (push) Failing after 1m10s
lint / lint (push) Failing after 1m31s
76828abe14
remote-access: require managed boundary for ssh bpf
Some checks failed
Golang Tests / test-go (push) Failing after 1m35s
lint / lint (push) Failing after 1m42s
47a67b74a0
remote-access: add ebpf validation smoke checks
Some checks failed
lint / lint (push) Failing after 1m15s
Golang Tests / test-go (push) Failing after 1m29s
b3779ce016
remote-access: mark ebpf linux validation complete
Some checks failed
Golang Tests / test-go (push) Failing after 1m9s
lint / lint (push) Failing after 1m26s
2e90af28e6
remote-access: align ssh certificate custody audit
Some checks failed
Golang Tests / test-go (push) Failing after 1m10s
lint / lint (push) Failing after 1m31s
c5714e320c
remote-access: bind ssh certificates to session target
Some checks failed
lint / lint (push) Failing after 1m12s
Golang Tests / test-go (push) Failing after 1m20s
48c0fecf16
remote-access: make ssh host key policy explicit
Some checks failed
Golang Tests / test-go (push) Failing after 1m8s
lint / lint (push) Failing after 1m25s
c2fc05576e
remote-access: add ssh known hosts verification
Some checks failed
Golang Tests / test-go (push) Failing after 1m9s
lint / lint (push) Failing after 1m30s
7001675ef0
remote-access: persist ssh known hosts by default
Some checks failed
lint / lint (push) Failing after 1m12s
Golang Tests / test-go (push) Failing after 1m32s
554a31f60a
remote-access: clarify browser key digest label
Some checks failed
Golang Tests / test-go (push) Failing after 1m14s
lint / lint (push) Failing after 1m28s
051e79f3cb
remote-access: gate remembered browser keys
Some checks failed
lint / lint (push) Failing after 1m14s
Golang Tests / test-go (push) Failing after 1m28s
e0116b6fa4
remote-access: expose ssh certificate mode in console
Some checks failed
Golang Tests / test-go (push) Failing after 1m10s
lint / lint (push) Has been cancelled
3794e3c417
remote-access: isolate remembered keys to user-present mode
Some checks failed
lint / lint (push) Failing after 1m12s
Golang Tests / test-go (push) Failing after 1m30s
87b54e9a53
remote-access: strip client ssh policy metadata
Some checks failed
Golang Tests / test-go (push) Failing after 1m20s
lint / lint (push) Failing after 1m24s
61b77494e2
remote-access: add trusted ssh cert policy config
Some checks failed
lint / lint (push) Failing after 1m10s
Golang Tests / test-go (push) Failing after 1m26s
90ee640eb4
remote-access: wire ssh ca signer runtime config
Some checks failed
Golang Tests / test-go (push) Failing after 1m19s
lint / lint (push) Failing after 1m22s
41fb63f88e
remote-access: require ssh cert principal policy
Some checks failed
Golang Tests / test-go (push) Failing after 1m16s
lint / lint (push) Failing after 1m34s
bcb86be3da
remote-access: gate ssh host key skip verify
Some checks failed
lint / lint (push) Failing after 1m23s
Golang Tests / test-go (push) Failing after 1m23s
6777065947
remote-access: require approval verification
Some checks failed
Golang Tests / test-go (push) Failing after 1m22s
lint / lint (push) Has been cancelled
0d23e0d866
remote-access: bind custody modes to protocol
Some checks failed
lint / lint (push) Failing after 1m16s
Golang Tests / test-go (push) Failing after 1m27s
c86bea84f5
remote-access: gate browser target overrides
Some checks failed
Golang Tests / test-go (push) Failing after 1m12s
lint / lint (push) Failing after 1m28s
3455597dae
remote-access: restrict public api to ssh
Some checks failed
lint / lint (push) Failing after 1m14s
Golang Tests / test-go (push) Failing after 1m25s
5fde24811b
remote-access: gate ssh target port overrides
Some checks failed
Golang Tests / test-go (push) Failing after 1m14s
lint / lint (push) Failing after 1m32s
7d1d85d407
remote-access: reject browser route selection
Some checks failed
lint / lint (push) Failing after 1m26s
Golang Tests / test-go (push) Failing after 1m28s
537d4d03f2
remote-access: strip credential metadata at api
Some checks failed
Golang Tests / test-go (push) Failing after 1m17s
lint / lint (push) Failing after 1m38s
0e9008dec5
remote-access: validate ssh target port override
Some checks failed
Golang Tests / test-go (push) Failing after 1m15s
lint / lint (push) Failing after 1m33s
4ff0200612
remote-access: validate terminal dimensions
Some checks failed
Golang Tests / test-go (push) Failing after 1m12s
lint / lint (push) Failing after 1m29s
8e0397d1fa
remote-access: reject browser recording policy
Some checks failed
Golang Tests / test-go (push) Failing after 1m28s
lint / lint (push) Failing after 1m36s
483378f962
remote-access: reject browser credential rules
Some checks failed
lint / lint (push) Failing after 1m28s
Golang Tests / test-go (push) Failing after 1m32s
52890bb6b7
remote-access: bound stream terminal dimensions
Some checks failed
lint / lint (push) Failing after 1m16s
Golang Tests / test-go (push) Failing after 1m26s
f9afd391a3
remote-access: validate attach credential envelope
Some checks failed
Golang Tests / test-go (push) Failing after 1m9s
lint / lint (push) Failing after 1m34s
735a4461d5
remote-access: bound stream data frames
Some checks failed
lint / lint (push) Failing after 1m8s
Golang Tests / test-go (push) Failing after 1m30s
5c83a02c60
remote-access: bound proxmox stream frames
Some checks failed
lint / lint (push) Failing after 1m29s
Golang Tests / test-go (push) Failing after 1m28s
c7d74af050
remote-access: validate agent frame bounds
Some checks failed
lint / lint (push) Failing after 1m13s
Golang Tests / test-go (push) Failing after 1m29s
35a5a768dc
remote-access: bound agent open and output frames
Some checks failed
lint / lint (push) Failing after 1m31s
Golang Tests / test-go (push) Failing after 1m32s
bd89be07f1
remote-access: bound ssh adapter inputs
Some checks failed
Golang Tests / test-go (push) Failing after 1m11s
lint / lint (push) Has been cancelled
37a38dab4d
remote-access: bound proxmox ssh config
Some checks failed
lint / lint (push) Failing after 1m20s
Golang Tests / test-go (push) Failing after 1m26s
e5234563a4
remote-access: bound ssh certificate issuance
Some checks failed
lint / lint (push) Failing after 1m17s
Golang Tests / test-go (push) Failing after 1m25s
616d56695c
remote-access: bound ssh principal mapping
Some checks failed
Golang Tests / test-go (push) Failing after 1m26s
lint / lint (push) Failing after 1m28s
26d2301b19
Merge remote-tracking branch 'origin/staging' into codex/teleport-agent-routed-remote-access
Some checks failed
Golang Tests / test-go (push) Failing after 1m32s
lint / lint (push) Failing after 1m45s
Rust Tests / test-rust (rust/rperf-client, cargo) (push) Successful in 3m49s
Rust Tests / test-rust (rust/log-collector, cargo) (push) Successful in 3m58s
Rust Tests / test-rust (rust/trapd, cargo) (push) Successful in 4m11s
Rust Tests / test-rust (rust/consumers/zen, cargo) (push) Successful in 4m20s
Rust Tests / test-rust (//rust/rperf-server:rperf, rust/rperf-server, bazel) (push) Successful in 4m35s
Rust Tests / test-rust (rust/srql, cargo) (push) Successful in 8m12s
a332ed7b97
# Conflicts:
#	elixir/web-ng/assets/component/index.js
#	elixir/web-ng/assets/js/hooks/index.js
#	elixir/web-ng/lib/serviceradar_web_ng_web/components/react_components.ex
#	elixir/web-ng/lib/serviceradar_web_ng_web/live/device_live/show.ex
#	elixir/web-ng/test/phoenix/channels/proxmox_console_stream_handler_test.exs
#	go/pkg/agent/control_stream.go
#	go/pkg/agent/push_loop.go
#	openspec/changes/add-secure-agent-routed-remote-access/design.md
#	openspec/changes/add-secure-agent-routed-remote-access/proposal.md
#	openspec/changes/add-secure-agent-routed-remote-access/specs/agent-connectivity/spec.md
#	openspec/changes/add-secure-agent-routed-remote-access/specs/edge-architecture/spec.md
#	openspec/changes/add-secure-agent-routed-remote-access/tasks.md
remote-access: harden teleport license scans
Some checks failed
Golang Tests / test-go (push) Failing after 1m18s
lint / lint (push) Failing after 1m29s
962e0e40a7
remote-access: remove agent-local console credentials
Some checks failed
Golang Tests / test-go (push) Failing after 1m16s
lint / lint (push) Failing after 1m28s
99fa5793a4
remote-access: require session-owned broker frames
Some checks failed
lint / lint (push) Failing after 1m23s
Golang Tests / test-go (push) Failing after 1m31s
a5204684e8
remote-access: require registered agent frame ownership
Some checks failed
lint / lint (push) Failing after 1m11s
Golang Tests / test-go (push) Failing after 1m25s
cf07d1dc8c
remote-access: keep ssh grants in memory
Some checks failed
Golang Tests / test-go (push) Failing after 1m10s
lint / lint (push) Failing after 1m25s
db8e7e7c65
remote-access: require brokered grants for central custody
Some checks failed
Golang Tests / test-go (push) Failing after 1m32s
lint / lint (push) Failing after 1m37s
a4f6966fc9
remote-access: keep central custody policy owned
Some checks failed
lint / lint (push) Failing after 1m11s
Golang Tests / test-go (push) Failing after 1m26s
7b4657a9a0
spec: track teleport parity hardening
Some checks failed
Golang Tests / test-go (push) Failing after 1m26s
lint / lint (push) Failing after 1m31s
Secret Scan / gitleaks (pull_request) Failing after 28s
lint / lint (pull_request) Failing after 1m52s
CI / build (pull_request) Has been cancelled
d01e15fdd1
remote-access: require trusted brokered credential rules
Some checks failed
Secret Scan / gitleaks (pull_request) Failing after 26s
lint / lint (pull_request) Failing after 1m19s
Golang Tests / test-go (push) Failing after 1m35s
lint / lint (push) Failing after 1m44s
CI / build (pull_request) Has been cancelled
55e51a751c
remote-access: resolve scoped central grants
Some checks failed
lint / lint (push) Failing after 1m44s
Golang Tests / test-go (push) Failing after 1m45s
lint / lint (pull_request) Failing after 1m56s
Secret Scan / gitleaks (pull_request) Failing after 24s
CI / build (pull_request) Has been cancelled
8f405441f4
remote-access: share ssh host key policy
Some checks failed
Secret Scan / gitleaks (pull_request) Failing after 31s
lint / lint (pull_request) Failing after 1m25s
Golang Tests / test-go (push) Failing after 1m33s
lint / lint (push) Failing after 1m35s
CI / build (pull_request) Failing after 6m59s
78903fe186
build: fix local darwin bazel tests
Some checks failed
Secret Scan / gitleaks (pull_request) Failing after 27s
Golang Tests / test-go (push) Failing after 1m26s
lint / lint (pull_request) Failing after 1m29s
lint / lint (push) Failing after 1m32s
CI / build (pull_request) Failing after 4m6s
8e6fbbf020
extract palisade — shared trust-boundary primitives for Elixir
Some checks failed
Secret Scan / gitleaks (pull_request) Failing after 31s
Golang Tests / test-go (push) Failing after 1m24s
lint / lint (pull_request) Failing after 1m29s
lint / lint (push) Failing after 3m52s
CI / build (pull_request) Failing after 3m58s
5c810564af
New `elixir/palisade/` sub-project housing the boundary-defense
modules that CRM and ServiceRadar previously kept as drifting
verbatim copies:

  Palisade.NetworkAddressPolicy
  Palisade.OutboundURLPolicy
  Palisade.OutboundFetch

Apache-2.0 licensed. ServiceRadar-internal consumers (web-ng,
serviceradar_core, etc.) consume via the standard sibling-path
dep:

    {:palisade, path: "../palisade"}

External consumers (CRM, and anyone else who wants the modules)
pull from the public CarverAutomation hex registry at
https://hex.carverauto.dev. Add the registry once per machine /
CI runner:

    mix hex.repo add carverauto https://hex.carverauto.dev

then declare the dep:

    {:palisade, "~> 0.1", repo: "carverauto"}

CI

  .forgejo/workflows/elixir-quality.yml — palisade joins the
    existing matrix-driven Elixir Quality gate (format / compile
    / test / credo on every PR + push).

  .forgejo/workflows/palisade-publish.yml — new workflow that
    fires on `palisade-vX.Y.Z` tag pushes:
      1. Verifies the tag version matches mix.exs @version
      2. Runs the full quality gate one more time
      3. `mix hex.publish package --repo carverauto --yes`
    Requires HEX_API_KEY secret on the runner with publish scope
    against hex.carverauto.dev.

Versioning

  Tag from repo root: `git tag palisade-v0.x.y && git push --tags`.
  Bump consumers' `~> 0.x` pin to pick up the new release.

Tests

  36 ExUnit cases ported (with module renames) from the previous
  serviceradar/policies test surface + the web-ng outbound_fetch
  test. Covers scheme rejection (https-only, case-insensitive),
  IPv4 + IPv6 private/loopback/link-local blocks, hostname
  blocks (localhost, *.local, case-insensitive), public IPv4
  acceptance, URL rewriting to resolved IP with original-host
  SNI / Host: header, IPv6 inet6 transport flag, conservative
  req_opts.

Out of scope (next palisade versions, tracked separately)

  - Palisade.OIDC.Client — discovery + JWKS + ID-token verify
    with proper nonce / iss / aud / exp validation.
  - Palisade.OIDC.ConfigCache — ETS-backed cache for OIDC
    discovery + JWKS payloads.
  - Palisade.SAML.{CertTrust, AssertionValidator, XML} — SAML
    primitives.
  - ServiceRadar consumers swapping their local copies in
    serviceradar_core/lib/serviceradar/policies/ and
    web-ng/lib/.../auth/{outbound_fetch,outbound_url_policy}.ex
    for the new package. Filed as a follow-up issue.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
chore(palisade): publish to hex.pm instead of mini_repo
Some checks failed
Secret Scan / gitleaks (pull_request) Failing after 30s
lint / lint (push) Failing after 1m16s
Golang Tests / test-go (push) Failing after 1m29s
lint / lint (pull_request) Failing after 1m31s
CI / build (pull_request) Failing after 3m52s
51f42c2a3b
Palisade is Apache-2.0 OSS — hex.pm is the canonical Elixir
registry. mini_repo's API isn't hex.pm-compatible
(POST /api/repos/:repo/publish vs hex_core's
POST /api/repos/:repo/packages/:name/releases), so vanilla
`mix hex.publish` doesn't work with it. Going to public hex.pm
eliminates the registry-side complexity for an OSS package.

The mini_repo at hex.carverauto.dev stays useful for any
future actually-internal packages; it just isn't the right
home for palisade.

palisade v0.1.0 is live at
https://hex.pm/packages/palisade/0.1.0.

Changes
  .forgejo/workflows/palisade-publish.yml — target hex.pm
    instead of hex.carverauto.dev. Env var name follows the
    hex convention (HEX_API_KEY); generate the publish key on
    hex.pm and set as a Forgejo secret. Drops the carverauto-
    specific `--organization` / api_url plumbing.
  elixir/palisade/README.md — drop the private-registry
    framing; reference hex.pm + the standard install pattern.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
mfreeman451 force-pushed carverauto/extract-palisade from 51f42c2a3b
Some checks failed
Secret Scan / gitleaks (pull_request) Failing after 30s
lint / lint (push) Failing after 1m16s
Golang Tests / test-go (push) Failing after 1m29s
lint / lint (pull_request) Failing after 1m31s
CI / build (pull_request) Failing after 3m52s
to f9fb3c25ab
Some checks failed
Secret Scan / gitleaks (pull_request) Successful in 45s
lint / lint (push) Successful in 1m7s
Golang Tests / test-go (push) Successful in 1m15s
lint / lint (pull_request) Successful in 1m35s
CI / build (pull_request) Failing after 27m38s
2026-05-12 17:48:58 +00:00
Compare
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
carverauto/serviceradar!3277
No description provided.