E. Process, CI & Release¶
Parent: Code Review Index Priority: every item here is small-effort and compounds Surface affected:
.github/workflows/,Dockerfile, repo root hygiene
E1 — Only one CI job; most backend tests are not gated¶
- Status: Open
- Impact: H | Complexity: L | Time: 1 D
- Files:
.github/workflows/dfm-vision-fusion-gate.yml, new.github/workflows/ci.yml
Finding. The only workflow is the DFM Vision Fusion Gate. It runs a subset of backend tests and a web build. The backend has 56 test files; the majority never run in CI.
Action for Codex.
1. Create ci.yml with three jobs:
- backend-fast — runs the full pytest suite with lightweight deps (no FreeCAD/OCC where possible; skip the ones that need them with markers).
- backend-full — runs the DFM/Vision/Fusion gate on the heavy image (what today's workflow does).
- web — Vitest unit tests + Playwright + npm run build.
2. Use pytest -m "not requires_freecad" for fast; pytest -m requires_freecad for full.
3. Add path filters so backend-full runs only on server changes; web only on web changes.
4. Fail CI on pytest failures, linter failures (after C6/D6), and build errors.
Acceptance criteria.
- Every push runs at least one job. PRs that change both surfaces run both.
- backend-fast completes in < 3 min; backend-full is allowed up to 15 min.
Depends on: B5 (pinned deps) makes CI reproducible.
E2 — CI installs unpinned deps¶
- Status: Open
- Impact: H | Complexity: L | Time: part of B5
- Files:
.github/workflows/dfm-vision-fusion-gate.yml:20-23
Finding. CI runs pip install -r server/requirements.txt against a floating set of versions. Green today, red tomorrow.
Action for Codex. Covered by B5: lock file, CI installs from the lock.
Acceptance criteria. See B5.
Depends on: B5 (same PR).
E3 — No linter / formatter gate in CI¶
- Status: Open
- Impact: M | Complexity: L | Time: 0.5 D
- Files:
.github/workflows/*.yml, newpyproject.tomlorruff.toml
Finding. Python has no ruff/black check; TS has no ESLint/Prettier check.
Action for Codex.
1. Add ruff for Python: pyproject.toml with a conservative starting config (select = ["E", "F", "UP", "I"]).
2. Add ruff check and ruff format --check to CI.
3. Add npm run lint to the web CI job (requires D6 first).
Acceptance criteria.
- CI fails on ruff errors and ESLint errors.
- Project passes on main.
Depends on: C6 (pyupgrade), D6 (ESLint setup).
E4 — No SBOM, Dependabot, or vulnerability scanning¶
- Status: Open
- Impact: M | Complexity: L | Time: 1 D
- Files:
.github/dependabot.yml(new),.github/workflows/security.yml(new)
Finding. For an enterprise-targeted tool this is table stakes. Nothing today tells the team when a dependency has a known CVE or a new version.
Action for Codex.
1. Add .github/dependabot.yml with weekly updates for pip, npm, github-actions, docker.
2. Add a security.yml workflow that runs:
- pip-audit -r server/requirements.txt (after B5)
- npm audit --audit-level=high in web/
- Optionally trivy against the built Docker image
3. Fail on high/critical findings.
4. Emit an SBOM (cyclonedx-bom for Python, npm sbom for Node) as a build artifact.
Acceptance criteria. - Dependabot PRs arrive weekly. - Security workflow runs on every push and produces SBOM artifacts.
Depends on: B5.
E5 — AGENTS.md references absolute Windows paths¶
- Status: Open
- Impact: M | Complexity: L | Time: 0.5 D
- Files:
AGENTS.md(top of repo)
Finding. AGENTS.md points to C:\Users\adeel\.codex\AGENTS.md and to personal OneDrive planning paths. Not reproducible for any collaborator; not reproducible for future-you on another machine. Per the existing AGENTS policy itself, planning docs should live in the wiki, not in absolute-path references.
Action for Codex. 1. Remove the absolute-path references. 2. Link to the wiki sections instead (the wiki is the canonical source — this review lives there too). 3. Keep the "repo scope" and "technical workflow" sections; remove the "central planning source" section that points at local paths.
Acceptance criteria.
- No absolute Windows paths in AGENTS.md.
- Links work when opening the file from any clone.
Depends on: none.
E6 — Repo root carries loose planning docs¶
- Status: Open
- Impact: L | Complexity: L | Time: 0.5 D
- Files:
claude_notes.md,gui-refresh.md,ISOMETRIC_IMPLEMENTATION.md,adddesignreview.pdf,library.md,projection_occ.md,projections.md,workflow.md,project.md
Finding. The repo's own AGENTS.md says implementation-local docs belong in docs/design-review/, docs/contracts/, or docs/validation/. Several root-level MD files and a PDF contradict that policy. They also clutter the GitHub landing page.
Action for Codex.
1. Review each file: keep, move into docs/, or delete.
2. project.md (deploy instructions) belongs in docs/ or a proper README.md.
3. Delete adddesignreview.pdf unless there is a reason to version a binary.
Acceptance criteria.
- Repo root contains only: README.md, AGENTS.md, Dockerfile, docker-entrypoint.sh, LICENSE (if added), start scripts, config files, and directories.
Depends on: E5 (AGENTS.md cleanup same pass).
E7 — server/requirements_pythonocc.txt is corrupt¶
- Status: Open
- Impact: L | Complexity: L | Time: 0.1 D
- Files:
server/requirements_pythonocc.txt
Finding. The file is stored as UTF-16 (or otherwise byte-mangled): cat outputs ��p y t h o n o c c - c o r e. Not currently consumed by the Dockerfile. Confuses anyone reading it.
Action for Codex.
1. Inspect git history for the intended content.
2. Either rewrite as plain UTF-8 with pythonocc-core pinned, or delete the file.
3. Document the FreeCAD/OCC install path in docs/contracts/runtime.md.
Acceptance criteria.
- file server/requirements_pythonocc.txt reports ASCII or UTF-8 (or file is gone).
Depends on: none.