Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
120 commits
Select commit Hold shift + click to select a range
d99f799
feat(issue-05): add basic graceful reload (node --watch), sidecar bac…
Oct 1, 2025
bf2c3b1
feat(dev-hot): signature verifier, sidecar image infra, supervisor, E…
Oct 1, 2025
10f27ab
feat(dev-hot): sidecar publish workflow, multi-namespace ingest, prov…
Oct 1, 2025
6f6edfc
feat(supply-chain): server signature enforcement flag, SBOM endpoint,…
Oct 1, 2025
65a7ad9
chore(licenses): add MIT license fields to internal helper crates to …
Oct 1, 2025
01996a0
docs(issue06): detailed SBOM & supply chain status, roadmap, checklis…
Oct 1, 2025
c65bb3a
issue06: add CycloneDX generation, SBOM upload endpoint, enforcement …
Oct 1, 2025
bc0948c
issue06: provenance v2, DSSE signing, full CycloneDX validation, lock…
Oct 1, 2025
48542f0
cli: fix dead_code PackageLock removal & clippy never_loop; replace o…
Oct 1, 2025
4402d2b
control-plane: fix artifact_meta select (provenance_present) and dete…
Oct 7, 2025
8a94b3f
issue06 phase3: manifest upload + digest cross-check, strict SBOM enf…
Oct 7, 2025
1025bb3
issue06 doc: mark manifest upload, strict enforcement, new metrics done
Oct 7, 2025
7cba999
tests: add manifest/SBOM enforcement & metrics coverage
Oct 7, 2025
12ad81e
feat: gzip negotiation, full-schema test, provenance & attestation ET…
Oct 7, 2025
e6406b2
chore: collapse nested if let in artifacts handler (clippy clean)
Oct 7, 2025
79846a0
chore: remove unused AppState imports in tests (clippy clean)
Oct 7, 2025
46eae47
chore: clippy fix iter().cloned().collect() -> to_vec() in sbom_manif…
Oct 7, 2025
34a93da
test: speed/stability improvements (shared pool policy, TRUNCATE clea…
Oct 8, 2025
84fb7bd
feat(issue-06): complete extended provenance, cyclonedx advanced sect…
Oct 8, 2025
c2dc076
test(provenance): dual-sign and key retirement test
Oct 8, 2025
ed2334f
chore(lint): fix unused openapi assignment & redundant closure
Oct 8, 2025
764c49e
feat(observability,security): implement Issue 07 metrics & trace prop…
Oct 8, 2025
42f2b8d
test: add artifact_verify_failure_total increment test
Oct 8, 2025
fea537f
feat(issue-08): dev automation + hot reload (deploy-sample, hot-uploa…
Oct 8, 2025
22f6dc2
ci: add fast + full test workflow with sccache and fast test gating
Oct 8, 2025
311e4e9
ci: pin rust 1.90.0 and use install-action for sccache
Oct 8, 2025
f077d1c
chore: harden SBOM tests & diagnostics (debug logging, metrics assert…
Oct 8, 2025
f4c5b1b
ci: allow full-tests job on PR via full-tests label
Oct 8, 2025
5db90af
ci: run full-tests on every PR
Oct 8, 2025
a9c8d5c
test(control-plane): speed up and stabilize DB-bound tests; reduce co…
Oct 11, 2025
db86143
docs: add fast test env flags and setup guidance for control-plane tests
Oct 11, 2025
74424eb
test(harness): fix clippy min/max pattern by capping to env-specific …
Oct 11, 2025
af1f0d2
docs(issues): add task checklist and execution plan for Issue 09 (ben…
Oct 11, 2025
231892d
docs(issues): add TDD plan for Issue 09 as a standalone document to a…
Oct 11, 2025
62bb2d1
perf(bench): add regression checker + fixtures; emit JSON from packag…
Oct 11, 2025
6a70de4
ci(bench): add benchmarks job to run regression fixtures, benches, co…
Oct 11, 2025
66cf3cb
tdd(bench): finalize T1–T10; schema validation in regression script; …
Oct 11, 2025
17f0031
bench: implement mock streaming bench; docs: benches usage & baseline…
Oct 11, 2025
ce92943
bench: add committed streaming baseline; ci: pin threads/logs and com…
Oct 11, 2025
88dd563
ci: enforce benchmarks on main/PR; run benches and fail on >20% p95 r…
Oct 11, 2025
ea673ad
bench(regression): make script resilient and fix exit codes on succes…
Oct 11, 2025
04d31c5
docs(issue09): mark docs + stabilization guardrails completed; Issue …
Oct 11, 2025
e3f6192
bench: update packaging baseline (p95 ~1.2ms) to reflect CI runs; kee…
Oct 11, 2025
ef2b567
issue10: auth & RBAC foundation
Oct 11, 2025
19dcaf9
issue10: observability/logs
Oct 11, 2025
8f3c3fc
ci: provide dummy AETHER_API_TOKENS in tests; fix workflow lint; auth…
Oct 11, 2025
521604b
ci(feature): fix MinIO service image tag to a valid release; remove u…
Oct 11, 2025
01fc255
ci(feature): switch MinIO service to bitnami/minio:latest to fix pull…
Oct 11, 2025
4d9627f
test(ci): default to per-test DB pools (AETHER_TEST_SHARED_POOL=0) to…
Oct 11, 2025
82945e9
ci(feature): run MinIO via docker run (minio/minio:latest) with healt…
Oct 11, 2025
4bb53df
tests: fix bench fixtures schema for streaming (p95>=p50) and align d…
Oct 11, 2025
43edbb0
tests: correct stream -10% fixture to p95=72 (baseline 80), schema-valid
Oct 11, 2025
dfc5541
ci(macos): remove Docker-based MinIO (not available) and use mock sto…
Oct 11, 2025
ecc7f14
ci: faster, less flaky tests – per-test DB pools, once-only migration…
Oct 11, 2025
46add97
net: unify default HTTP/TLS stack to hyper1/rustls23; gate AWS S3 to …
Oct 11, 2025
2f9a2df
docs: add build time and binary sizes (release) for Issue 11 baseline…
Oct 11, 2025
1f7d136
chore(workspace): set kube default-features=false to honor per-crate …
Oct 11, 2025
5ff2441
docs(issue-11): acceptance results + measurements; chore(deny): allow…
Oct 11, 2025
8e5970e
ci: fix linker bus errors by avoiding all-features on PR runs; set RU…
Oct 13, 2025
844a819
ci(feature): reduce linker pressure by avoiding all-features workspac…
Oct 13, 2025
1316d09
docs(issue-11): update progress, CI/linker fixes, cargo-deny bans pol…
Oct 13, 2025
1e0e870
ci(deny): avoid sccache wrapper inside cargo-deny action container by…
Oct 13, 2025
1b0a627
ci(deny): replace cargo-deny action with direct cargo-deny runner to …
Oct 13, 2025
dd7d751
ci(deny): run cargo-deny with --all-features explicitly; ci: add opt-…
Oct 13, 2025
9ac226c
ci: enable S3 tests on non-PR runs via AETHER_ENABLE_S3_FULL_CI=1; do…
Oct 13, 2025
ffa089a
chore(deny): add temporary skip for hashbrown duplicate (0.14 via sql…
Oct 13, 2025
0aabae4
perf(bench): make tolerances configurable via env (DURATION_TOLERANCE…
Oct 13, 2025
c2918e7
ci(bench): set DURATION_TOLERANCE=0.22 for regression guard to reduce…
Oct 13, 2025
4317a2a
ci(s3): ensure MinIO is started/configured for S3 tests; test env set…
Oct 13, 2025
f058af7
deny: fix advisories schema; add ignores for backoff/derivative; allo…
Oct 13, 2025
41cf6e6
feat: sync with upstream PR #6 (graceful reload, SBOM/provenance, CI/…
Oct 13, 2025
5430654
tests(control-plane): gate multipart S3 integration test behind s3 fe…
Oct 13, 2025
7aa84f5
storage(control-plane): default mock base to localhost; force path-st…
Oct 13, 2025
83987bf
s3(minio): force path-style for custom endpoint; default mock base to…
Oct 13, 2025
92fb3bb
Merge pull request #2 from askerNQK/feat/complete-aether-engine-mvp
askerNQK Oct 13, 2025
5cc6ceb
docs: add sprint plan and per-epic issues with owners
Oct 13, 2025
22a9089
docs(issues): add sprint indices and epic issue docs with owners
Oct 13, 2025
c74bb0f
Merge pull request #3 from askerNQK/feat/complete-aether-engine-mvp
askerNQK Oct 13, 2025
49a923c
Epic D: Base Node.js 20 slim image pipeline
Oct 13, 2025
2a5f216
CI: gate on 0 CRITICAL vulns; scan local image before push; push only…
Oct 13, 2025
09e71a1
CI: make Grype non-blocking (continue-on-error, fail-build=false); ke…
Oct 13, 2025
8a61d4b
Epic B: Helm/Kustomize & RBAC/SA – add control-plane chart, RBAC for …
Oct 13, 2025
5a71671
Security: add Trivy (.trivyignore) & Grype (security/grype-ignore.yam…
Oct 13, 2025
aed5cc7
CI: add trivy findings summary artifact for easier allowlisting
Oct 13, 2025
f3c38b7
Dockerfile: run apt-get upgrade -y to pick up security fixes while ke…
Oct 13, 2025
f18009e
Dockerfile: update npm to latest and clean cache to reduce potential …
Oct 13, 2025
24c9953
CI: echo summarized Trivy HIGH/CRITICAL findings in logs for quicker RCA
Oct 13, 2025
a62c679
aether-cli: fix logs command deps and tests for hyper v1; add futures…
Oct 13, 2025
9476362
Fix: aether-cli logs deps and tests for Hyper 1.x; enable tokio io-st…
Oct 13, 2025
14a79af
cli: add logs mock mode to avoid network in tests; stream JSON/text; …
Oct 13, 2025
e44009a
fix(helm-rbac-tests): satisfy clippy -D warnings by removing let-and-…
Oct 13, 2025
a18c486
docs: mark Epic D complete (aether-nodejs:20-slim) and record impleme…
Oct 13, 2025
91d03a0
Docs: mark Epic B done; add Helm chart usage guide and link from issue
Oct 13, 2025
90d2585
Helm: fix ConfigMap indentation to satisfy helm lint
Oct 13, 2025
149ec37
docs(issues): update Epic A logs streaming status and checklist (2025…
Oct 13, 2025
086c6c0
Helm: make ConfigMap template robust; add .Values.config default
Oct 13, 2025
8598276
chore(helm-rbac-tests): add SPDX license to satisfy cargo-deny
Oct 13, 2025
c66eecb
feat(control-plane): implement Kubernetes logs streaming (kube-rs) wi…
Oct 14, 2025
775b3a2
tests(epic-f): TDD for E2E smoke; feat: sample-node app, smoke_e2e.sh…
Oct 14, 2025
b380084
docs(issues): mark Epic A A1 done, partial A2 complete; add 2025-10-1…
Oct 14, 2025
d65edb0
docs: mark Epic F complete (E2E smoke + metrics) and record implement…
Oct 14, 2025
5236b18
Epic C: CI DB stability via matrix and harness retries
Oct 14, 2025
1e88e68
test(harness): fix retry loop ownership and warning in test_support.rs
Oct 14, 2025
3109bd7
feat(logs): WS route (feature-gated) and refined mock path; add multi…
Oct 14, 2025
b46ed1e
docs(epic-A): mark logs streaming as complete, update status for 2025…
Oct 14, 2025
5b68732
Epic H: SBOM/Provenance hardening (TDD)
Oct 14, 2025
550b955
docs(epic-A): mark all logs streaming tasks complete, add final statu…
Oct 14, 2025
8988c47
Epic G: TLS Ingress and Auth Policy hardening complete (TDD, implemen…
Oct 14, 2025
bbc4fe7
Epic H follow-ups: fix manifests and tests\n\n- aether-cli: tidy Carg…
Oct 14, 2025
f5c5ca7
feat(cli/logs): TDD tests + implementation verified; docs: README and…
Oct 14, 2025
da297ba
Auth policy: make auth_required enforce even without tokens; fix test…
Oct 14, 2025
3942c10
test(helm-rbac-tests): remove unused anyhow::Context import to satisf…
Oct 14, 2025
bbd1875
Epic I: Operator guide and troubleshooting (TDD)\n\n- TDD: add tests/…
Oct 14, 2025
148e4f4
chore(clippy): fix needless-bool in cli deploy and needless-return in…
Oct 14, 2025
40d6c37
CLI tests: accept CycloneDX SBOM default in deploy_sbom_and_sig (stil…
Oct 14, 2025
0c6649d
fix(cli/sbom): default to legacy aether-sbom-v1 unless --cyclonedx is…
Oct 14, 2025
89bd784
ci: mitigate disk exhaustion on runners (free space, prune docker); r…
Oct 14, 2025
291e0c2
ci: reduce memory pressure (prefer-dynamic, -j2) and stabilize linkin…
Oct 14, 2025
c565953
ci: mitigate linker crashes in S3 tests (no-threads, strip, serialize…
Oct 14, 2025
928aeca
ci: build MerkleKV-Mobile Windows single-file SFX and upload artifact
Oct 15, 2025
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
197 changes: 197 additions & 0 deletions .github/workflows/base-image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
name: Base image

on:
push:
branches: [ main ]
paths:
- 'images/aether-nodejs/**'
- '.github/workflows/base-image.yml'
- 'Makefile'
workflow_dispatch: {}
schedule:
- cron: '0 0 1 * *' # monthly rebuilds

permissions:
contents: read
packages: write
security-events: write
id-token: write # for cosign keyless signing

env:
IMAGE_NAME: aether-nodejs
IMAGE_TAG: 20-slim
REGISTRY: ghcr.io
GATE_SEVERITY: HIGH

jobs:
build-publish-scan:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up QEMU
uses: docker/setup-qemu-action@v3

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

- name: Compute date tag and owner (lowercase)
id: prep
run: |
echo "date=$(date -u +%Y-%m-%d)" >> "$GITHUB_OUTPUT"
echo "owner_lc=${GITHUB_REPOSITORY_OWNER,,}" >> "$GITHUB_OUTPUT"

- name: Compute tags and labels
id: meta
uses: docker/metadata-action@v5
with:
images: |
ghcr.io/${{ steps.prep.outputs.owner_lc }}/${{ env.IMAGE_NAME }}
tags: |
type=raw,value=${{ env.IMAGE_TAG }}
type=raw,value=${{ env.IMAGE_TAG }}-${{ steps.prep.outputs.date }}
type=sha
labels: |
org.opencontainers.image.title=aether-nodejs:${{ env.IMAGE_TAG }}
org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }}

- name: Build local image (amd64) for scanning
id: build_local
uses: docker/build-push-action@v6
with:
context: images/aether-nodejs/20-slim
file: images/aether-nodejs/20-slim/Dockerfile
push: false
load: true
platforms: linux/amd64
tags: |
${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}-ci
labels: ${{ steps.meta.outputs.labels }}

- name: Generate SBOM (CycloneDX)
uses: anchore/sbom-action@v0
with:
image: ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}-ci
artifact-name: sbom-${{ env.IMAGE_NAME }}-${{ env.IMAGE_TAG }}.cdx.json
format: cyclonedx-json

- name: Trivy scan (SARIF, non-blocking)
uses: aquasecurity/trivy-action@0.27.0
with:
image-ref: ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}-ci
format: sarif
output: trivy-results.sarif
severity: CRITICAL,HIGH,MEDIUM,LOW,UNKNOWN
exit-code: '0'
ignore-unfixed: true
trivyignores: .trivyignore

- name: Trivy scan (JSON summary for gating)
id: trivy_json
run: |
if [ "${{ env.GATE_SEVERITY }}" = "HIGH" ]; then SEV='CRITICAL,HIGH'; else SEV='CRITICAL'; fi
trivy image --format json --output trivy-results.json --severity "$SEV" --ignore-unfixed --ignorefile .trivyignore ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}-ci || true
CRIT=$(jq '[.Results[]?.Vulnerabilities[]? | select(.Severity=="CRITICAL")] | length' trivy-results.json)
HIGH=$(jq '[.Results[]?.Vulnerabilities[]? | select(.Severity=="HIGH")] | length' trivy-results.json)
echo "critical_count=$CRIT" >> $GITHUB_OUTPUT
echo "high_count=$HIGH" >> $GITHUB_OUTPUT
echo "CRITICAL: $CRIT, HIGH: $HIGH"
jq '{critical: [ .Results[]?.Vulnerabilities[]? | select(.Severity=="CRITICAL") ] | length, high: [ .Results[]?.Vulnerabilities[]? | select(.Severity=="HIGH") ] | length }' trivy-results.json > trivy-summary.json

- name: Upload Trivy results to code scanning
if: always()
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: trivy-results.sarif

- name: Summarize HIGH/CRITICAL findings
run: |
jq -r '[.Results[]?.Vulnerabilities[]? | select(.Severity=="CRITICAL" or .Severity=="HIGH")] \
| sort_by(.Severity) \
| .[] \
| "\(.Severity)\t\(.VulnerabilityID)\t\(.PkgName)\tinstalled=\(.InstalledVersion)\tfixed=\(.FixedVersion // \"n/a\")"' trivy-results.json \
> trivy-findings.txt || true

- name: Print summarized findings
if: always()
run: |
echo "=== Trivy Findings (HIGH/CRITICAL) ==="; \
(test -s trivy-findings.txt && cat trivy-findings.txt) || echo "No HIGH/CRITICAL findings or summary not generated."

- name: Install grype
uses: anchore/scan-action/download-grype@v3

- name: Grype scan (image)
id: grype
uses: anchore/scan-action@v3
with:
image: ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}-ci
severity-cutoff: high
fail-build: false
continue-on-error: true
env:
GRYPE_CONFIG: ${{ github.workspace }}/security/grype-ignore.yaml

- name: Upload Grype SARIF
if: always() && steps.grype.outputs.sarif != ''
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: ${{ steps.grype.outputs.sarif }}

- name: Attach artifacts (SBOM and scans)
if: always()
uses: actions/upload-artifact@v4
with:
name: base-image-artifacts
path: |
sbom-*.json
trivy-results.sarif
trivy-results.json
trivy-summary.json
trivy-findings.txt
${{ steps.grype.outputs.sarif }}

- name: Enforce gate (0 CRITICAL or 0 CRITICAL+HIGH)
run: |
if [ "${{ env.GATE_SEVERITY }}" = "HIGH" ]; then \
if [ "${{ steps.trivy_json.outputs.critical_count }}" != "0" ] || [ "${{ steps.trivy_json.outputs.high_count }}" != "0" ]; then \
echo "Fail: found CRITICAL=${{ steps.trivy_json.outputs.critical_count }}, HIGH=${{ steps.trivy_json.outputs.high_count }}"; exit 1; \
fi; \
else \
if [ "${{ steps.trivy_json.outputs.critical_count }}" != "0" ]; then \
echo "Fail: found CRITICAL=${{ steps.trivy_json.outputs.critical_count }}"; exit 1; \
fi; \
fi

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

- name: Build and push multi-arch image
if: success()
id: build_push
uses: docker/build-push-action@v6
with:
context: images/aether-nodejs/20-slim
file: images/aether-nodejs/20-slim/Dockerfile
push: true
platforms: linux/amd64,linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

- name: Install cosign (optional)
if: ${{ github.event_name != 'pull_request' }}
uses: sigstore/cosign-installer@v3


- name: Sign image with cosign (keyless, optional)
if: ${{ github.event_name != 'pull_request' && success() }}
env:
COSIGN_EXPERIMENTAL: '1'
run: |
cosign sign --yes ghcr.io/${{ steps.prep.outputs.owner_lc }}/${{ env.IMAGE_NAME }}@${{ steps.build_push.outputs.digest }} || echo "cosign signing skipped/failed"
49 changes: 49 additions & 0 deletions .github/workflows/build-merklekv-windows-sfx.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: Build MerkleKV Mobile (Windows SFX)

on:
workflow_dispatch:
push:
branches: [ main ]
tags: [ 'merklekv-*', 'merklekv-v*' ]

jobs:
build:
runs-on: windows-latest
steps:
- name: Checkout appengine
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Clone MerkleKV-Mobile
shell: bash
run: |
git clone --depth=1 https://github.com/AI-Decenter/MerkleKV-Mobile.git

- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
channel: stable

- name: Ensure 7-Zip present
shell: powershell
run: |
if (-not (Test-Path "$env:ProgramFiles\7-Zip\7zS.sfx") -and -not (Test-Path "$env:ProgramFiles\7-Zip\7z.sfx")) {
choco install 7zip -y
}

- name: Build and package SFX
shell: powershell
working-directory: MerkleKV-Mobile
run: |
if (-not (Test-Path .\scripts\windows\make-sfx.ps1)) {
throw 'Packaging script not found in MerkleKV-Mobile/scripts/windows/make-sfx.ps1'
}
./scripts/windows/make-sfx.ps1 -Output "$pwd\apps\flutter_demo\releases\MerkleKV-Mobile.exe"

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: MerkleKV-Mobile-windows-sfx
path: MerkleKV-Mobile/apps/flutter_demo/releases/MerkleKV-Mobile.exe
if-no-files-found: error
Loading
Loading