scan_sbom.py reported 50 advisory matches against shipped components, 16 of them at or above HIGH. This clears all of them: the scan now reports 0 shipped findings and the gate passes. pyjwt 2.12.1 -> 2.13.0 idna 3.13 -> 3.19 axios 1.13.2 -> 1.20.0 (29 advisories) postcss 8.5.6 -> 8.5.26 dompurify 3.4.11 -> 3.4.14 nanoid 3.3.11 -> 3.3.18 follow-redirects 1.15.11 -> 1.16.0 form-data 4.0.5 -> 4.0.6 Every one is an in-major bump inside a range the manifests already allowed, so this is a lockfile refresh rather than a migration. The Python side was compiled with --upgrade-package for each name so nothing else moved; the diff is two version lines and their hashes. nanoid is worth recording: it is transitive under postcss at ^3.3.11, and its advisories are fixed on both the 3.x and 5.x branches. 3.3.18 is the fix that is actually reachable. The declared floors for axios and dompurify were raised to the versions in the lockfile. They were ^1.6.0 and ^3.4.11, which still nominally admitted the vulnerable range - npm resolves to the highest match so an install was never going to pick one, but the manifest should state the minimum safe version rather than rely on that. axios 1.20 adds optional proxy-agent support, which pulls https-proxy-agent and agent-base into the tree. Both are Node-only and neither reaches the browser bundle; the build was checked for them. The main chunk grew 256kB to 271kB (85.7kB to 90.5kB gzipped) from the rest of the axios delta. The PyJWT entry in the allowlist was removed rather than kept. It stopped matching the moment the upgrade landed, and an allowlist that accumulates entries for advisories that no longer apply is one nobody rereads. The reasoning is preserved as the worked example in docs/DEPENDENCY-SECURITY.md. Verified: full suite 2161 passed, frontend 273 passed, build clean, npm audit --omit=dev reports 0 vulnerabilities.
96 lines
4.4 KiB
Markdown
96 lines
4.4 KiB
Markdown
<!-- GENERATED by scripts/gen_project_map.py - do not edit by hand.
|
|
Regenerate with: venv/bin/python scripts/gen_project_map.py -->
|
|
|
|
# Project map
|
|
|
|
Derived from the code on every regeneration. If something here is wrong, the
|
|
code changed and the map was not regenerated - fix it by running the generator,
|
|
never by editing this file.
|
|
|
|
## Versions
|
|
|
|
| series | value | governed by |
|
|
|---|---|---|
|
|
| product `__version__` | `0.12.0` | ADR-007 |
|
|
| plugin contract `__contract_version__` | `0.25.0` | ADR-002 |
|
|
|
|
They move independently. A contract bump is not a release.
|
|
|
|
## Alembic chains (ADR-008)
|
|
|
|
Core runs with `flask db upgrade`; every plugin chain runs
|
|
with `flask plugin upgrade-all`. Both are needed on a deploy.
|
|
|
|
| chain | head |
|
|
|---|---|
|
|
| core | `7d34_singular_relationship_types` |
|
|
| backups | `backups0003clearlastseen` |
|
|
| computers | `computers0004policies` |
|
|
| employees | `employees0002photo` |
|
|
| endpoints | `endpoints0003cmdtarget` |
|
|
| geenforce | `geenforce0004minlib` |
|
|
| guides | `guides0001baseline` |
|
|
| knowledgebase | `knowledgebase0001anchor` |
|
|
| machines | `machines0002rename` |
|
|
| measuringtools | `measuringtools0001baseline` |
|
|
| network | `network0003prefix` |
|
|
| notifications | `notifications0005boardorder` |
|
|
| printedparts | `printedparts0004txnrev` |
|
|
| printers | `printers0005observedqueues` |
|
|
| slides | `slides0001anchor` |
|
|
| tools | `tools0001securesend` |
|
|
| usb | `usb0003scanfields` |
|
|
| warranty | `warranty0002proof` |
|
|
|
|
## Bundled plugins (17)
|
|
|
|
| plugin | version | core_version | owns migrations |
|
|
|---|---|---|---|
|
|
| backups | 1.0.0 | >=0.16.0,<1.0.0 | yes |
|
|
| computers | 1.0.0 | >=0.20.0,<1.0.0 | yes |
|
|
| employees | 1.0.0 | >=0.1.0,<1.0.0 | yes |
|
|
| endpoints | 0.1.0 | >=0.20.0,<1.0.0 | yes |
|
|
| geenforce | 0.1.0 | >=0.18.0,<1.0.0 | yes |
|
|
| guides | 1.0.0 | >=0.1.0,<1.0.0 | yes |
|
|
| knowledgebase | 1.0.0 | >=0.1.0,<1.0.0 | yes |
|
|
| machines | 1.0.0 | >=0.20.0,<1.0.0 | yes |
|
|
| measuringtools | 1.0.0 | >=0.20.0,<1.0.0 | yes |
|
|
| network | 1.0.0 | >=0.20.0,<1.0.0 | yes |
|
|
| notifications | 1.0.0 | >=0.1.0,<1.0.0 | yes |
|
|
| printedparts | 0.1.0 | >=0.16.0,<1.0.0 | yes |
|
|
| printers | 1.0.0 | >=0.20.0,<1.0.0 | yes |
|
|
| slides | 2.0.0 | >=0.2.0,<1.0.0 | yes |
|
|
| tools | 1.0.0 | >=0.16.0,<1.0.0 | yes |
|
|
| usb | 1.0.0 | >=0.1.0,<1.0.0 | yes |
|
|
| warranty | 1.0.0 | >=0.2.0,<1.0.0 | yes |
|
|
|
|
Manifest-less directories under `plugins/` are core frontend surface and always ship: `applications`.
|
|
|
|
## Architecture decisions
|
|
|
|
| ADR | title | status |
|
|
|---|---|---|
|
|
| ADR-001-asset-as-platform-contract.md | ADR-001: Asset model is the platform contract | ACCEPTED |
|
|
| ADR-002-plugin-versioning.md | ADR-002: Plugin contract versioning | ACCEPTED |
|
|
| ADR-003-plugin-distribution.md | ADR-003: Plugin distribution model | ACCEPTED |
|
|
| ADR-004-deployment-topology.md | ADR-004: Deployment topology (per-site instances) | ACCEPTED |
|
|
| ADR-005-equipment-vs-measuringtools.md | ADR-005: Equipment plugin scope vs measuringtools plugin | ACCEPTED |
|
|
| ADR-006-collector-contract.md | ADR-006: Plugin collector contract pattern | ACCEPTED |
|
|
| ADR-007-product-versioning-and-releases.md | ADR-007: Product versioning and releases | ACCEPTED |
|
|
| ADR-008-plugin-migration-ownership.md | ADR-008: Plugin migration ownership (per-plugin chains from the cutover) | ACCEPTED |
|
|
| ADR-009-frontend-plugin-gating.md | ADR-009: Frontend plugin gating | ACCEPTED |
|
|
| ADR-010-frontend-plugin-hooks.md | ADR-010: Frontend plugin hook contract | ACCEPTED |
|
|
| ADR-011-machines-rename.md | ADR-011: Rename the equipment domain to machines; retype the models catalog with modeltypes | ACCEPTED |
|
|
| ADR-012-geenforce-manifest-ownership.md | ADR-012: GE-Enforce manifest ownership in shopdb | ACCEPTED |
|
|
| ADR-013-plugin-catalog-and-lean-builds.md | ADR-013: Plugin Catalog, Curated Shelf, and Lean Per-Site Builds | ACCEPTED |
|
|
| ADR-014-schema-lean-per-site.md | ADR-014: Schema-lean per-site builds (retire cross-plugin FKs, lift plugin tables) | ACCEPTED |
|
|
| ADR-015-site-specific-configuration.md | ADR-015: Where a site's own data is allowed to live | ACCEPTED |
|
|
| ADR-016-credential-delivery.md | ADR-016: Credential delivery to the fleet | ACCEPTED (decided; NOT yet implemented - |
|
|
| ADR-017-buildings-and-levels.md | ADR-017: Buildings and levels as the map model | ACCEPTED |
|
|
|
|
## Size
|
|
|
|
- test functions defined: **1486** (parametrised cases collect higher)
|
|
- documented API paths: **333** (`docs/openapi.json`, regenerate with `scripts/gen_openapi.py`)
|
|
|