Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
0f20e01
refactoring elements
M1ndSmith Jul 24, 2026
c01b876
Delete refactoring elements directory
M1ndSmith Jul 26, 2026
1eaea2a
fix(core): Phase 1 correctness and gate enforcement
M1ndSmith Jul 25, 2026
668fe4d
fix(security): Phase 2 auth hardening and path safety
M1ndSmith Jul 25, 2026
a527f18
fix(stream): Phase 3 durability — restore, idempotency, ops
M1ndSmith Jul 25, 2026
aaf5208
chore: Phase 4 CI, lint, frontend, packaging hardening
M1ndSmith Jul 25, 2026
c9a1fdd
refoctoring update
M1ndSmith Jul 26, 2026
2419e4b
gitignore update
M1ndSmith Jul 26, 2026
195883f
Fix Vercel build: track frontend/src/lib client modules.
M1ndSmith Jul 26, 2026
81cdc00
Add slim Vercel deploy path for frontend + API only.
M1ndSmith Jul 27, 2026
ddf3a3c
Add Dockerfile.vercel for slim API deploy
M1ndSmith Jul 27, 2026
bc32f9e
Fix Next config so Vercel frontend builds without standalone
M1ndSmith Jul 27, 2026
96f0cef
Configure Vercel FastAPI entrypoint; drop root Dockerfile.vercel
M1ndSmith Jul 27, 2026
a46fbc8
Fix Vercel install by dropping untracked resilience_data from setupto…
M1ndSmith Jul 27, 2026
0541aa5
Switch slim Vercel API to Dockerfile.vercel past the 225MB limit.
M1ndSmith Jul 27, 2026
26e0332
Fix Vercel API deploy: clear Docker noop path, use FastAPI + slim ins…
M1ndSmith Jul 27, 2026
84b6a31
Fix Vercel analyze: write uploads/reports under /tmp.
M1ndSmith Jul 27, 2026
a2542b8
Keep Vercel API install on apps-only to stay under 225MB.
M1ndSmith Jul 27, 2026
08fe097
Export checklist_ready_for_golive required by the API entrypoint.
M1ndSmith Jul 27, 2026
a0e0195
Pin aspc-web to Next.js so monorepo deploys do not pick FastAPI.
M1ndSmith Jul 27, 2026
3aa7103
Enhanced UI
M1ndSmith Aug 12, 2026
1c67b92
Add Lab, onboarding, combinatorial tests, and operator docs.
M1ndSmith Aug 13, 2026
69e1d39
Fit the Vercel FastAPI function under 225 MB.
M1ndSmith Aug 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
135 changes: 135 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
# ASPC CI — Python core + frontend + Docker build

name: CI

on:
push:
branches: [main, master]
pull_request:
branches: [main, master]

jobs:
python:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.11", "3.12"]
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install uv
uses: astral-sh/setup-uv@v5
- name: Install package with dev extras
run: uv pip install --system -e ".[dev]"
- name: Ruff
run: ruff check spc_core adapters apps services sample_data resilience_data combinatorial scripts tests benchmarks
- name: Mypy (spc_core)
run: mypy spc_core --ignore-missing-imports
- name: Pytest
run: PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 pytest -q --tb=short -m "not integration"
- name: Resilience judgment report
run: PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python scripts/resilience_report.py
- name: Combinatorial sparse matrix
run: PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python -m combinatorial run --mode sparse --max-sparse 40
continue-on-error: true
- name: Accuracy benchmarks
run: python benchmarks/accuracy.py
- name: Acceptance — no stubs, all ChartTypes real
run: |
python - <<'PY'
import pathlib
root = pathlib.Path(".")
bad = []
for p in list(root.glob("spc_core/**/*.py")) + list(root.glob("adapters/**/*.py")) + list(root.glob("apps/**/*.py")) + list(root.glob("services/**/*.py")):
text = p.read_text(encoding="utf-8")
if "raise NotImplementedError" in text:
bad.append(str(p))
assert not bad, f"NotImplementedError stubs remain: {bad}"
from spc_core import ChartType, analyze_control_chart, establish
from spc_core.ewma import ewma_chart
from spc_core.cusum import cusum_chart
import numpy as np
x = np.random.default_rng(0).normal(10, 1, 40)
assert analyze_control_chart(x).chart_type == ChartType.I_MR
assert ewma_chart(x).limits.chart_type == ChartType.EWMA
assert cusum_chart(x).limits.chart_type == ChartType.CUSUM
pipe = establish(x)
recs = pipe.chart.to_records()
assert len(recs) == len(pipe.chart.plotted_values)
print("acceptance ok", len(recs), "records")
PY

integration:
runs-on: ubuntu-latest
needs: [python]
services:
timescaledb:
image: timescale/timescaledb:latest-pg16
env:
POSTGRES_USER: aspc
POSTGRES_PASSWORD: aspc
POSTGRES_DB: aspc
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U aspc -d aspc"
--health-interval 5s
--health-timeout 5s
--health-retries 10
redis:
image: redis:7-alpine
ports:
- 6379:6379
options: >-
--health-cmd "redis-cli ping"
--health-interval 5s
--health-timeout 3s
--health-retries 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- uses: astral-sh/setup-uv@v5
- name: Install package with dev extras
run: uv pip install --system -e ".[dev]"
- name: Integration tests
env:
ASPC_INTEGRATION: "1"
ASPC_PERSISTENCE_BACKEND: timescale
ASPC_TIMESCALE_DSN: postgresql+psycopg://aspc:aspc@localhost:5432/aspc
ASPC_REDIS_URL: redis://localhost:6379/0
ASPC_AUTH_ENABLED: "false"
ASPC_DEV_INSECURE: "1"
ASPC_JWT_SECRET: ci-integration-secret
run: PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 pytest -q --tb=short tests/integration

frontend:
runs-on: ubuntu-latest
defaults:
run:
working-directory: frontend
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "20"
cache: npm
cache-dependency-path: frontend/package-lock.json
- run: npm ci || npm install
- run: npm run lint
- run: npm run test
- run: npm run build

docker:
runs-on: ubuntu-latest
needs: [python]
steps:
- uses: actions/checkout@v4
- name: Build API image
run: docker build -f deploy/docker/Dockerfile.api -t aspc-api:ci .
- name: Build frontend image
run: docker build -f deploy/docker/Dockerfile.frontend -t aspc-frontend:ci .
29 changes: 25 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ develop-eggs/
dist/
eggs/
.eggs/
lib/
lib64/
# Only ignore packaging dirs at the repo root — do NOT ignore frontend/src/lib/
/lib/
/lib64/
parts/
sdist/
var/
Expand Down Expand Up @@ -166,11 +167,31 @@ tmp/
logs/

# Data files (uncomment if you don't want to track data)
# data_samples/
# *.csv

# API keys and secrets
.env.local
.env.production
secrets.json
config.json
config.json
# ASPC v2 runtime artifacts
aspc.db
*.db-journal
var/uploads/
var/reports/
examples/data/
resilience_data/JUDGMENT.md
combinatorial/out/static/
combinatorial/out/results.json
frontend/node_modules/
frontend/.next/
frontend/out/
deploy/compose/data/
*.parquet

# Local working notes (keep on disk, never commit)
refactoring/
refactoring elements/
benchmarks/
.vercel
.env*
Loading
Loading