model-orchestrator 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -1
- package/README.md +1 -1
- package/docs/README.md +1 -0
- package/docs/catalog-advisories.md +116 -0
- package/docs/catalog-advisory-exceptions.json +1019 -0
- package/docs/catalog.md +1 -1
- package/docs/part-2-intermediate.md +1 -1
- package/llms.txt +1 -0
- package/package.json +1 -1
- package/src/README.md +1 -1
- package/src/catalog.js +6 -3
- package/templates/advanced/vm/ENVIRONMENT.md +9 -3
- package/templates/advanced/vm/jobs/README.md +22 -3
- package/templates/advanced/vm/jobs/weekly-audit.service +2 -1
- package/templates/advanced/vm/jobs/weekly-audit.sh +29 -7
- package/templates/agents/snippets/route-metrics.mjs +43 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,31 @@ All notable changes to this project are documented here. The format follows [Kee
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [1.0.4] - 2026-09-28
|
|
8
|
+
|
|
9
|
+
### Security
|
|
10
|
+
|
|
11
|
+
- Level 3 images move to `ghcr.io/berriai/litellm:v1.100.3` (from v1.99.1, 23 advisories to 9) and `ollama/ollama:0.34.4` (from 0.33.3). The advisories still inside those vendor images are recorded as reviewed exceptions that expire on 2026-10-28, so the check flags anything new and asks for a fresh review then.
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- The container advisory check records a Go binary's own unversioned module by name instead of reporting the whole image as unknown; any other package without a version still makes the image unknown.
|
|
16
|
+
|
|
17
|
+
## [1.0.3] - 2026-09-28
|
|
18
|
+
|
|
19
|
+
### Security
|
|
20
|
+
|
|
21
|
+
- Weekly audit jobs use an explicit child environment allowlist, keep selected worker configuration overrides out of probes, and preserve stored sign-in paths. See the generated jobs README for migration (#45).
|
|
22
|
+
- Catalog package and container pins get advisory checks with explicit coverage, dated machine-readable results and expiring advisory-specific exceptions. See [catalog advisory checks](docs/catalog-advisories.md) for operation and limitations (#46).
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- `aunx route-metrics --summary` compares the route your agent named in each reply with the delegation that actually followed, from data the log already records: the share of sessions that match, sessions that named a route and dispatched nothing, and sessions that dispatched without naming one.
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
|
|
30
|
+
- The product website navigation follows the section being read, keeps the active sidebar link visible, and labels its portfolio breadcrumb Home.
|
|
31
|
+
|
|
7
32
|
## [1.0.2] - 2026-09-28
|
|
8
33
|
|
|
9
34
|
### Fixed
|
|
@@ -525,7 +550,9 @@ First release.
|
|
|
525
550
|
- Tests: a case per fix, judges proven to go red, mutation checks; `npm test` prints the current count.
|
|
526
551
|
- Adversarial audit: two Codex rounds plus a two-engine review (Codex, Antigravity); findings and fixes in `docs/audit-brief.md`. After the review: subagents go to the project root (`--project`), snippet paths computed from `--dir`, lane sections rendered from the selection, a primary agent required, level 3 asks for API keys separately from CLIs, images and CLI installs pinned, an activation summary at the end of every install.
|
|
527
552
|
|
|
528
|
-
[Unreleased]: https://github.com/aunysillyme/model-orchestrator/compare/v1.0.
|
|
553
|
+
[Unreleased]: https://github.com/aunysillyme/model-orchestrator/compare/v1.0.4...HEAD
|
|
554
|
+
[1.0.4]: https://github.com/aunysillyme/model-orchestrator/compare/v1.0.3...v1.0.4
|
|
555
|
+
[1.0.3]: https://github.com/aunysillyme/model-orchestrator/compare/v1.0.2...v1.0.3
|
|
529
556
|
[1.0.2]: https://github.com/aunysillyme/model-orchestrator/compare/v1.0.1...v1.0.2
|
|
530
557
|
[1.0.1]: https://github.com/aunysillyme/model-orchestrator/compare/v1.0.0...v1.0.1
|
|
531
558
|
[1.0.0]: https://github.com/aunysillyme/model-orchestrator/compare/v0.1.35...v1.0.0
|
package/README.md
CHANGED
|
@@ -239,7 +239,7 @@ The lane wiring and the output judges were written against these versions, which
|
|
|
239
239
|
| `grok` | xAI | 1.0.5 | `test/fixtures/grok-1.0.5.json`, a recorded run |
|
|
240
240
|
| `hermes` | Nous Research | 0.20.0 | `test/fixtures/hermes-0.20.0.txt`, a recorded run |
|
|
241
241
|
| `qwen` | Alibaba | 0.22.3 | `test/fixtures/qwen-0.22.3-nokey.json`, a recorded run |
|
|
242
|
-
| `ollama` | Ollama | 0.
|
|
242
|
+
| `ollama` | Ollama | 0.34.4 | the pinned image the level 3 box runs, `ollama/ollama:0.34.4` |
|
|
243
243
|
|
|
244
244
|
Generated from `src/catalog.js` by `npm run gen:catalog`; `npm test` fails if this table and the catalog disagree. Fixtures were captured 2026-09-06.
|
|
245
245
|
|
package/docs/README.md
CHANGED
|
@@ -12,6 +12,7 @@ Use these pages for setup, operation and evidence. The [front page](../README.md
|
|
|
12
12
|
| [Intermediate](part-2-intermediate.md) | Delegation across several AI CLIs |
|
|
13
13
|
| [Advanced](part-3-advanced.md) | Gateway templates and scheduled work on a Linux host |
|
|
14
14
|
| [Catalog](catalog.md) | Supported tools, capability facts, unverified values, installation and sign-in notes |
|
|
15
|
+
| [Catalog advisory checks](catalog-advisories.md) | Package and container coverage, report statuses, exceptions and manual verification |
|
|
15
16
|
| [Security review history](security-review-history.md) | Review rounds, reproduced findings, fixes and regression tests |
|
|
16
17
|
| [Proof](../proof/README.md) | Dated measurements, methods, sample sizes and reproduction scripts |
|
|
17
18
|
| [Commands](../bin/README.md) | `aunx` subcommands and lane-runner exit codes |
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Catalog advisory checks
|
|
2
|
+
|
|
3
|
+
## What and why
|
|
4
|
+
|
|
5
|
+
The repository checks exact executable package and container pins in `src/catalog.js`. OSV API v1 answers direct npm and PyPI package/version queries. Trivy examines OS and language packages in the selected container image. This check gives dated advisory evidence for its stated coverage. A clean result does not prove safety.
|
|
6
|
+
|
|
7
|
+
The owning files are `scripts/catalog-advisory-inventory.mjs`, `scripts/check-catalog-advisories.mjs`, `scripts/catalog-advisory-http.mjs`, `scripts/catalog-advisory-containers.mjs`, `docs/catalog-advisory-exceptions.json` and `.github/workflows/catalog-advisories.yml`. This document describes the complete operating procedure.
|
|
8
|
+
|
|
9
|
+
## Trigger
|
|
10
|
+
|
|
11
|
+
The `catalog advisories` workflow runs on every push to main, on pull requests changing the catalog, checker, exceptions, tests or workflow, and by manual dispatch. It has read-only repository permissions. There is no periodic schedule; a maintainer can dispatch a fresh check when advisory data changes. Existing Dependabot automation continues to update GitHub Actions separately.
|
|
12
|
+
|
|
13
|
+
## Invocation chain
|
|
14
|
+
|
|
15
|
+
1. The workflow checks out the source and selects Node 22.
|
|
16
|
+
2. The inventory imports `AIS`, `TOOLS`, `IMAGES` and `PROVIDERS` directly from the catalog. npm names come from `install.npm`; companion ecosystem, package and extras come from their `advisory` metadata. Every version comes from the existing pin field.
|
|
17
|
+
3. The package adapter posts exact package/version queries to `https://api.osv.dev/v1/querybatch`, then retrieves each returned advisory from `/v1/vulns/<id>` to retain ranges and fixed versions.
|
|
18
|
+
4. The container adapter resolves target tags to a platform-specific SHA-256 manifest digest, checks the manifest and image configuration, and records the platform. Docker Hub and GHCR public images are supported; another registry is unknown until its adapter is implemented.
|
|
19
|
+
5. The adapter resolves the Trivy scanner image to a digest too, asserts its reported version, and runs that scanner against the target digest. It starts no target image or vendor service. Scanning uses registry access, with no host mounts or Docker socket passed into the scanner.
|
|
20
|
+
6. Exact, unexpired exceptions are applied. The checker writes `report.json` and `summary.md`, then exits with its result code. The workflow appends the summary to the job and uploads both files even if the scan step fails.
|
|
21
|
+
|
|
22
|
+
## Dependencies
|
|
23
|
+
|
|
24
|
+
A repository checkout, Node 18+ with built-in fetch, Docker with a running Linux-container daemon, public HTTPS registry access, OSV, and the Trivy vulnerability databases are needed for a complete local check. CI supplies Node 22 and Docker. Package checks need only Node and OSV. A missing scanner, daemon or database produces unknown container results while retaining available package results.
|
|
25
|
+
|
|
26
|
+
Trivy is version-pinned in `scripts/catalog-advisory-containers.mjs`. Each run resolves that scanner tag to an immutable digest and records it in each container result. Runtime version verification rejects a binary that reports a different version. The version probe has a 60-second deadline; image scans have Trivy's 10-minute deadline and a 12-minute client deadline, followed by bounded container cleanup. The scanner tag itself can move between runs; the recorded digest is the reproducible scanner identity for that run. For exact reproduction, fetch the scanner and target digests from the report before investigating.
|
|
27
|
+
|
|
28
|
+
Pin provenance, checked 2026-09-28 against upstream: `actions/checkout` `3d3c42e` is tag v7.0.1, `actions/setup-node` `8207627` is tag v7.0.0, and `actions/upload-artifact` `043fb46` is tag v7.0.1 in each action owner's repository. Trivy 0.74.0 is the latest release in Aqua Security's official repository (2026-08-14) and its public image tag resolves to `sha256:62b1e65e8869bc4b4c6aa4fa2b21595256c7c2f6018a9d9ad61caf87187c1969`. The first successful main-branch artifact is the check that the JSON parser matches this Trivy version.
|
|
29
|
+
|
|
30
|
+
To update the scanner, verify the desired release in Aqua Security's official Trivy repository, resolve its public registry tag to a digest, and inspect the pinned version's `image --help`, JSON report schema and database requirements. Change `TRIVY` in `scripts/catalog-advisory-containers.mjs`, run the offline fixtures, then run the real checker and inspect its recorded scanner digest and version. This builder could not compare the JSON parser with current official Trivy source; that compatibility is **UNVERIFIED** until a real scan passes. To update an action, compare its full commit SHA against the release tag in the action owner's repository and update the SHA and version comment together. Run the workflow and download the artifact before accepting either upgrade.
|
|
31
|
+
|
|
32
|
+
## Reads
|
|
33
|
+
|
|
34
|
+
- `src/catalog.js`: package names, ecosystems, extras, exact versions, image references and excluded inputs. A new companion without advisory metadata becomes unknown.
|
|
35
|
+
- `docs/catalog-advisory-exceptions.json`: the reviewed exception array, initially empty.
|
|
36
|
+
- OSV: current direct-package advisory matches and their details. No project files are sent.
|
|
37
|
+
- Public container registries: manifests, configurations, layers and anonymous pull authorization. Anonymous registry tokens stay in memory. User sign-ins are not read by the resolver; the Docker client receives an empty temporary configuration directory.
|
|
38
|
+
- Trivy databases: current OS and language advisories. All severities and unfixed findings are retained.
|
|
39
|
+
|
|
40
|
+
Direct package checks do not resolve dependency trees. Each such input has an explicit transitive-dependency exclusion. `codecalc[full]` also has an optional-extras exclusion: querying the base distribution does not cover dependencies selected by `full`. Vendor installer scripts, unpinned downloads/package-manager inputs, chat apps and hosted model services are named exclusions. Compatibility snapshots such as `builtAgainst` are not installation pins. Image coverage is the OS and language packages Trivy recognizes; unsupported OS images and empty package results are unknown.
|
|
41
|
+
|
|
42
|
+
## Writes
|
|
43
|
+
|
|
44
|
+
The default output directory is `.release-work/catalog-advisories/`. The checker writes:
|
|
45
|
+
|
|
46
|
+
- `report.json`: source commit, timestamp, scanner versions, catalog input, ecosystem, exact version, image/scanner digest, platform, coverage, status, advisory IDs, ranges, fixed versions and matched exception expiry.
|
|
47
|
+
- `summary.md`: the same result in a concise human-readable form, with explicit exclusions.
|
|
48
|
+
|
|
49
|
+
CI retains these as `catalog-advisories-<commit>-<attempt>` for 30 days and shows the summary in the job. An early workflow failure creates an unknown fallback report instead of presenting a missing report as success. The checker creates and removes an empty temporary Docker configuration directory. Scanner cache data lives under `/tmp/trivy` in its disposable writable container layer; `--rm` removes that layer. A disk-backed layer accommodates large image scans without a small RAM-backed cache cap. The scanner runs as a nonroot user with capabilities dropped, no new privileges, and no host filesystem or socket mounts. Live disk usage is **UNVERIFIED** here. Catalog pins and installed dependencies are never changed.
|
|
50
|
+
|
|
51
|
+
## The closed loop
|
|
52
|
+
|
|
53
|
+
GitHub Actions is the watcher. A maintainer reviews every affected or unknown result before merging or releasing. No automatic issue, upgrade, exception or release is created by this workflow. Branch-protection configuration is repository administration: **UNVERIFIED** here. To make a green check mandatory, require the `catalog advisories / scan` check in the repository's branch rules.
|
|
54
|
+
|
|
55
|
+
| Status | Meaning | Exit behavior |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| clean | Complete adapter response with no advisory match in stated coverage | 0 if every result is clean or excepted |
|
|
58
|
+
| affected | At least one advisory match lacks a valid exception | 1 unless another result is unknown |
|
|
59
|
+
| unknown | Missing, unavailable, unsupported or malformed evidence, or an invalid exception policy | 2 |
|
|
60
|
+
| excepted | Every advisory match has an exact, reviewed, unexpired exception | 0 if every result is clean or excepted |
|
|
61
|
+
|
|
62
|
+
A Go binary built without module version stamping lists its own main module with no version (Trivy marks it `Relationship: root` in a language-package result). Its dependencies are still listed and scanned, so that one entry is recorded by name in `unversionedRoots` and does not make the image unknown. Any other package without a version keeps the image unknown.
|
|
63
|
+
|
|
64
|
+
Any unknown takes precedence over affected for the exit code. Known advisory IDs are still retained when a detail lookup fails. Empty results never pass. Read the exclusions alongside the status; exclusions are never counted as clean pins.
|
|
65
|
+
|
|
66
|
+
## Failure modes
|
|
67
|
+
|
|
68
|
+
- **OSV timeout, HTTP error or malformed response:** package results become unknown. A valid empty query result (`{}`) means no returned match; a missing result array or missing position is unknown.
|
|
69
|
+
- **Registry failure, bad image reference, missing platform or digest mismatch:** the image is unknown. The checker retains the other results.
|
|
70
|
+
- **Docker, scanner or database failure:** the image is unknown. No exception suppresses unknown status. Check network access and the daemon, then rerun the same source.
|
|
71
|
+
- **Incomplete scanner JSON, mismatched digest/platform or unsupported image OS:** the image is unknown even if the process exited successfully.
|
|
72
|
+
- **Advisory outage:** keep the failing result, retry after recovery, and inspect the provider's status through its normal support channel. An outage is not an exception for a package.
|
|
73
|
+
- **Expired or malformed exception:** expired entries stop matching at 00:00 UTC on their expiry date; malformed policy blocks success. Expired entries are retained in `expiredExceptions` for review.
|
|
74
|
+
- **Interrupted job:** `always()` upload and summary steps preserve available evidence. A runner outage can still prevent artifact upload; verify artifact presence in the run itself.
|
|
75
|
+
|
|
76
|
+
## Exception review
|
|
77
|
+
|
|
78
|
+
The exception file is a JSON array. Every entry requires `ecosystem`, `package`, `version`, `advisory`, `rationale` and `expires` (`YYYY-MM-DD`). Wildcards and unknown fields are rejected. Match the exact advisory ID emitted by the adapter, not an alias. A package exception optionally names its exact catalog `source` in `target`. A container exception requires `target` equal to the exact catalog image reference and identifies the vulnerable component package and installed version, not every component in the image.
|
|
79
|
+
|
|
80
|
+
For example, a metadata-only example is:
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
[
|
|
84
|
+
{
|
|
85
|
+
"ecosystem": "npm",
|
|
86
|
+
"package": "fixture-package",
|
|
87
|
+
"version": "1.0.0",
|
|
88
|
+
"advisory": "TEST-2026-0001",
|
|
89
|
+
"rationale": "Example only: replace with a reviewed reason and tracking reference.",
|
|
90
|
+
"expires": "2026-10-01"
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
A maintainer reviews the affected range, fixed versions, applicability, expiry and rationale in a normal pull request. Use a short explicit expiry and a tracking reference in the rationale. Never add an exception merely because the database or scanner is unavailable. Review expired entries and remove those whose pin or advisory is no longer relevant. A matched exception remains visible as excepted with its expiry; it is never relabeled clean. Fixing a package requires a separate deliberate catalog-pin change and the usual installer validation.
|
|
96
|
+
|
|
97
|
+
## Run and verify by hand
|
|
98
|
+
|
|
99
|
+
From the repository checkout:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
node --test test/catalog-advisories.test.js
|
|
103
|
+
node scripts/check-catalog-advisories.mjs --report-dir .release-work/catalog-advisories
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
The fixture tests use metadata only and make no network request. The second command makes real advisory and registry requests and may start the pinned scanner container. Use `--platform linux/arm64` to inspect another declared image platform; the default is `linux/amd64`. Use `--exceptions <path>` for a reviewed alternate policy and retain that file with the evidence.
|
|
107
|
+
|
|
108
|
+
1. Read both output files and check `sourceCommit`, `generatedAt`, every catalog source, scanner identity, platform and exclusions.
|
|
109
|
+
2. For a package finding, retrieve its recorded OSV detail URL and compare the affected package, ranges and fixed versions. The fixture's affected result must exit 1; an unavailable-data result must exit 2.
|
|
110
|
+
3. For an image finding, pull the recorded scanner digest and run its `image --scanners vuln --list-all-pkgs --format json --platform <platform> --image-src remote <image>@<digest>` command. Compare the component name, installed version, advisory ID and database evidence. A later database can change matches while the image stays identical.
|
|
111
|
+
4. Inspect the GitHub run on main and download its report artifact. A local report is not proof of main-branch retention. Re-run the workflow after an outage and confirm a new timestamp.
|
|
112
|
+
5. Run `npm test` before releasing. Existing OIDC publication and installer flags are unchanged by this check.
|
|
113
|
+
|
|
114
|
+
## Source of truth
|
|
115
|
+
|
|
116
|
+
Catalog pins and companion metadata: `src/catalog.js`. Exception decisions: `docs/catalog-advisory-exceptions.json` and its reviewed change. Operational behavior: this document and the checker modules. Dated evidence: the uploaded GitHub run artifact. Upstream evidence: each report's OSV URL and Trivy data-source URL. A report describes the source commit, selected platform and database responses at its recorded time; it is not a permanent certificate.
|