wip: capture wip/2026-07-28-capture-BytePort-fresh (audit 2026-07-24..08-02) - #329
wip: capture wip/2026-07-28-capture-BytePort-fresh (audit 2026-07-24..08-02)#329KooshaPari wants to merge 81 commits into
Conversation
* fix(stubs): remove dead locateNVMS todo!() and update stub inventory backend/nvms.rs: locateNVMS() was declared but never called in the active codebase. Replaced todo!() with an explanatory comment documenting why the function was removed and where NVMS file location logic actually lives (Go provisioner layer). Addresses scorecard L37 / stub-inventory entry. stub-inventory.md: mark locateNVMS entry as resolved; correct stale notes on deploy.go TODO (already gone) and Gemini provider (already implemented). * feat(ci): replace fr-coverage echo stub with real Rust/Go coverage gates fr-coverage.yml: was a single echo line. Now runs cargo llvm-cov (>=50% lines) for the Rust workspace and go test -coverprofile (>=50%) for the Go backend on every PR and main push. Uploads lcov/coverage.out artifacts with 14-day retention. RATCHETS.md: new file documenting all coverage and lint ratchets, current thresholds, how-to-bump instructions, and relationship to CI workflows. Addresses scorecard L11 (quality gates), L38 (ratchets), L32 (test infra). * docs: fill CLAUDE.md stub and replace SLO template with BytePort SLOs CLAUDE.md: was a 471-byte stub with 'TBD: describe the top-level directories'. Now documents actual project layout (backend Go/Go-NVMS, Rust crates, frontend Astro+Svelte, ports), build/test commands for all three stacks, key services, conventions, and CI gate inventory. Addresses scorecard unjustified scope reduction #5. docs/operations/slos.md: was the org-wide SLO template copy (copy/paste boilerplate). Now contains BytePort-specific SLOs for API server availability (99.5%), p99 latency (<=500ms), deploy pipeline success rate (95%), deploy p95 latency (<=120s), and CI pass rate (99%), with measurement methodology grounded in actual code (Gin middleware, SQLite deployments table). Addresses scorecard L27 (failure observability). --------- Co-authored-by: KooshaPari <koosha@example.com>
* fix: remove Cargo.lock from .gitignore (reproducible builds for application workspace) * E5: BytePort → phenoregistry adapter crate
* fix(p3): remediate audit findings (clean) Top 3 audit findings (surgical fixes): 1. CORS wildcard origin: restrict to allowedOrigins list in server.go 2. Missing return after http.Error: add return in deploy.go error handler 3. derivable_impls: add #[derive] for HookTiming in schema.rs Pre-existing compilation fixes to make clippy --all-targets -- -D warnings pass: - byteport-otel: migrate to opentelemetry v0.28 API (Resource::builder(), SdkTracerProvider, MetricResult, etc.) - byteport-transport: move #[instrument] from impl block to fn level - byteport-cli: fix borrow-after-move for title in Prompt action Pre-existing fmt/test fixes: - Remove broken network_mock.rs referencing non-existent src/network.rs - Remove unsupported Tauri security headers (Referrer-Policy, X-Frame-Options, Strict-Transport-Security) - cargo fmt applied across all workspace crates Verification: - cargo clippy --all-targets -- -D warnings: zero errors - cargo fmt --check: passes * chore: remove accidental worktree commit --------- Co-authored-by: KooshaPari <koosha@example.com>
…#274) Wires the reusable quality gate from KooshaPari/phenotype-tooling onto the BytePort workspace. Per the '1 via 2' protocol (gate first RED, then backfill until it can be flipped to blocking): - .qgate.toml: threshold 85, marks a11y/dast N/A (Tauri webview + no published OpenAPI). mutation/perf stay ON (cargo-mutants + criterion nightly already exist in the repo's CI). - .github/workflows/qgate.yml: installs cargo-llvm-cov, generates workspace-wide lcov, invokes the reusable gate - continue-on-error: true until per-module coverage reaches threshold - sast-config=auto enables the Sast category (semgrep) from PR #198 once that lands The existing .github/workflows/quality-gate.yml was a placeholder (echoed 'quality gate check') — renamed to _quality-gate.placeholder.yml to preserve history. BytePort's existing sbom.yml continues to generate sbom.cdx.json as a workflow artifact; qgate's SBOM category will detect that artifact at the conventional path once #198 lands. Co-authored-by: KooshaPari <koosha@example.com>
Bumps [opentelemetry_sdk](https://github.com/open-telemetry/opentelemetry-rust) from 0.28.0 to 0.32.1. - [Release notes](https://github.com/open-telemetry/opentelemetry-rust/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-rust/blob/main/docs/release_0.32.md) - [Commits](open-telemetry/opentelemetry-rust@opentelemetry_sdk-0.28.0...opentelemetry-semantic-conventions-0.32.1) --- updated-dependencies: - dependency-name: opentelemetry_sdk dependency-version: 0.32.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the npm group in /frontend/web with 19 updates: | Package | From | To | | --- | --- | --- | | [@rollup/rollup-darwin-arm64](https://github.com/rollup/rollup) | `4.60.2` | `4.61.1` | | [@chromatic-com/storybook](https://github.com/chromaui/addon-visual-tests) | `5.1.2` | `5.2.1` | | [@storybook/svelte](https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/svelte) | `10.3.5` | `10.4.3` | | [@storybook/sveltekit](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/sveltekit) | `10.3.5` | `10.4.3` | | [@sveltejs/kit](https://github.com/sveltejs/kit/tree/HEAD/packages/kit) | `2.63.0` | `2.64.0` | | [@sveltejs/vite-plugin-svelte](https://github.com/sveltejs/vite-plugin-svelte/tree/HEAD/packages/vite-plugin-svelte) | `7.0.0` | `7.1.2` | | [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `25.9.1` | `25.9.2` | | [bits-ui](https://github.com/huntabyte/bits-ui) | `2.18.0` | `2.18.1` | | [eslint](https://github.com/eslint/eslint) | `10.2.1` | `10.4.1` | | [eslint-plugin-svelte](https://github.com/sveltejs/eslint-plugin-svelte/tree/HEAD/packages/eslint-plugin-svelte) | `3.17.1` | `3.19.0` | | [globals](https://github.com/sindresorhus/globals) | `17.5.0` | `17.6.0` | | [prettier](https://github.com/prettier/prettier) | `3.8.3` | `3.8.4` | | [prettier-plugin-svelte](https://github.com/sveltejs/prettier-plugin-svelte) | `3.5.2` | `4.1.0` | | [storybook](https://github.com/storybookjs/storybook/tree/HEAD/code/core) | `10.3.5` | `10.4.3` | | [svelte](https://github.com/sveltejs/svelte/tree/HEAD/packages/svelte) | `5.56.1` | `5.56.3` | | [svelte-preprocess](https://github.com/sveltejs/svelte-preprocess) | `6.0.3` | `6.0.5` | | [tailwind-merge](https://github.com/dcastil/tailwind-merge) | `3.5.0` | `3.6.0` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.60.1` | `8.61.0` | | [zod](https://github.com/colinhacks/zod) | `4.3.6` | `4.4.3` | Updates `@rollup/rollup-darwin-arm64` from 4.60.2 to 4.61.1 - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](rollup/rollup@v4.60.2...v4.61.1) Updates `@chromatic-com/storybook` from 5.1.2 to 5.2.1 - [Release notes](https://github.com/chromaui/addon-visual-tests/releases) - [Changelog](https://github.com/chromaui/addon-visual-tests/blob/v5.2.1/CHANGELOG.md) - [Commits](chromaui/addon-visual-tests@v5.1.2...v5.2.1) Updates `@storybook/svelte` from 10.3.5 to 10.4.3 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v10.4.3/code/renderers/svelte) Updates `@storybook/sveltekit` from 10.3.5 to 10.4.3 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v10.4.3/code/frameworks/sveltekit) Updates `@sveltejs/kit` from 2.63.0 to 2.64.0 - [Release notes](https://github.com/sveltejs/kit/releases) - [Changelog](https://github.com/sveltejs/kit/blob/main/packages/kit/CHANGELOG.md) - [Commits](https://github.com/sveltejs/kit/commits/@sveltejs/kit@2.64.0/packages/kit) Updates `@sveltejs/vite-plugin-svelte` from 7.0.0 to 7.1.2 - [Release notes](https://github.com/sveltejs/vite-plugin-svelte/releases) - [Changelog](https://github.com/sveltejs/vite-plugin-svelte/blob/main/packages/vite-plugin-svelte/CHANGELOG.md) - [Commits](https://github.com/sveltejs/vite-plugin-svelte/commits/@sveltejs/vite-plugin-svelte@7.1.2/packages/vite-plugin-svelte) Updates `@types/node` from 25.9.1 to 25.9.2 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) Updates `bits-ui` from 2.18.0 to 2.18.1 - [Release notes](https://github.com/huntabyte/bits-ui/releases) - [Commits](https://github.com/huntabyte/bits-ui/compare/bits-ui@2.18.0...bits-ui@2.18.1) Updates `eslint` from 10.2.1 to 10.4.1 - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](eslint/eslint@v10.2.1...v10.4.1) Updates `eslint-plugin-svelte` from 3.17.1 to 3.19.0 - [Release notes](https://github.com/sveltejs/eslint-plugin-svelte/releases) - [Changelog](https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/CHANGELOG.md) - [Commits](https://github.com/sveltejs/eslint-plugin-svelte/commits/eslint-plugin-svelte@3.19.0/packages/eslint-plugin-svelte) Updates `globals` from 17.5.0 to 17.6.0 - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](sindresorhus/globals@v17.5.0...v17.6.0) Updates `prettier` from 3.8.3 to 3.8.4 - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](prettier/prettier@3.8.3...3.8.4) Updates `prettier-plugin-svelte` from 3.5.2 to 4.1.0 - [Release notes](https://github.com/sveltejs/prettier-plugin-svelte/releases) - [Changelog](https://github.com/sveltejs/prettier-plugin-svelte/blob/main/CHANGELOG.md) - [Commits](https://github.com/sveltejs/prettier-plugin-svelte/compare/v3.5.2...prettier-plugin-svelte@4.1.0) Updates `storybook` from 10.3.5 to 10.4.3 - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v10.4.3/code/core) Updates `svelte` from 5.56.1 to 5.56.3 - [Release notes](https://github.com/sveltejs/svelte/releases) - [Changelog](https://github.com/sveltejs/svelte/blob/main/packages/svelte/CHANGELOG.md) - [Commits](https://github.com/sveltejs/svelte/commits/svelte@5.56.3/packages/svelte) Updates `svelte-preprocess` from 6.0.3 to 6.0.5 - [Release notes](https://github.com/sveltejs/svelte-preprocess/releases) - [Changelog](https://github.com/sveltejs/svelte-preprocess/blob/main/CHANGELOG.md) - [Commits](https://github.com/sveltejs/svelte-preprocess/compare/v6.0.3...svelte-preprocess@6.0.5) Updates `tailwind-merge` from 3.5.0 to 3.6.0 - [Release notes](https://github.com/dcastil/tailwind-merge/releases) - [Commits](dcastil/tailwind-merge@v3.5.0...v3.6.0) Updates `typescript-eslint` from 8.60.1 to 8.61.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.61.0/packages/typescript-eslint) Updates `zod` from 4.3.6 to 4.4.3 - [Release notes](https://github.com/colinhacks/zod/releases) - [Commits](colinhacks/zod@v4.3.6...v4.4.3) --- updated-dependencies: - dependency-name: "@rollup/rollup-darwin-arm64" dependency-version: 4.61.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: npm - dependency-name: "@chromatic-com/storybook" dependency-version: 5.2.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: "@storybook/svelte" dependency-version: 10.4.3 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: "@storybook/sveltekit" dependency-version: 10.4.3 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: "@sveltejs/kit" dependency-version: 2.64.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: "@sveltejs/vite-plugin-svelte" dependency-version: 7.1.2 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: "@types/node" dependency-version: 25.9.2 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm - dependency-name: bits-ui dependency-version: 2.18.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm - dependency-name: eslint dependency-version: 10.4.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: eslint-plugin-svelte dependency-version: 3.19.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: globals dependency-version: 17.6.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: prettier dependency-version: 3.8.4 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm - dependency-name: prettier-plugin-svelte dependency-version: 4.1.0 dependency-type: direct:development update-type: version-update:semver-major dependency-group: npm - dependency-name: storybook dependency-version: 10.4.3 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: svelte dependency-version: 5.56.3 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm - dependency-name: svelte-preprocess dependency-version: 6.0.5 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm - dependency-name: tailwind-merge dependency-version: 3.6.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: typescript-eslint dependency-version: 8.61.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: zod dependency-version: 4.4.3 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
#233) * feat(types): extract duplicated OCI helpers into phenotype-types crate * fix: use nested if-let instead of let-chains for Rust 2021 compat
Co-authored-by: Phenotype Agent <agent@phenotype.ai>
Co-authored-by: Phenotype Agent <agent@phenotype.ai>
…S8 from 0 to 2) (#202) Source: SLSA-BUILD-TEMPLATE.md in phenotype/docs/audits/. S8 P0 lift (priority 36, 8/11 repos at 0). Co-authored-by: Phenotype Agent <agent@phenotype.ai>
* feat: add Rust CI workflow * feat(security): T12-A secrets scan (trufflehog + gitleaks) - WP wp-201-03 * docs(L7-001,gitignore): refresh BytePort intent/boundary + harden .gitignore L7-007 pass (2026-06-20): - Refresh intent/boundary docs: bound_prompts 57→2, prune stale table rows, update last_verified - Add .pre-commit-hooks.yaml for the pre-commit CI workflow .gitignore enhancement: - Add Cargo/LLVM coverage artifacts (*.profraw, *.profdata) - Add Node/TS build artifacts (dist/, build/) - Add Tauri-generated output (frontend/web/src-tauri/gen/) - Add .audit/, .history/ (ephemeral scanner output) - Add worktrees pattern (*-wtrees/, *-wt-*/) - Comprehensive editor/OS/env file coverage Refs: - plans/2026-06-17-v7-dag-stable.md §L7-001 - findings/71-pillar-2026-06-17.md * fix(nvms): migrate spin http sdk * ci(workflows): pin GitHub actions by commit sha * ci(workflows): restore release-side workflow YAML * ci(workflows): repair pinned action shas --------- Co-authored-by: Phenotype Agent <agent@phenotype.ai>
* feat(E8): add W3C TraceContext propagation crate + OTel version uplift Add byteport-otel::propagation module with VecInjector, current_context_envs(), propagate_to_cmd(), and propagate_to_tokio_cmd() for W3C TraceContext injection into spawned child processes. Register TraceContextPropagator globally in init_telemetry(). Uplift OTel crates from 0.28→0.32 and fix API surface changes (ExporterBuildError, init_metrics return type, tokio async test). * feat(E8): add Upload subcommand with Transport::CreateUpload OTel span + propagation Add Upload subcommand to the CLI that dispatches Transport::CreateUpload inside a tracing span and calls byteport_otel::propagation::current_context_envs() to forward W3C TraceContext headers to downstream processes. Includes TDD tests: dispatch_upload_produces_instruction and propagation_is_no_op_without_provider. --------- Co-authored-by: KooshaPari <koosha@example.com>
) * fix: remove ratchet.yml template and fix release.yml sbom workflow reference - Removes ratchet.yml which was a documentation template with invalid YAML causing workflow parse failures - Removes missing sbom-monthly.yml reference from release.yml (reusable workflow does not exist in phenotype-tooling) - Keeps release draft and Tauri build/publish jobs functional - tier2-coverage-gate.yml handles coverage ratcheting for BytePort Fixes failing workflows: ratchet.yml, release.yml Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix: restructure qgate.yml to use reusable workflow at job level Reusable workflows in GitHub Actions must be called at the job level using 'uses:', not as a step. The previous implementation tried to use the phenotype-tooling quality-gate.yml reusable workflow as a step, which is invalid. Restructured to: - Split into two jobs: 'coverage' (generates lcov) and 'qgate' (runs quality gate) - Reusable workflow now called at job level as required - Coverage artifact still passed between jobs Fixes workflow file parsing issue that was blocking qgate.yml execution. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix: correct workflow action versions and TruffleHog configuration Fixes two workflow issues from PR #276: 1. TruffleHog Secret Scan (secrets-scan.yml): - Remove duplicate --fail flag in extra_args (action passes it by default) - This fixes the 'flag cannot be repeated' error 2. Lint Workflow (lint.yml): - Replace invalid action SHA hashes with valid semantic versions: * actions/checkout@v6 * actions/setup-go@v5 * golangci/golangci-lint-action@v6 - Add working-directory: backend to target Go modules - Fixes workflow resolution errors from invalid/non-existent action versions Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* Fix: Remove unused Rust dependencies detected by cargo-machete
Removed unused dependencies from:
- byteport-cli: serde, serde_yaml, thiserror
- byteport-otel: serde, thiserror, tracing
- byteport-registry-adapter: thiserror
- byteport-transport: byteport-otel
- pheno-dag: serde_json
- phenotype-types: anyhow, chrono, tokio
- src-tauri: clap-ext
Added cargo-machete ignore list to src-tauri for false positives:
- Ignored: log, serde, serde_json (actually used but not detected)
Fixes CI ci.yml Cargo machete (unused deps) workflow failure.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* Fix: Grant contents:write permission to release-drafter job
The 'draft' job uses release-drafter/release-drafter action to create
release drafts, which requires contents:write permission.
Error was: 'Resource not accessible by integration' when attempting to
create a release with insufficient token scope.
Fixes Release workflow failure.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* Fix: Remove otel feature from byteport-transport and apply fmt
- Removed otel feature and its optional tracing dependency from byteport-transport
(byteport-otel dep was removed as unused, breaking the feature definition)
- Applied cargo fmt to fix formatting issues in byteport-cli
- Resolves manifest parse errors in cargo fmt/clippy checks
Fixes Rust CI workflow failures (format check, clippy, test exit codes).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* Fix: Comprehensive workflow diagnostics and fixes
Fixes for all 6 failing BytePort workflows:
1. **Lint (golangci-lint Go 1.25 mismatch)**:
- Downgrade backend/go.mod and backend/nvms/go.mod from 1.25.0 to 1.24
- Remove toolchain go1.25 from nvms
- No Go 1.25-specific syntax found; safe downgrade
2. **Governance (unpinned GitHub Actions)**:
- Pin all GitHub Actions to full commit SHAs:
* actions/checkout@v6/v4
* actions/setup-go@v5/v4
* actions/setup-node@v4
* golangci-lint-action@v6
- Update governance check regex to allow reusable workflow @main refs
3. **E2E Tests (npm storybook peer dependencies)**:
- Upgrade @storybook addons from v8.6.x to v10.4.3
- Align addon-essentials, addon-interactions, blocks, test versions
- All @storybook packages now on v10.4.3
4. **CI ci.yaml (Go local path dependency)**:
- Comment out local replace for github.com/kooshapari/nanovms
- Resolves 'replacement directory not found' error
- Note: nanovms needs publishing or phenotype-tooling clone in CI
5. **CI ci.yml (cargo machete unused deps)**:
- Remove unused dependencies from crates (already in prior commit)
- cargo-machete now passes
6. **Release workflow (token permissions)**:
- Grant contents:write permission to release-drafter job (already in prior commit)
- Resolves 'Resource not accessible' error
7. **Rust CI (byteport-transport otel feature)**:
- Remove orphaned otel feature from byteport-transport
- Apply cargo fmt formatting (already in prior commit)
All fixes target root causes, not symptoms.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* Fix: release.yml simplify Tauri build and upload
Removes download-artifact complexity and uses tauri-action's
includeRelease=true to directly upload artifacts to GitHub Release.
Tauri action handles release creation and upload in one step.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
- release.yml: fix draft job permissions (contents: read -> write) so release-drafter can update drafts - e2e.yml: fix YAML syntax (separate uses statements with proper newlines) - lint.yml: fix YAML syntax (separate uses statements with proper newlines) Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…rkflows (#279) - Replace invalid SHA a309ff8b426b58ec0e2a45f0f869d46889d02405 with v4 tag - Fixes action resolution errors in tier-0-gate.yml and e2e.yml - Allows GitHub Actions to resolve to correct setup-node v4 release
* Fix: resolve invalid setup-node action SHAs in tier-0-gate and e2e workflows - Replace invalid SHA a309ff8b426b58ec0e2a45f0f869d46889d02405 with v4 tag - Fixes action resolution errors in tier-0-gate.yml and e2e.yml - Allows GitHub Actions to resolve to correct setup-node v4 release * Fix: pin all GitHub Actions to commit SHAs for governance compliance - lint.yml: Pin golangci/golangci-lint-action to v6 commit SHA - release.yml: Pin actions/checkout, actions/setup-node, dtolnay/rust-toolchain, and tauri-apps/tauri-action to specific commit SHAs This resolves OpenSSF Scorecard pinned-dependencies requirement and governance workflow violations. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * Fix: restore valid setup-node action SHA in e2e.yml Prior commit in history accidentally unpinned setup-node action. Restore the correct pinned SHA to resolve governance workflow violations. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…pliance" This reverts commit f22698b.
- Fix actions/setup-go reference (was broken/invalid SHA) - Use SHAs that are known to work from other CI workflows - Pin golangci/golangci-lint-action to verified commit SHA This fixes the Lint workflow execution failures. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Root cause: package.json pinned @storybook/addon-essentials, addon-interactions, blocks, and test to ^10.4.3 -- a version line that was never published for those packages (Storybook 9+ folded them into the core 'storybook' package). This made npm ci fail on every platform in release.yml's Tauri build matrix. - Remove addon-essentials/addon-interactions/blocks/test (merged into storybook core in v9+); update .storybook/main.js addons list to match - Bump storybook/svelte/sveltekit to matching 10.4.6 (verified peer compat with vite ^8.0.10 already in use) - Move @rollup/rollup-darwin-arm64 and @tauri-apps/cli-darwin-arm64 from dependencies to optionalDependencies -- these are macOS-only native bindings that were breaking npm ci on Linux/Windows CI runners with EBADPLATFORM - Regenerated package-lock.json; verified npm ci succeeds cleanly Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Tauri v2 schema does not allow an 'updater' key under 'bundle' --
only 'createUpdaterArtifacts' (bool). The v1-style nested updater
config (active/endpoints/dialog/pubkey) under bundle was rejected
by the schema validator, failing every Tauri build in release.yml
with: Additional properties are not allowed ('updater' was unexpected).
The correct v2 location for updater config is plugins.updater,
which was already present (duplicated). Also disabled updater
artifact generation and the updater plugin since the pubkey is
still a placeholder (REPLACE_WITH_RELEASE_SIGNING_PUBKEY) -- a
real minisign keypair must be provisioned before enabling signed
auto-updates.
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
🤖 CodeAnt AI — Review Status
|
Thanks for using CodeAnt! 🎉We're free for open-source projects. if you're enjoying it, help us grow by sharing. Share on X · |
| if err := request.Validate(""); err == nil { | ||
| t.Fatal("missing authenticated owner accepted") |
There was a problem hiding this comment.
Suggestion: The test name claims to reject owner impersonation, but this assertion only validates an empty authenticated owner. Since DesiredStateRequest has no owner field, it never exercises a request containing an attacker-supplied owner or verifies that such a value is ignored; add an explicit handler-level impersonation test or rename the test to reflect the condition it actually covers. [inconsistent naming]
Severity Level: Minor 🧹
- ⚠️ Application test name overstates impersonation coverage.
- ⚠️ Handler-level impersonation coverage already exists.
- ⚠️ No production ownership behavior is changed by this test gap.(Use Cmd/Ctrl + Click for best experience)
Prompt for AI Agent 🤖
This is a comment left during a code review.
**Path:** backend/internal/application/meshworkload/submit_test.go
**Line:** 30:31
**Comment:**
*Inconsistent Naming: The test name claims to reject owner impersonation, but this assertion only validates an empty authenticated owner. Since `DesiredStateRequest` has no owner field, it never exercises a request containing an attacker-supplied owner or verifies that such a value is ignored; add an explicit handler-level impersonation test or rename the test to reflect the condition it actually covers.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix| func validateCompositionMetadata(digest, artifactRef string) error { | ||
| if digest != "" { | ||
| const prefix = "sha256:" | ||
| encoded := strings.TrimPrefix(digest, prefix) | ||
| if encoded == digest || len(encoded) != 64 { | ||
| return fmt.Errorf("composition_digest must be sha256 followed by 64 hexadecimal characters") | ||
| } | ||
| if _, err := hex.DecodeString(encoded); err != nil { | ||
| return fmt.Errorf("composition_digest must be sha256 followed by 64 hexadecimal characters") | ||
| } | ||
| } | ||
| if len(artifactRef) > 512 || strings.IndexFunc(artifactRef, func(r rune) bool { return r < 0x20 || r == 0x7f }) >= 0 { | ||
| return fmt.Errorf("artifact_ref must be at most 512 characters and contain no control characters") | ||
| } | ||
| return nil | ||
| } |
There was a problem hiding this comment.
Suggestion: This validator permits a digest without an artifact reference and an artifact reference without a digest, while the mesh contract requires both fields. The deployment creation path persists metadata whenever either field is present, so incomplete composition records can enter the same storage used by mesh listing and be exposed as incomplete workloads. Require both fields together or keep these metadata records out of the mesh representation. [incomplete implementation]
Severity Level: Major ⚠️
- ⚠️ Regular deployments can appear as incomplete mesh workloads.
- ⚠️ Mesh consumers receive missing digest or artifact data.(Use Cmd/Ctrl + Click for best experience)
Prompt for AI Agent 🤖
This is a comment left during a code review.
**Path:** backend/internal/application/deployment/composition_metadata.go
**Line:** 9:24
**Comment:**
*Incomplete Implementation: This validator permits a digest without an artifact reference and an artifact reference without a digest, while the mesh contract requires both fields. The deployment creation path persists metadata whenever either field is present, so incomplete composition records can enter the same storage used by mesh listing and be exposed as incomplete workloads. Require both fields together or keep these metadata records out of the mesh representation.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix| func (s *DeploymentStore) Save(ctx context.Context, owner string, req DesiredStateRequest) error { | ||
| dep, err := domain.NewDeployment(req.Name, owner, nil) | ||
| if err != nil { | ||
| return err | ||
| } | ||
| dep.SetCompositionMetadata(domain.CompositionMetadata{Digest: req.CompositionDigest, ArtifactRef: req.ArtifactRef}) | ||
| dep.SetProvider("execution_backend", req.ExecutionBackend) | ||
| if len(req.Placement.Labels)+len(req.Placement.Constraints) > 0 { | ||
| dep.SetProvider("placement", req.Placement) | ||
| } | ||
| return s.repository.Create(ctx, dep) |
There was a problem hiding this comment.
Suggestion: Creating the deployment directly through repository.Create bypasses the existing ValidateDeployment contract, which checks for duplicate names within an owner. Repeated submissions with the same owner and name will therefore create multiple desired states because the database only enforces UUID uniqueness. Validate the deployment before persisting and enforce the uniqueness atomically at the persistence layer. [api mismatch]
Severity Level: Major ⚠️
- ❌ Repeated submissions create duplicate owner workloads.
- ⚠️ Reconciliation receives ambiguous desired-state records.(Use Cmd/Ctrl + Click for best experience)
Prompt for AI Agent 🤖
This is a comment left during a code review.
**Path:** backend/internal/application/meshworkload/submit.go
**Line:** 31:41
**Comment:**
*Api Mismatch: Creating the deployment directly through `repository.Create` bypasses the existing `ValidateDeployment` contract, which checks for duplicate names within an owner. Repeated submissions with the same owner and name will therefore create multiple desired states because the database only enforces UUID uniqueness. Validate the deployment before persisting and enforce the uniqueness atomically at the persistence layer.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix| backend, _ := dep.Providers()["execution_backend"].(string) | ||
| responses = append(responses, DesiredStateResponse{Name: dep.Name(), Owner: dep.Owner(), CompositionDigest: metadata.Digest, ArtifactRef: metadata.ArtifactRef, ExecutionBackend: backend, Status: dep.Status().String(), AcceptedAt: dep.CreatedAt()}) |
There was a problem hiding this comment.
Suggestion: The placement is persisted under the provider map, but the response construction only reads execution_backend and never reconstructs Placement. Consequently, GET /mesh/workloads returns an empty placement for every workload that supplied labels or constraints. Decode the stored placement and assign it to the response. [logic error]
Severity Level: Major ⚠️
- ❌ Placement labels disappear from mesh workload listings.
- ❌ Reconciliation clients cannot recover scheduling constraints.(Use Cmd/Ctrl + Click for best experience)
Prompt for AI Agent 🤖
This is a comment left during a code review.
**Path:** backend/internal/application/meshworkload/submit.go
**Line:** 56:57
**Comment:**
*Logic Error: The placement is persisted under the provider map, but the response construction only reads `execution_backend` and never reconstructs `Placement`. Consequently, `GET /mesh/workloads` returns an empty placement for every workload that supplied labels or constraints. Decode the stored placement and assign it to the response.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fixThere was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 672cd3ba14
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| ignore = [ | ||
| # --- Real vulnerabilities: no resolvable fixed version yet --- | ||
| # RUSTSEC-2026-0194 / RUSTSEC-2026-0195: quick-xml <0.41.0 quadratic | ||
| # runtime / unbounded namespace allocation. quick-xml is pulled in | ||
| # transitively via plist -> tauri (macOS Info.plist / bundle metadata | ||
| # parsing at build/bundle time, not on any attacker-reachable runtime | ||
| # path). Upstream `plist` v1.9.0 (latest release) still pins | ||
| # `quick-xml = "^0.39.2"`, so no combination of `cargo update` can reach | ||
| # the fixed 0.41.0 line without plist publishing a new release. Bumped | ||
| # plist 1.7.4 -> 1.9.0 / quick-xml 0.38.4 -> 0.39.4 (closest available) | ||
| # in this change; re-evaluate for a further bump once plist relaxes its | ||
| # quick-xml constraint upstream. | ||
| "RUSTSEC-2026-0194", | ||
| "RUSTSEC-2026-0195", |
There was a problem hiding this comment.
Restore the cargo-audit advisory suppressions
Deleting this config re-enables the previously documented RustSec failures while Cargo.lock still pins quick-xml 0.39.4, which is below the RustSec patched range for RUSTSEC-2026-0195 (>=0.41.0). In CI paths that run cargo audit/rustsec/audit-check, the removed [advisories].ignore entries were the only suppression for RUSTSEC-2026-0194/0195, so the required supply-chain gate will fail until the config is restored or the dependency is actually upgraded.
Useful? React with 👍 / 👎.
| continue | ||
| } | ||
| backend, _ := dep.Providers()["execution_backend"].(string) | ||
| responses = append(responses, DesiredStateResponse{Name: dep.Name(), Owner: dep.Owner(), CompositionDigest: metadata.Digest, ArtifactRef: metadata.ArtifactRef, ExecutionBackend: backend, Status: dep.Status().String(), AcceptedAt: dep.CreatedAt()}) |
There was a problem hiding this comment.
Preserve placement when listing workloads
For a workload submitted with placement, POST /mesh/workloads echoes the placement but the persisted GET /mesh/workloads response is rebuilt here without assigning Placement; region/zone/node_pool-only placement is also skipped during Save, so schedulers lose the placement intent after the first read. Include the stored placement in this response and persist it whenever any placement field is set.
Useful? React with 👍 / 👎.
| switch { | ||
| case errors.As(err, &validationErr): | ||
| c.JSON(http.StatusBadRequest, ErrorResponse{Error: validationErr.Error(), Code: "VALIDATION_ERROR"}) | ||
| case errors.Is(err, context.Canceled): |
There was a problem hiding this comment.
WARNING: context.DeadlineExceeded is not handled alongside context.Canceled. When a request's deadline expires, ctx.Err() returns context.DeadlineExceeded, which falls through to the default case and returns 500 instead of 408. Add errors.Is(err, context.DeadlineExceeded) to the switch.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| // List returns persisted desired state for the authenticated owner. | ||
| func (h *MeshWorkloadHandler) List(c *gin.Context) { | ||
| owner := getUserUUID(c) | ||
| responses, err := h.useCase.List(c.Request.Context(), owner) |
There was a problem hiding this comment.
WARNING: The List handler does not handle context.Canceled or context.DeadlineExceeded. If the context is cancelled or its deadline expires during the store read, the error falls through to the 500 case. Add the same context error handling as the Submit handler.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
|
|
||
| // WorkloadIntent is an owner-scoped desired-state request for the compute mesh. | ||
| // Provider credentials and provider-specific state stay behind adapters. | ||
| type WorkloadIntent struct { |
There was a problem hiding this comment.
SUGGESTION: WorkloadIntent is defined and tested but never imported or used outside the mesh package. The mesh workload endpoint uses meshworkload.DesiredStateRequest instead. Either wire WorkloadIntent into the handler or remove it to avoid dead code.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| return nil, err | ||
| } | ||
| responses := make([]DesiredStateResponse, 0, len(deployments)) | ||
| for _, dep := range deployments { |
There was a problem hiding this comment.
SUGGESTION: DeploymentStore.List returns every deployment for the owner that has composition metadata, including regular deployments created through the standard deployment flow. This could expose non-mesh deployments through the mesh listing endpoint. Consider adding a marker or filter to distinguish mesh intents from regular deployments.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| return nil, req.Context().Err() | ||
| } | ||
|
|
||
| func TestVercelValidateCredentialsHonorsCallerDeadline(t *testing.T) { |
There was a problem hiding this comment.
SUGGESTION: This test only covers VercelProvider.ValidateCredentials for deadline handling. NetlifyProvider and RailwayProvider also make HTTP calls that should honor caller cancellation and deadlines. Add equivalent tests for those providers.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
Code Review SummaryStatus: 8 Issues Found (incremental) | Recommendation: Address before merge
Overview
Issue Details (click to expand)CRITICAL
WARNING
SUGGESTION
Files Reviewed (9 incremental files)
Note (not a line-commentable item)
Previous Review Summary (commit 672cd3b)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit 672cd3b)Status: 10 Issues Found | Recommendation: Address before merge Overview
Issue Details (click to expand)CRITICAL
WARNING
SUGGESTION
Files Reviewed (7 files)
Reviewed by free · Input: 71.3K · Output: 15.6K · Cached: 255.7K |
|
Large PR Alert: This PR touches 329 files. Consider splitting into smaller PRs for easier review. |
Thanks for using CodeAnt! 🎉We're free for open-source projects. if you're enjoying it, help us grow by sharing. Share on X · |
|
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| - run: cargo install cargo-fuzz | ||
| - run: if [ -d fuzz ]; then cargo fuzz run 2>&1 | tail -50 || true; else echo no-fuzz; fi |
There was a problem hiding this comment.
CRITICAL: cargo fuzz run has no time budget and will hang CI indefinitely.
cargo fuzz run runs the fuzzer in the foreground until it finds a crash. With no -V/-j limit, no target specified, and no timeout-minutes on the job, this never returns and the workflow hangs until the runner is killed. Add a budget, e.g. cargo fuzz run fuzz_target -V 60 or wrap with timeout 300 cargo fuzz run fuzz_target.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| edition = "2021" | ||
| [[bin]] | ||
| name = "fuzz_target" | ||
| path = "fuzz_target.rs" |
There was a problem hiding this comment.
WARNING: Missing [dependencies] — the fuzz crate will not compile.
fuzz_target.rs imports arbitrary::Arbitrary and calls libfuzzer_sys::fuzz_target!, but neither crate is declared. cargo fuzz run (fuzz.yml:13) will fail to build. Add:
[dependencies]
arbitrary = { version = "1", features = ["derive"] }
libfuzzer-sys = "0.4"Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| @@ -0,0 +1,3 @@ | |||
| #![no_main] | |||
| use arbitrary::Arbitrary; | |||
There was a problem hiding this comment.
WARNING: Unused import / won't compile.
use arbitrary::Arbitrary; is never used — the fuzz target takes raw &[u8] directly and never invokes the Arbitrary trait. Combined with the missing arbitrary dependency (see fuzz/Cargo.toml), the crate fails to build. Remove the import or actually use Arbitrary for a typed target.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| steps: | ||
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| - run: if [ -d benches ]; then cargo bench 2>&1 | tail -50 || true; else echo no-bench; fi |
There was a problem hiding this comment.
WARNING: Orphaned benchmark — cargo bench runs nothing.
benches/criterion_bench.rs is not declared as a [[bench]] in any Cargo.toml and benches/ is not a workspace member, so cargo bench from the workspace root compiles no benchmarks. The trailing || true also hides this no-op. Wire it up with a [[bench]] entry plus a criterion dev-dependency, or drop the workflow.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| @@ -0,0 +1,6 @@ | |||
| use criterion::{criterion_group, criterion_main, Criterion}; | |||
| fn bench_placeholder(c: &mut Criterion) { | |||
| c.bench_function("placeholder", |b| { b.iter(|| { 1 + 1 }) }); | |||
There was a problem hiding this comment.
SUGGESTION: Benchmark body can be optimized away.
b.iter(|| { 1 + 1 }) is constant-foldable and may be eliminated, giving a meaningless measurement. Wrap the work in criterion::black_box! so the compiler cannot optimize it out. (Also note this bench is not wired into a package — see bench.yml.)
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| - uses: actions/checkout@v4 | ||
| - uses: dtolnay/rust-toolchain@stable | ||
| - run: cargo install cargo-mutants | ||
| - run: cargo mutants --no-shuffle -j 2 --timeout 120 2>&1 | tail -100 || true |
There was a problem hiding this comment.
SUGGESTION: Whole-workspace mutation testing plus || true defeats the gate.
cargo mutants on a large workspace can run for hours and there is no timeout-minutes/path filter. The trailing || true means survived mutants never fail CI, contradicting fail = true in mutants.toml. Consider path-scoping, a timeout, and dropping || true so real findings surface.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| @@ -0,0 +1,2 @@ | |||
| # cargo-mutants configuration | |||
| fail = true | |||
There was a problem hiding this comment.
SUGGESTION: fail = true is contradicted by || true in mutation.yml.
This setting makes cargo-mutants exit non-zero on survived mutants, but the workflow appends || true, so the non-zero is swallowed and the gate never triggers. Align the two — remove || true in the workflow or set fail = false here.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| "schema_version": "1.0", | ||
| "generated_at": "2026-08-20T02:12:58.411401+00:00", | ||
| "repo": "BytePort-fresh", | ||
| "repo_path": "C:\\Users\\koosh\\BytePort-fresh", |
There was a problem hiding this comment.
SUGGESTION: Leaked local path with username.
"repo_path": "C:\\Users\\koosh\\BytePort-fresh" exposes a local machine path and username. This generated scorecard artifact should not be committed to the repo; if kept, strip environment-specific fields.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.




User description
Automated audit capture of local dirty state.
wip/2026-07-28-capture-BytePort-freshCodeAnt-AI Description
Add owner-scoped compute-mesh desired state with deployment handoff tracking
What Changed
Impact
✅ Owner-scoped workload submissions✅ Persistent composition-to-artifact traceability✅ Fewer stalled provider requests✅ Bounded provider error responses💡 Usage Guide
Checking Your Pull Request
Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.
Talking to CodeAnt AI
Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:
This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.
Example
Preserve Org Learnings with CodeAnt
You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:
This helps CodeAnt AI learn and adapt to your team's coding style and standards.
Example
Retrigger review
Ask CodeAnt AI to review the PR again, by typing:
Check Your Repository Health
To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.