Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
1ec43e6
⚡ Bolt: O(N^2) 파이썬 룩업을 O(1) 딕셔너리로 성능 개선
seonghobae Aug 30, 2026
f53a772
Trigger CI retry
seonghobae Aug 30, 2026
b0c7e84
Trigger CI retry
seonghobae Aug 30, 2026
5d0cbd4
Trigger CI retry
seonghobae Aug 30, 2026
5988186
Trigger CI retry 3
seonghobae Aug 30, 2026
ebd77f4
Trigger CI retry 4
seonghobae Aug 30, 2026
7480596
Trigger CI retry 5
seonghobae Aug 30, 2026
5570bb8
test(export): cover duplicate cue-sheet fields
seonghobae Aug 30, 2026
5e49826
Trigger CI retry 6
seonghobae Aug 30, 2026
d3a3727
test(chart): cover order-preserving export deduplication
seonghobae Aug 30, 2026
e33e184
style(chart): keep dedup regression canonical
seonghobae Aug 30, 2026
e51e379
Trigger CI retry 7
seonghobae Aug 30, 2026
289f635
test(chart): reject unhashable export text safely
seonghobae Aug 30, 2026
b9452c8
fix(exports): reject unhashable text at dedup boundaries
seonghobae Aug 30, 2026
326b5e7
test(exports): preserve hashable text subclasses
seonghobae Aug 30, 2026
529ebc4
fix(chart): preserve hashable string subclasses
seonghobae Aug 30, 2026
bf497a4
test(chart): reject subclass truthiness at export boundary
seonghobae Aug 30, 2026
fb76f93
fix(chart): normalize safe string subclass keys
seonghobae Aug 30, 2026
afa3614
test(chart): use semantic bool failure exception
seonghobae Aug 30, 2026
d534ceb
test(export): reject priority truthiness override
seonghobae Aug 30, 2026
93bda7a
fix(export): normalize rehearsal priority text
seonghobae Aug 30, 2026
10ae79a
Trigger CI retry 9
seonghobae Aug 30, 2026
6770e35
Trigger CI retry 10
seonghobae Aug 30, 2026
a6ce02d
Trigger CI retry 10
seonghobae Aug 30, 2026
2084217
test(chart): preserve ordered dedup succession contract
seonghobae Sep 1, 2026
c7ed3ee
Trigger CI retry 11
seonghobae Sep 1, 2026
ad1f202
Trigger CI retry 12
seonghobae Sep 2, 2026
5677582
test(chart): preserve dedup succession evidence
seonghobae Sep 2, 2026
8ea9c99
Trigger CI retry 13
seonghobae Sep 2, 2026
b0d403e
Merge protected develop into chart export dedup owner
seonghobae Sep 4, 2026
3e34efe
chore(perf): adopt protected develop without losing chart dedup delta
seonghobae Sep 6, 2026
4d154e6
docs(changelog): retain protected workflow consolidation during restack
seonghobae Sep 6, 2026
b3ece4b
Trigger CI retry 16
seonghobae Sep 6, 2026
fbdb701
Trigger CI retry 17
seonghobae Sep 6, 2026
3193f80
Trigger CI retry 18
seonghobae Sep 6, 2026
efb0b07
Trigger CI retry 19
seonghobae Sep 6, 2026
2b59955
Trigger CI retry 20
seonghobae Sep 6, 2026
4fb38b5
Trigger CI retry 21
seonghobae Sep 6, 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
35 changes: 35 additions & 0 deletions .github/workflows/bandit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: bandit

on:
push:
branches:
- develop
- main
pull_request:
branches:
- develop
- main

permissions:
contents: read

env:
GIT_CONFIG_COUNT: "1"
GIT_CONFIG_KEY_0: init.defaultBranch
GIT_CONFIG_VALUE_0: develop

jobs:
bandit-scan:
name: Bandit Security Scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
with:
version: "0.8.6"
enable-cache: false
- name: Sync Python dependencies
run: uv sync --project services/analysis-engine --group dev --frozen
- name: Run Bandit
working-directory: services/analysis-engine
run: uv run bandit -c pyproject.toml -r src
22 changes: 6 additions & 16 deletions .github/workflows/build-baseline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,6 @@ on:
tags:
- "v*"

concurrency:
group: >-
${{ github.workflow }}-${{ github.repository }}-${{
github.event_name == 'pull_request' && github.event.pull_request.number || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read

Expand Down Expand Up @@ -294,11 +288,9 @@ jobs:
- name: Explain non-blocking macOS amd64 artifact upload failure
if: ${{ steps.upload-macos-amd64.outcome == 'failure' }}
run: |
{
echo "Artifact upload failed after the macOS amd64 bundle was packaged."
echo "Pull request builds keep artifact upload non-blocking because GitHub artifact service or DNS failures do not invalidate the build evidence."
echo "Tag and release builds remain blocking because release publication requires uploaded artifacts."
} >> "$GITHUB_STEP_SUMMARY"
echo "Artifact upload failed after the macOS amd64 bundle was packaged." >> "$GITHUB_STEP_SUMMARY"
echo "Pull request builds keep artifact upload non-blocking because GitHub artifact service or DNS failures do not invalidate the build evidence." >> "$GITHUB_STEP_SUMMARY"
echo "Tag and release builds remain blocking because release publication requires uploaded artifacts." >> "$GITHUB_STEP_SUMMARY"

build-macos-arm64:
name: build / macos / arm64
Expand Down Expand Up @@ -358,11 +350,9 @@ jobs:
- name: Explain non-blocking macOS arm64 artifact upload failure
if: ${{ steps.upload-macos-arm64.outcome == 'failure' }}
run: |
{
echo "Artifact upload failed after the macOS arm64 bundle was packaged."
echo "Pull request builds keep artifact upload non-blocking because GitHub artifact service or DNS failures do not invalidate the build evidence."
echo "Tag and release builds remain blocking because release publication requires uploaded artifacts."
} >> "$GITHUB_STEP_SUMMARY"
echo "Artifact upload failed after the macOS arm64 bundle was packaged." >> "$GITHUB_STEP_SUMMARY"
echo "Pull request builds keep artifact upload non-blocking because GitHub artifact service or DNS failures do not invalidate the build evidence." >> "$GITHUB_STEP_SUMMARY"
echo "Tag and release builds remain blocking because release publication requires uploaded artifacts." >> "$GITHUB_STEP_SUMMARY"

gate-macos:
name: gate / build / macos
Expand Down
6 changes: 0 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,6 @@ on:
- develop
- main

concurrency:
group: >-
${{ github.workflow }}-${{ github.repository }}-${{
github.event_name == 'pull_request' && github.event.pull_request.number || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read

Expand Down
39 changes: 39 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: codeql

on:
push:
branches:
- develop
- main
workflow_dispatch:

permissions:
actions: read
contents: read

env:
GIT_CONFIG_COUNT: "1"
GIT_CONFIG_KEY_0: init.defaultBranch
GIT_CONFIG_VALUE_0: develop

jobs:
analyze:
name: codeql
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language:
- javascript-typescript
- python
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- uses: github/codeql-action/init@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
with:
languages: ${{ matrix.language }}
- uses: github/codeql-action/autobuild@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
- uses: github/codeql-action/analyze@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
4 changes: 0 additions & 4 deletions .github/workflows/ossf-scorecard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@ on:
- develop
- main

concurrency:
group: ${{ github.workflow }}-${{ github.repository }}-${{ github.event_name }}-${{ github.ref }}
cancel-in-progress: false

permissions: read-all

jobs:
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
name: release

on:
pull_request:
branches:
- develop
- main
push:
branches:
- develop
Expand All @@ -9,10 +13,6 @@ on:
- "v*"
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.repository }}-${{ github.event_name }}-${{ github.ref }}
cancel-in-progress: false

permissions:
contents: read

Expand Down
6 changes: 0 additions & 6 deletions .github/workflows/sbom.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,6 @@ on:
types:
- published

concurrency:
group: >-
${{ github.workflow }}-${{ github.repository }}-${{
github.event_name == 'pull_request' && github.event.pull_request.number || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read

Expand Down
29 changes: 29 additions & 0 deletions .github/workflows/secret-scan-gate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: secret-scan-gate

on:
pull_request:
branches:
- develop
- main
push:
branches:
- develop
- main

permissions:
contents: read

env:
GIT_CONFIG_COUNT: "1"
GIT_CONFIG_KEY_0: init.defaultBranch
GIT_CONFIG_VALUE_0: develop

jobs:
secret-scan:
name: secret-scan-gate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Scan for common hardcoded secrets
run: |
! git grep -nE '(g[h]p_|g[h]o_|A[K]IA[0-9A-Z]{16}|A[I]za[0-9A-Za-z\-_]{35}|BEGIN (R[S]A|E[C]|OPENS[S]H|P[G]P) PRIVATE KEY)' -- . ':(exclude)package-lock.json' ':(exclude)node_modules/**'
53 changes: 7 additions & 46 deletions .github/workflows/security-audit.yml
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
name: security-backstop
name: security-audit

on:
pull_request:
branches:
- develop
- main
push:
branches:
- develop
- main
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.repository }}-${{ github.event_name }}-${{ github.ref }}
cancel-in-progress: false

permissions:
contents: read
Expand All @@ -20,12 +19,9 @@ env:
GIT_CONFIG_VALUE_0: develop

jobs:
security-backstop:
name: security-backstop
audit:
name: security-audit
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
Expand Down Expand Up @@ -53,45 +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: Run Bandit
working-directory: services/analysis-engine
run: uv run bandit -c pyproject.toml -r src
- name: Install stable Rust toolchain
run: rustup toolchain install stable --profile minimal
- name: Install cargo-audit
run: cargo +stable install cargo-audit --locked
- name: Audit Rust dependencies
working-directory: apps/desktop/src-tauri
run: cargo +stable audit
- name: Scan for common hardcoded secrets
run: |
! git grep -nE '(g[h]p_|g[h]o_|A[K]IA[0-9A-Z]{16}|A[I]za[0-9A-Za-z\-_]{35}|BEGIN (R[S]A|E[C]|OPENS[S]H|P[G]P) PRIVATE KEY)' -- . ':(exclude)package-lock.json' ':(exclude)node_modules/**'
- name: Run Trivy filesystem scan summary
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: fs
scan-ref: .
version: v0.71.2
format: table
severity: CRITICAL,HIGH,MEDIUM
exit-code: "0"
skip-dirs: services/analysis-engine/.venv
trivyignores: ./.trivyignore
- name: Run Trivy filesystem scan
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: fs
scan-ref: .
version: v0.71.2
format: sarif
output: trivy-results.sarif
severity: CRITICAL,HIGH,MEDIUM
limit-severities-for-sarif: true
exit-code: "1"
skip-dirs: services/analysis-engine/.venv
trivyignores: ./.trivyignore
- name: Upload Trivy scan results to GitHub Security tab
if: always()
uses: github/codeql-action/upload-sarif@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0
with:
sarif_file: trivy-results.sarif
54 changes: 54 additions & 0 deletions .github/workflows/trivy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: trivy

on:
push:
branches:
- develop
- main

permissions:
contents: read

env:
GIT_CONFIG_COUNT: "1"
GIT_CONFIG_KEY_0: init.defaultBranch
GIT_CONFIG_VALUE_0: develop

jobs:
trivy-fs-scan:
name: trivy-fs-scan
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
- name: Run Trivy filesystem scan summary
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0; SHA pinning retained as supply-chain attack mitigation, do not replace with tag.
with:
scan-type: fs
scan-ref: .
version: v0.71.2
format: table
severity: CRITICAL,HIGH,MEDIUM
exit-code: '0'
skip-dirs: 'services/analysis-engine/.venv'
trivyignores: ./.trivyignore
- name: Run Trivy filesystem scan
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0; SHA pinning retained as supply-chain attack mitigation, do not replace with tag.
with:
scan-type: fs
scan-ref: .
version: v0.71.2
format: sarif
output: trivy-results.sarif
severity: CRITICAL,HIGH,MEDIUM
limit-severities-for-sarif: true
exit-code: '1'
skip-dirs: 'services/analysis-engine/.venv'
trivyignores: ./.trivyignore
- name: Upload Trivy scan results to GitHub Security tab
uses: github/codeql-action/upload-sarif@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0 peeled commit; SHA pinning retained as supply-chain attack mitigation.
if: always()
with:
sarif_file: trivy-results.sarif
3 changes: 3 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,6 @@
## 2026-07-13 - Array.from mapping optimization
**Learning:** Using `Array.from({ length: N }).map(...)` creates an intermediate array of `undefined` values which requires memory allocation and garbage collection, adding O(N) unnecessary overhead in frequently re-rendered UI components.
**Action:** Use `Array.from({ length: N }, (_, index) => ...)` to map elements directly during array creation, avoiding intermediate allocations.
## 2026-03-06 - [파이썬 O(N^2) 리스트 룩업을 O(1) 딕셔너리로 최적화]
**Learning:** `chart.py`의 텍스트 변환 로직에서 `not in list`로 중복을 방지하며 삽입하는 방식은 리스트 크기가 커질 때 O(N^2) 병목을 유발합니다. 파이썬 3.7+부터 딕셔너리가 삽입 순서를 유지하므로, `dict[item] = None`을 사용해 순서를 보존하면서 O(1)의 성능 최적화가 가능함을 배웠습니다.
**Action:** 앞으로 리스트의 중복을 제거하면서 순서를 유지해야 하는 로직에서는 `set` 대신 딕셔너리(dictionary) 키를 활용할 것입니다.
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

### Changed

- Consolidated Bandit, dependency audits, supplemental secret checks, and Trivy into one trusted-branch security backstop, delegated CodeQL to GitHub default setup, and removed duplicate local PR security and release-preflight runs.
- Changed chart-export role, cue, and priority de-duplication to insertion-ordered dictionaries, preserving first-occurrence output while replacing repeated linear membership scans with average constant-time key lookups.
- 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.

### Fixed
Expand Down Expand Up @@ -75,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`).
4 changes: 2 additions & 2 deletions apps/desktop/src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion docs/architecture/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,6 @@ GitHub is the source of truth for repository governance, PR review, CI/CD, Code

## CI/CD and release flow

- PRs into `develop` and `main` run repository CI, SBOM, and platform builds alongside organization-required OSV, dependency-review, Trivy, CodeQL/code-quality, Semgrep SAST, Strix, and Noema evidence; consolidated local security backstops run after trusted-branch pushes
- PRs into `develop` and `main` run CI, dependency review, security audit, secret-scan gate, SBOM generation, and CodeQL
- release flows publish desktop artifacts plus SBOM evidence to GitHub Releases through a tag-driven draft-before-publish path
- branch protection connects stable required checks after bootstrap workflows exist
Loading
Loading