Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
9a0b781
ci: pin Rust 1.97.1 in product verification
seonghobae Aug 19, 2026
31dd835
ci: pin Rust 1.97.1 in release preflight
seonghobae Aug 19, 2026
9ba4f21
ci: pin Rust 1.97.1 in dependency audit
seonghobae Aug 19, 2026
08d524e
ci: pin Rust 1.97.1 across release architectures
seonghobae Aug 19, 2026
dfa2611
build: pin Rust 1.97.1
seonghobae Aug 19, 2026
7bc959d
test: enforce the reviewed Rust compiler baseline
seonghobae Aug 19, 2026
47da94a
test: run the Rust toolchain contract in quickcheck
seonghobae Aug 19, 2026
1b3870e
ci: track the pinned Rust toolchain
seonghobae Aug 19, 2026
120d113
docs: record the Rust compiler authority
seonghobae Aug 19, 2026
030922b
test(rust): cover pinned toolchain policy guard
seonghobae Aug 19, 2026
69c0a25
test(rust): reject cross-lane Dependabot evidence
seonghobae Aug 19, 2026
3ba24ba
fix(rust): bind Dependabot policy to toolchain lane
seonghobae Aug 19, 2026
c951edf
docs(rust): correct toolchain authority sources
seonghobae Aug 19, 2026
8c99736
test(rust): reject cross-workflow compiler evidence
seonghobae Aug 19, 2026
cde3084
fix(rust): bind compiler evidence to owning workflows
seonghobae Aug 19, 2026
316ef6d
test(rust): model workflow-owned compiler contracts
seonghobae Aug 19, 2026
85a349f
test(rust): reject cross-job compiler evidence
seonghobae Aug 19, 2026
063c588
fix(rust): bind compiler evidence to owning jobs
seonghobae Aug 19, 2026
9def786
test(rust): model job-owned compiler contracts
seonghobae Aug 19, 2026
8b206a7
test(rust): reject non-executing toolchain evidence
seonghobae Aug 19, 2026
420dfbd
fix(rust): require executable workflow evidence
seonghobae Aug 19, 2026
3342efb
test(rust): reject commented Dependabot evidence
seonghobae Aug 19, 2026
e8981fc
fix(rust): validate effective Dependabot lane fields
seonghobae Aug 19, 2026
57ab593
test(rust): bind supply-chain audit to pinned toolchain
seonghobae Aug 19, 2026
cdf5d56
fix(rust): align supply-chain audit with pinned toolchain
seonghobae Aug 19, 2026
35600dd
fix(ci): satisfy Ruff toolchain test lint
seonghobae Aug 19, 2026
1bf7f7c
fix(ci): normalize Ruff import grouping
seonghobae Aug 19, 2026
dd6b8fd
fix(tests): satisfy Ruff import ordering
seonghobae Aug 19, 2026
35dd5b5
fix(ci): satisfy Ruff import grouping
seonghobae Aug 19, 2026
2d3fd13
test(rust): align supply-chain import layout
seonghobae Aug 20, 2026
d244ee6
test(rust): fix supply-chain import grouping
seonghobae Aug 20, 2026
245486a
test(rust): reject masked toolchain evidence
seonghobae Aug 20, 2026
e476bc9
fix(rust): reject failure-masked workflow evidence
seonghobae Aug 20, 2026
a8dbacd
docs(rust): record unmasked command evidence
seonghobae Aug 20, 2026
94ea841
chore(changelog): record Rust evidence hardening
seonghobae Aug 20, 2026
8c53e91
fix(ci): format Rust toolchain supply-chain test
seonghobae Aug 20, 2026
52099e3
style(tests): satisfy Ruff import grouping
seonghobae Aug 20, 2026
bbdbadf
test(rust): restore Ruff import grouping
seonghobae Aug 20, 2026
35c1f03
test(rust): remove incidental pytest import from toolchain contract
seonghobae Aug 20, 2026
8038fd2
test(rust): restore formatter-clean pytest typing
seonghobae Aug 20, 2026
68a54e4
style(tests): separate local toolchain test import
seonghobae Aug 20, 2026
3369ad2
style(tests): organize Rust toolchain contract imports
seonghobae Aug 20, 2026
a953491
style(tests): align Rust toolchain import groups
seonghobae Aug 20, 2026
b0bc4a9
test(rust): satisfy Ruff import grouping
seonghobae Aug 20, 2026
279710b
test(rust): format supply-chain regression imports
seonghobae Aug 20, 2026
bda03da
style(test): align rust toolchain imports with Ruff
seonghobae Aug 20, 2026
8553647
style(test): separate local conftest import
seonghobae Aug 21, 2026
2f1d013
test(rust): align supply-chain regression imports
seonghobae Aug 21, 2026
cecab72
test(rust): restore Ruff import grouping
seonghobae Aug 21, 2026
fb4426b
fix(rust): format supply-chain regression imports
seonghobae Aug 21, 2026
00bee2f
style(rust-toolchain): satisfy ruff import grouping
seonghobae Aug 21, 2026
9fbfbcb
test(rust-toolchain): reject nested run-shaped evidence
seonghobae Aug 21, 2026
261fa25
fix(rust-toolchain): bind evidence to actual step run keys
seonghobae Aug 21, 2026
cfab395
test(ci): format Rust supply-chain regression imports
seonghobae Aug 21, 2026
2aad4e0
test: format Rust toolchain contract imports
seonghobae Aug 22, 2026
0d92637
test(rust): apply repository Ruff import grouping
seonghobae Aug 22, 2026
98c064e
test(rust): remove unnecessary pytest type-only import
seonghobae Aug 22, 2026
b0f8cf0
test(rust): satisfy Ruff import block spacing
seonghobae Aug 22, 2026
7e50816
test(ci): require desktop core Rust integration gate
seonghobae Aug 28, 2026
8a6c3ec
fix(ci): require desktop core integration tests
seonghobae Aug 28, 2026
52bfe4c
fix(ci): execute desktop core integration contracts
seonghobae Aug 28, 2026
41ab91a
fix(policy): add bounded PR 944 stale-audit repair
seonghobae Sep 2, 2026
44ef01d
fix(policy): execute bounded PR 944 stale-audit repair
seonghobae Sep 2, 2026
ba9939e
fix(policy): preserve AST line ranges in PR 944 repair
seonghobae Sep 2, 2026
da3cd63
fix(policy): isolate PR 944 write credential to publication
seonghobae Sep 2, 2026
b49b4dc
fix(policy): create missing BandScope gap baseline during repair
seonghobae Sep 2, 2026
5b2bd6a
fix(policy): include untracked baseline in repair scope guard
seonghobae Sep 2, 2026
5b80d4f
fix(ci): scope PR 944 repair helper to test contract
seonghobae Sep 2, 2026
d95efbf
fix(ci): make PR 944 transition repair self-removing
seonghobae Sep 2, 2026
ba4e7c1
fix(policy): align Rust audit regression contract
Sep 2, 2026
e1511e4
fix(ci): reconcile Rust pin with current develop
seonghobae Sep 2, 2026
49e7507
fix(release): reconcile Rust pin with current develop
seonghobae Sep 2, 2026
1b66a9c
fix(security): reconcile Rust audit pin with current develop
seonghobae Sep 2, 2026
2725c3b
fix(build): reconcile Rust pin with current develop
seonghobae Sep 2, 2026
b7a752d
docs(changelog): preserve develop history during Rust reconciliation
seonghobae Sep 2, 2026
762cdfe
merge(develop): reconcile current Rust toolchain lane
seonghobae Sep 2, 2026
926296f
docs(product): establish live technical gap baseline
seonghobae Sep 2, 2026
6d0f120
test(ci): keep Rust policy success fixture contract-complete
seonghobae Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
version: 2
updates:
- package-ecosystem: "rust-toolchain"
directory: "/"
target-branch: "develop"
schedule:
interval: "weekly"
open-pull-requests-limit: 1
labels:
- "dependencies"
- "rust"

- package-ecosystem: "npm"
directory: "/"
target-branch: "develop"
Expand Down
24 changes: 12 additions & 12 deletions .github/workflows/build-baseline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,10 @@ jobs:
with:
version: "0.8.6"
enable-cache: false
- name: Install Rust stable
run: rustup toolchain install stable --profile minimal
- name: Install Rust 1.97.1
run: rustup toolchain install 1.97.1 --profile minimal
- name: Add Windows target
run: rustup target add $env:BANDSCOPE_TARGET_TRIPLE --toolchain stable
run: rustup target add $env:BANDSCOPE_TARGET_TRIPLE --toolchain 1.97.1
- name: Verify Windows antivirus baseline
shell: pwsh
run: |
Expand Down Expand Up @@ -146,10 +146,10 @@ jobs:
with:
version: "0.8.6"
enable-cache: false
- name: Install Rust stable
run: rustup toolchain install stable --profile minimal
- name: Install Rust 1.97.1
run: rustup toolchain install 1.97.1 --profile minimal
- name: Add Windows arm target
run: rustup target add $env:BANDSCOPE_TARGET_TRIPLE --toolchain stable
run: rustup target add $env:BANDSCOPE_TARGET_TRIPLE --toolchain 1.97.1
- name: Verify Windows antivirus baseline
shell: pwsh
run: |
Expand Down Expand Up @@ -256,10 +256,10 @@ jobs:
with:
version: "0.8.6"
enable-cache: false
- name: Install Rust stable
run: rustup toolchain install stable --profile minimal
- name: Install Rust 1.97.1
run: rustup toolchain install 1.97.1 --profile minimal
- name: Add macOS Intel target
run: rustup target add "$BANDSCOPE_TARGET_TRIPLE" --toolchain stable
run: rustup target add "$BANDSCOPE_TARGET_TRIPLE" --toolchain 1.97.1
- name: Install create-dmg
run: brew install create-dmg
- name: Activate and verify pinned npm runtime
Expand Down Expand Up @@ -318,10 +318,10 @@ jobs:
with:
version: "0.8.6"
enable-cache: false
- name: Install Rust stable
run: rustup toolchain install stable --profile minimal
- name: Install Rust 1.97.1
run: rustup toolchain install 1.97.1 --profile minimal
- name: Add macOS arm target
run: rustup target add "$BANDSCOPE_TARGET_TRIPLE" --toolchain stable
run: rustup target add "$BANDSCOPE_TARGET_TRIPLE" --toolchain 1.97.1
- name: Install create-dmg
run: brew install create-dmg
- name: Activate and verify pinned npm runtime
Expand Down
14 changes: 8 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ jobs:
run: npm ci
- name: Sync Python dependencies
run: uv sync --project services/analysis-engine --group dev --frozen
- name: Install stable Rust toolchain
run: rustup toolchain install stable --profile minimal
- name: Install Rust 1.97.1 toolchain
run: rustup toolchain install 1.97.1 --profile minimal
- name: Build and install Rust numeric extension
run: |
VENV_PY="$PWD/services/analysis-engine/.venv/bin/python"
Expand Down Expand Up @@ -99,13 +99,15 @@ jobs:
run: |
test "$(npm --version)" = "$EXPECTED_NPM_VERSION"
npm run check:npm-runtime
- name: Install stable Rust toolchain
run: rustup toolchain install stable --profile minimal
- name: Install Rust 1.97.1 toolchain
run: rustup toolchain install 1.97.1 --profile minimal
- name: Install node dependencies
run: npm ci
- name: Build frontend
run: npm run build --workspace @bandscope/desktop
- name: Check Tauri shell
run: cargo +stable check --manifest-path apps/desktop/src-tauri/Cargo.toml --locked
run: cargo +1.97.1 check --manifest-path apps/desktop/src-tauri/Cargo.toml --locked
- name: Test Tauri shell
run: cargo +stable test --manifest-path apps/desktop/src-tauri/Cargo.toml --locked
run: cargo +1.97.1 test --manifest-path apps/desktop/src-tauri/Cargo.toml --locked
- name: Test desktop core integration contracts
run: cargo +1.97.1 test --manifest-path apps/desktop/core/Cargo.toml --locked
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ jobs:
with:
version: "0.8.6"
enable-cache: false
- name: Install Rust stable
run: rustup toolchain install stable --profile minimal
- name: Install Rust 1.97.1
run: rustup toolchain install 1.97.1 --profile minimal
- name: Activate and verify pinned npm runtime
run: |
corepack enable npm
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/security-audit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ jobs:
run: uv sync --project services/analysis-engine --group dev --frozen
- name: Audit Python dependencies
run: uv run --project services/analysis-engine --with pip-audit==2.8.0 pip-audit --local --strict
- name: Install stable Rust toolchain
run: rustup toolchain install stable --profile minimal
- name: Install Rust 1.97.1 toolchain
run: rustup toolchain install 1.97.1 --profile minimal
- name: Install cargo-audit
run: cargo +stable install cargo-audit --locked
run: cargo +1.97.1 install cargo-audit --locked
- name: Audit Rust dependencies
working-directory: apps/desktop/src-tauri
run: cargo +stable audit
run: cargo +1.97.1 audit
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
### Changed

- Pinned npm `10.9.9` as the approved lockfile generator, activated it through Node-bundled Corepack before dependency consumption, and fail closed unless its bundled `tar` is at least `7.5.19`; primary CI still consumes the committed lock only through frozen `npm ci` validation, rejects mutable npm resolution in the lock gate, requires integrity evidence for public-registry lock entries, and preserves generator-sensitive root `@esbuild/*` peer metadata.
- Pin repository-owned Rust build, audit, release, and native packaging evidence to Rust 1.97.1, and fail closed when required Rust commands are hidden in non-executing text, borrowed from another workflow/job, or chained through shell control flow that can mask their exit status.

### Fixed

Expand Down Expand Up @@ -74,4 +75,4 @@

- `ChordsFeature` (코드 분석) 화면에서 각 파트(Role)의 `transpositionPlan`(이조/조옮김 계획)을 표시하는 기능을 추가했습니다.
- `RangesFeature` (음역대 분석) 화면에서 겹침 경고(Overlap warning) 외에 해당 파트의 채보(Transcription) 가능 노드 수를 요약하여 보여주는 기능을 추가했습니다.
- 신규 UI 요소에 대한 단위 테스트를 추가했습니다 (`apps/desktop/src/features/chords/index.test.tsx`, `apps/desktop/src/features/ranges/index.test.tsx`).
- 신규 UI 요소에 대한 단위 테스트를 추가했습니다 (`apps/desktop/src/features/chords/index.test.tsx`, `apps/desktop/src/features/ranges/index.test.tsx`).
51 changes: 51 additions & 0 deletions docs/doctoring/rust-toolchain-freshness.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Rust toolchain freshness and reproducibility

## Decision

BandScope pins Rust `1.97.1` as the repository build compiler. The root
`rust-toolchain.toml`, product CI, release preflight, dependency audit, and
Windows/macOS amd64/arm64 packaging workflows all use that exact point release.
A floating `stable` selector is not accepted because it can change scientific,
security, and release evidence without a repository diff.

The compiler pin does not add or raise `package.rust-version` in the workspace.
This change governs BandScope's reviewed build environment; it does not create a
new downstream minimum-supported-Rust promise for reusable crates.

GitHub Dependabot monitors the root manifest through the `rust-toolchain`
ecosystem against the protected `develop` branch. GitHub documents this
integration as a Dependabot version-update capability rather than a Rust
security-update feed. A future compiler update must therefore arrive as a
reviewable pull request and pass the unchanged-head Windows, macOS,
analysis-engine, Tauri, release-preflight, audit, coverage, and supply-chain
gates. GitHub's platform-level default cooldown for Dependabot version updates
is additional noise control; it is not treated as a repository security or
freshness guarantee.

`scripts/checks/verify_rust_toolchain.py` runs in the canonical quickcheck and
fails when any executable workflow reintroduces `rustup toolchain install
stable`, `cargo +stable`, or `--toolchain stable`. The same guard binds
`directory`, target branch, and schedule evidence to the actual
`rust-toolchain` Dependabot lane so an unrelated ecosystem entry cannot satisfy
the compiler-update policy.

Required Rust command evidence is also bound to one inline executable `run:`
step whose exit status cannot be replaced by shell chaining, pipelines, or
background control operators. Arguments such as `--manifest-path`, `--locked`,
and an explicit target triple remain valid, but forms such as `|| true`,
`| cat`, or `; true` fail closed. This prevents an unsuccessfully installed,
checked, tested, or audited Rust toolchain from becoming success-shaped policy
evidence merely because a later shell command returns zero.

## References

GitHub. (2025, August 19). *Dependabot now supports Rust toolchain updates*.
GitHub Changelog.
https://github.blog/changelog/2025-08-19-dependabot-now-supports-rust-toolchain-updates/

GitHub. (2026, July 14). *Dependabot version updates introduce default package
cooldown*. GitHub Changelog.
https://github.blog/changelog/2026-07-14-dependabot-version-updates-introduce-default-package-cooldown/

The Rust Release Team. (2026, July 16). *Announcing Rust 1.97.1*. Rust Blog.
https://blog.rust-lang.org/2026/07/16/Rust-1.97.1/
Loading
Loading