Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
a2423ad
Improve performance
owjs3901 Jun 23, 2026
0fed25d
retry-now#0001: hoist &[ColumnName] join into vespertide-core helper
owjs3901 Jun 25, 2026
d09e41c
retry-now#0001: hoist EnumValues::to_sql_values().join into buffer-pu…
owjs3901 Jun 25, 2026
3a63787
retry-now#0002: extract escape_sql_string_literal helper to vespertid…
owjs3901 Jun 25, 2026
d932bff
Optimize
owjs3901 Jun 25, 2026
973e4c3
retry-now#0003: unify path_to_uri helper into vespertide-lsp::position
owjs3901 Jun 25, 2026
6de734b
retry-now#0004: drop intermediate Vec<&str> alloc in ColumnType::enum…
owjs3901 Jun 25, 2026
72d9901
retry-now#0005: remove dead empty inner loop in topological_sort_tables
owjs3901 Jun 26, 2026
6ef965f
retry-now#0006: replace 4 inline RawSql::per_backend(s.clone(), s.clo…
owjs3901 Jun 26, 2026
24d4a05
retry-now#0007: hoist invariant quote_ident out of recreate_indexes_a…
owjs3901 Jun 26, 2026
37fcfe6
retry-now#0008: drop dead RawSql backend fields in remove_constraint/…
owjs3901 Jun 26, 2026
5b11ea6
retry-now#0009: drop to_lowercase() allocation in convert_default_for…
owjs3901 Jun 26, 2026
1a67d24
retry-now#0010: quote_ident fast-path skips str::replace when identif…
owjs3901 Jun 26, 2026
8d31020
retry-now#0011: remove dead public relation-naming API + tests from v…
owjs3901 Jun 26, 2026
325723a
retry-now#0013: consolidate vespertide-naming constraint-name builder…
owjs3901 Jun 26, 2026
8b87903
retry-now#0015: batch -- postgres_only helper, drop dead to_sql_value…
owjs3901 Jun 27, 2026
6dc66e1
retry-now#0016: builder/foreign_key dedup -- hoist pending_constraint…
owjs3901 Jun 27, 2026
c356421
retry-now#0017: hoist duplicated validate/* test helpers into test_su…
owjs3901 Jun 27, 2026
feabbea
retry-now#0018: batch -- drop Cow ceremony in normalize_fill_with, de…
owjs3901 Jun 27, 2026
d464742
retry-now#0019: batch -- extract print_section_rule helper, add EnumV…
owjs3901 Jun 27, 2026
67cf752
retry-now#0020: batch -- hoist loader test_support, drop dead NameCas…
owjs3901 Jun 27, 2026
947cdbb
retry-now#0021: batch -- hoist 3 vespertide-query test helpers (3 kept)
owjs3901 Jun 27, 2026
cad969c
retry-now#0022: batch -- hoist col_int helper, drop dead col helper, …
owjs3901 Jun 27, 2026
4c47bab
retry-now#0023: batch -- hoist node_at_byte to tree_util, inline i64_…
owjs3901 Jun 27, 2026
4f596fd
retry-now#0024: batch -- hoist SQLite copy-into-temp-table helper, sh…
owjs3901 Jun 27, 2026
0a127b5
retry-now#0025: batch -- hoist build_delete_table for 8 DROP TABLE si…
owjs3901 Jun 27, 2026
faf52da
retry-now#0026: batch -- hoist require_table_in_schema helper, hoist …
owjs3901 Jun 27, 2026
27b28b0
retry-now#0027: batch -- hoist is_pair, find_outer_mapping, unwrap_ya…
owjs3901 Jun 27, 2026
610f206
retry-now#0028: batch ? backend_tag (20 sites), test_support::uri (9 …
owjs3901 Jun 27, 2026
05819c3
retry-now#0029: batch - hoist 3 require_table_in_schema lookups in ve…
owjs3901 Jun 27, 2026
cb52dc4
retry-now#0030: batch - hoist build_drop_index_query, add require_col…
owjs3901 Jun 27, 2026
6f9c075
retry-now#0031: batch -- hoist SQLite rebuild + unify Literal helpers…
owjs3901 Jun 27, 2026
9cd2a99
retry-now#0032: batch -- swap 3 .unwrap()s for invariant-stating .exp…
owjs3901 Jun 27, 2026
a8bced9
retry-now#0033: batch -- restore cargo fmt, dedupe column_names_to_st…
owjs3901 Jun 27, 2026
8e8cc73
retry-now#0034: batch -- hoist MySQL+SQLite modify-column dispatch, p…
owjs3901 Jun 28, 2026
0c6a411
retry-now#0035: batch - dedup CHECK helpers vs SoT, JPA pascal-case r…
owjs3901 Jun 28, 2026
57c828e
retry-now#0036: batch — restore cargo fmt green, hoist tree_util::anc…
owjs3901 Jun 28, 2026
ec644d2
retry-now#0037: batch -- hoist build_pg_alter_column_sql + dedup skip…
owjs3901 Jun 28, 2026
1b99120
retry-now#0038: batch -- hoist find_pair_with_key, adopt joined_sql, …
owjs3901 Jun 28, 2026
02360af
retry-now#0039: batch — hoist try_resolve_single_pk_column shared hel…
owjs3901 Jun 28, 2026
4472e8b
retry-now#0040: batch — dedupe LSP lock-poisoned expects and PG ALTER…
owjs3901 Jun 28, 2026
5c9fd3a
retry-now#0041: batch - hoist find_baseline_column, drop dead CheckEx…
Jun 28, 2026
d53d124
retry-now#0042: batch - hoist apply::find_table_mut, drop dead JPA Re…
owjs3901 Jun 28, 2026
c44780b
retry-now#0043: batch — hoist LSP is_inside_constraints, dedupe CLI t…
owjs3901 Jun 28, 2026
5ee8dc2
retry-now#0044: batch - hoist LSP trim_one_byte, adopt unwrap_yaml_no…
owjs3901 Jun 28, 2026
4f62c78
retry-now#0045: batch - drop 2 Vec allocs in try_resolve_single_pk_co…
owjs3901 Jun 28, 2026
b6f49a3
retry-now#0046: batch - hoist loader rayon dispatch helper, unify CLI…
owjs3901 Jul 2, 2026
4e3457b
retry-now#0047: batch - fix RingCache double-insert race, layered ERD…
owjs3901 Jul 2, 2026
e35a60e
retry-now#0048: batch - drop phantom jsonb simple type from README + …
owjs3901 Jul 2, 2026
8f1158c
retry-now#0049: batch - borrow-keyed FK/added sets in emit, hoist del…
owjs3901 Jul 2, 2026
f2075e6
retry-now#0050: batch - borrowed self-contradiction grouping, dedupe …
owjs3901 Jul 2, 2026
ea856b4
retry-now#0051: batch - consolidate join_quoted across 4 ORM exporter…
owjs3901 Jul 2, 2026
4aa564e
retry-now#0052: batch - dedupe loader ext filter, shared Kahn core, f…
owjs3901 Jul 2, 2026
94f80c1
retry-now#0053: batch - LSP disk_document + byte_range_to_ls + non_em…
owjs3901 Jul 2, 2026
26539ed
retry-now#0054: batch - document erd/JPA in README, adopt query test …
owjs3901 Jul 2, 2026
bca0bf6
retry-now#0055: batch - drop dead CHECK-scan disjunct, dedupe SQLite …
owjs3901 Jul 2, 2026
b6614a0
retry-now#0056: batch - shared-slice semantic-token encode, ColumnDef…
owjs3901 Jul 2, 2026
c39aabb
retry-now#0057: batch - hoist CHECK type lookup per predicate, drop t…
owjs3901 Jul 2, 2026
cf4d6ad
retry-now#0058: batch - dedupe seaorm PK scan via constraint_scan, lo…
owjs3901 Jul 2, 2026
e8d4c68
retry-now#0059: batch — drop RawSql Display alloc, BTreeSet constrain…
owjs3901 Jul 3, 2026
f48e63f
retry-now#0060: batch - dedupe/alloc micro-wins in create_table, cons…
owjs3901 Jul 3, 2026
6f4d63d
retry-now#0061: batch — elide allocations in query CREATE TABLE / add…
owjs3901 Jul 3, 2026
2ebd5bb
retry-now#0062: batch — relocate single_column_indexes to constraint_…
owjs3901 Jul 3, 2026
6663ed5
retry-now#0063: batch — skip auto-inc HashSet alloc, direct-build str…
owjs3901 Jul 3, 2026
47fe5a8
retry-now#0064: batch - dedupe normalize group-key allocs, drop throw…
owjs3901 Jul 3, 2026
44d2063
retry-now#0065: batch — gate create_table enum HashSet, pre-size quer…
owjs3901 Jul 3, 2026
dd9e1de
retry-now#0066: batch — hoist pascal invariant, pre-size 4 string bui…
owjs3901 Jul 3, 2026
5ad879b
retry-now#0067: batch - skip no-unique constraint clone, pre-size enu…
owjs3901 Jul 3, 2026
8f48dd9
retry-now#0068: batch — Cow borrowed fast-path in 3 ERD escape helper…
owjs3901 Jul 3, 2026
25202ab
retry-now#0069: batch - alloc-free FK-ref split_once, borrow M2M junc…
owjs3901 Jul 3, 2026
c1113f5
retry-now#0070: batch — dedupe reverse-relation enum recompute, hoist…
owjs3901 Jul 3, 2026
37d664b
retry-now#0071: exporter/core alloc+dedupe batch (5 kept) — join_qual…
owjs3901 Jul 3, 2026
f46b8f5
retry-now#0072: batch - drop dead EnumValues::variant_names, route Se…
owjs3901 Jul 3, 2026
66cb48d
retry-now#0073: dedupe single-column FK-info maps into constraint_sca…
owjs3901 Jul 3, 2026
2bba8c8
retry-now#0074: batch — unify Python exporter column_type_to_python +…
owjs3901 Jul 3, 2026
2d5aa38
retry-now#0075: batch - borrow constraint_scan lookup sets & FK map a…
owjs3901 Jul 3, 2026
599e9aa
retry-now#0076: batch — in-place DeleteTable sort (no clone-Vec), inl…
owjs3901 Jul 3, 2026
b8b6902
retry-now#0077: simplify WorkspaceIndex::is_empty to BTreeMap::is_emp…
owjs3901 Jul 3, 2026
512924e
retry-now#0078: batch — drop redundant y-guard, skip 1-col sort, sing…
owjs3901 Jul 3, 2026
5fb7c1b
retry-now#0079: return borrowed &str from LSP reference-search siblin…
owjs3901 Jul 3, 2026
3ecae68
retry-now#0080: batch — dedupe LSP direct-child scans, fast-path int-…
owjs3901 Jul 3, 2026
7f0d5a8
retry-now#0081: exporter dedup - reuse constraint_scan helpers in sql…
owjs3901 Jul 3, 2026
842031e
retry-now#0082: batch — reuse buffers in seaorm naming + borrow ERD B…
owjs3901 Jul 3, 2026
9df4d95
retry-now#0083: batch — simplify generate_relation_enum_name to strip…
owjs3901 Jul 3, 2026
1df6e2b
retry-now#0084: batch — borrow constraint index/unique in SQLAlchemy/…
owjs3901 Jul 3, 2026
0b1d193
retry-now#0086: remove redundant TableCreateStatement clones in CREAT…
owjs3901 Jul 3, 2026
a9f6d33
retry-now#0087: batch — pre-size exporter/core join buffers, drop thr…
owjs3901 Jul 3, 2026
219a1f5
retry-now#0087: batch — dedup LSP tree-walk helpers (3 kept)
owjs3901 Jul 3, 2026
5f34c88
retry-now#0088: seaorm relations — borrow FK tuples in self-ref + M2M…
owjs3901 Jul 3, 2026
f777f26
retry-now#0089: replace to_uppercase() allocation in is_function_expr…
owjs3901 Jul 3, 2026
fc9bde9
retry-now#0090: batch — drop redundant sanitize_filename clone x3, sh…
owjs3901 Jul 3, 2026
34f73ae
retry-now#0091: batch — drop throwaway format! in build_create_with_c…
owjs3901 Jul 3, 2026
247cc60
retry-now#0093: batch — drop per-token classify_word alloc, hoist BET…
owjs3901 Jul 3, 2026
d93f0a8
retry-now#0094: batch — alloc-free column_markers match, same_column_…
owjs3901 Jul 3, 2026
351e194
retry-now#0095: borrow deleted-column names in diff (BTreeSet<&str>) …
owjs3901 Jul 3, 2026
99de759
retry-now#0096: skip to_by_name build when either integer-enum varian…
owjs3901 Jul 3, 2026
3cb1a1d
Update lib
owjs3901 Aug 20, 2026
95eb22a
Merge branch 'main' into improve-performance
owjs3901 Aug 20, 2026
4992fae
fix(deps): typescript를 7.0.2 프리뷰에서 6.0.3으로 되돌려 landing 빌드 복구
owjs3901 Aug 20, 2026
04b224b
chore(changepacks): 성능 최적화 웨이브의 breaking 변경을 선언
owjs3901 Aug 20, 2026
dab4b36
test: tarpaulin 100% 게이트가 지적한 미커버 경로에 테스트 추가
owjs3901 Aug 20, 2026
8e0dca8
test: coverage 게이트가 남긴 미실행 분기 4곳을 덮는다
owjs3901 Aug 20, 2026
43b9fc3
refactor: tarpaulin이 접어버리던 4개 구문을 단일 region으로 편다
owjs3901 Aug 20, 2026
5199746
Revert "refactor: tarpaulin이 접어버리던 4개 구문을 단일 region으로 편다"
owjs3901 Aug 20, 2026
f217e92
refactor: coverage가 접어버리던 4개 지점을 더 작은 함수로 분해
owjs3901 Aug 20, 2026
9659357
Revert "refactor: coverage가 접어버리던 4개 지점을 더 작은 함수로 분해"
owjs3901 Aug 20, 2026
3a469af
refactor: 프로덕션 파일에 흩어져 있던 test 전용 코드를 test 모듈로 모은다
owjs3901 Aug 20, 2026
85645b0
test: coverage가 지목하던 마지막 4줄의 실제 미실행 분기를 해소
owjs3901 Aug 20, 2026
ad6101a
test(mutants): 낡은 제외 규칙을 줄 비의존으로 고치고 살아남은 뮤턴트를 처리
owjs3901 Aug 20, 2026
dcc4eb6
test: 잔여 뮤턴트 정리 (rank 공간 치환 + 심링크/PK 테스트)
owjs3901 Aug 20, 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
88 changes: 69 additions & 19 deletions .cargo/mutants.toml
Original file line number Diff line number Diff line change
Expand Up @@ -75,15 +75,15 @@ exclude_re = [
# column x-range rather than sitting side-by-side. Therefore both mutants
# are byte-identical for every renderer-reachable layout while the other
# pick_anchors arithmetic remains in scope.
"edges[.]rs:152(:[0-9]+)?: replace > with >= in pick_anchors",
"edges[.]rs:[0-9]+:[0-9]+: replace > with >= in pick_anchors",
# E6: classify_strengthening's `||` guard
# (`old==Unparseable || new==Unparseable -> return None`) is equivalent
# under `&&`. When exactly one side is Unparseable the `&&` mutant skips
# the early return, but `classify_pair(Unparseable, _)` / `(_, Unparseable)`
# has no matching arm and falls to `_ => None` ? identical observable
# result for every input. The two-unparseable case is also caught earlier
# by `if old == new { return None }`. No test can distinguish the mutant.
"check_strengthening[.]rs:233(:[0-9]+)?: replace [|][|] with && in classify_strengthening",
"check_strengthening[.]rs:[0-9]+:[0-9]+: replace [|][|] with && in classify_strengthening",
# E7: the Rayon `*_par_*_threshold()` functions in parallel_config.rs
# (vespertide-planner + vespertide-query) are perf-only dispatch knobs.
# Replacing the returned threshold with 0 or 1 only changes WHEN the
Expand All @@ -97,51 +97,51 @@ exclude_re = [
# ModifyColumnDefault for the same column), so they can never be equal.
# `< -> <=` therefore has no reachable input that distinguishes it ?
# equivalent. The `&&` operator on the same line remains in the gate.
"ordering[.]rs:410(:[0-9]+)?: replace < with <= in sort_enum_default_dependencies",
"ordering[.]rs:[0-9]+:[0-9]+: replace < with <= in sort_enum_default_dependencies",
# E9: the `len() < *_par_*_threshold()` seq-vs-parallel DISPATCH comparisons.
# Mutating `<` to ==/>/<= only changes which execution path is taken; the
# sequential and Rayon paths produce identical results (covered by the
# validate/diff/build result tests). Perf-only ? same category as E1.
"validate/plan[.]rs:46(:[0-9]+)?: replace < with (==|>|<=) in find_plan_violations",
"validate/plan[.]rs:167(:[0-9]+)?: replace < with (==|>|<=) in find_missing_fill_with",
"validate/plan[.]rs:280(:[0-9]+)?: replace < with (==|>|<=) in find_missing_enum_fill_with",
"validate/schema[.]rs:77(:[0-9]+)?: replace < with (==|>|<=) in find_schema_violations",
"diff/mod[.]rs:49(:[0-9]+)?: replace < with (==|>|<=) in diff_schemas",
"builder/mod[.]rs:63(:[0-9]+)?: replace < with (==|>|<=) in build_plan_queries",
"validate/plan[.]rs:[0-9]+:[0-9]+: replace < with (==|>|<=) in find_plan_violations",
"validate/plan[.]rs:[0-9]+:[0-9]+: replace < with (==|>|<=) in find_missing_fill_with",
"validate/plan[.]rs:[0-9]+:[0-9]+: replace < with (==|>|<=) in find_missing_enum_fill_with",
"validate/schema[.]rs:[0-9]+:[0-9]+: replace < with (==|>|<=) in find_schema_violations",
"diff/mod[.]rs:[0-9]+:[0-9]+: replace < with (==|>|<=) in diff_schemas",
"builder/mod[.]rs:[0-9]+:[0-9]+: replace < with (==|>|<=) in build_plan_queries",
# E10: the pairwise contradiction loop `for j in (i + 1)..preds.len()`.
# The `+ -> *` mutant yields `i * 1 == i`, so the inner loop additionally
# visits the (i, i) self-pair `check_pair(col, p, p)`. A predicate never
# contradicts itself (two identical Compare/In/Between/IsNull predicates
# are always mutually satisfiable), so every added self-pair returns None
# and the observable result is unchanged ? equivalent.
"check_self_contradiction[.]rs:120(:[0-9]+)?: replace [+] with [*] in find_contradiction",
"check_self_contradiction[.]rs:[0-9]+:[0-9]+: replace [+] with [*] in find_contradiction",
# E11: is_definitely_mismatch's `(Json, _) => false` and
# `(Custom { .. }, _) => false` arms return exactly the same value as the
# match's `_ => false` catch-all. Deleting either arm makes that input
# fall straight through to `_ => false` ? identical observable result,
# equivalent.
"check_type_mismatch[.]rs:366(:[0-9]+)?: delete match arm .* in is_definitely_mismatch",
"check_type_mismatch[.]rs:395(:[0-9]+)?: delete match arm .* in is_definitely_mismatch",
"check_type_mismatch[.]rs:[0-9]+:[0-9]+: delete match arm .* in is_definitely_mismatch",
"check_type_mismatch[.]rs:[0-9]+:[0-9]+: delete match arm .* in is_definitely_mismatch",
# E12: in find_primary_key_additions, `n_existing == 0 => NewColumns`.
# The function acts ONLY on `ExistingColumns`; both NewColumns and the
# `_ => Mixed` fallback hit `if !matches!(kind, ExistingColumns) continue;`.
# Deleting the `0` arm sends n_existing==0 to Mixed (PK columns always
# number >=1, so `0 == len` is unreachable) ? same `continue`, equivalent.
"pk_additions[.]rs:115(:[0-9]+)?: delete match arm 0 in find_primary_key_additions",
"pk_additions[.]rs:[0-9]+:[0-9]+: delete match arm 0 in find_primary_key_additions",
# E13: in clear_index_fields, `filtered.len() < names.len()` gates whether
# the multi-index array is rewritten after removing a constraint name. When
# the name is absent, `filtered` is a clone of `names` (same elements, same
# order), so the `<= ` branch would set `col.index = Some(Array(filtered))`
# to a value byte-identical to the untouched original ? no observable
# difference, equivalent.
"constraint_ops[.]rs:148(:[0-9]+)?: replace < with <= in clear_index_fields",
"constraint_ops[.]rs:[0-9]+:[0-9]+: replace < with <= in clear_index_fields",
# E14: the loader's `paths.len() < LOAD_FILES_PAR_THRESHOLD` seq-vs-parallel
# dispatch. Mutating `<` only changes whether files are loaded sequentially
# or via Rayon; the loaded result is identical. Perf-only, same as E1/E9.
"loader/src/migrations[.]rs:21(:[0-9]+)?: replace < with (==|>|<=) in load_migrations",
"loader/src/migrations[.]rs:65(:[0-9]+)?: replace < with (==|>|<=) in load_migrations_from_dir",
"loader/src/models[.]rs:43(:[0-9]+)?: replace < with (==|>|<=) in load_models_recursive",
"loader/src/models[.]rs:145(:[0-9]+)?: replace < with (==|>|<=) in load_models_recursive_internal",
"loader/src/migrations[.]rs:[0-9]+:[0-9]+: replace < with (==|>|<=) in load_migrations",
"loader/src/migrations[.]rs:[0-9]+:[0-9]+: replace < with (==|>|<=) in load_migrations_from_dir",
"loader/src/models[.]rs:[0-9]+:[0-9]+: replace < with (==|>|<=) in load_models_recursive",
"loader/src/models[.]rs:[0-9]+:[0-9]+: replace < with (==|>|<=) in load_models_recursive_internal",
# E15: pure `println!` display helpers (revision fill_with header/footer and
# narrowing strategy descriptions). No return value or logic; replacing the
# body with () or deleting a match arm only changes stdout decoration. Same
Expand Down Expand Up @@ -175,9 +175,58 @@ exclude_re = [
# scanner's exponent loop condition. (Caught/missed mutants in these
# functions stay in the gate; only the non-terminating ones are excluded.)
"check_expr_parser[.]rs:[0-9]+:[0-9]+: replace [+]= with (-=|[*]=|/=) in tokenize_spanned",
"check_expr_parser[.]rs:408(:[0-9]+)?: .* in tokenize_spanned",
# The scanner's `while i < bytes.len() && ..` bounds guards. Relaxing the
# bound is the same non-advancing class as the `+=` mutants above: the
# cursor stops being the loop's decreasing measure and the scan never
# terminates. Narrowed from a `.*`-in-tokenize_spanned wildcard so any
# OTHER mutation in the scanner still has to be killed by a test.
"check_expr_parser[.]rs:[0-9]+:[0-9]+: replace < with (<=|==|>) in tokenize_spanned",
"check_expr_parser[.]rs:[0-9]+:[0-9]+: replace [+]= with (-=|[*]=|/=) in Parser::parse_predicate",
"layout[.]rs:[0-9]+:[0-9]+: replace [+]= with (-=|[*]=|/=) in rebalance_groups",
# Same non-termination class in the migration-filename byte scanner:
# `render_migration_name` walks `i` (and the inner width cursor `j`) forward
# by 1 or 2 per step. `*= 1` is the identity, and `-=` walks backwards into
# an underflow, so either way the cursor stops being the loop's decreasing
# measure and the scan never reaches `bytes.len()`. The scanner's comparison
# and slice-bound mutants stay in the gate - `%012` and `%06v` cover those.
"cli/src/utils[.]rs:[0-9]+:[0-9]+: replace [+]= with (-=|[*]=|/=) in render_migration_name",
# E19: `String::with_capacity` / `Vec::reserve` sizing arithmetic. These
# mutants change only how much the buffer pre-allocates; every one of these
# functions then pushes the same bytes in the same order, so the returned
# value is byte-identical and no assertion can distinguish them. (The
# buffer-push helpers themselves stay in the gate - only the capacity
# expression is excluded.)
"naming/src/lib[.]rs:[0-9]+:[0-9]+: replace [+] with (-|[*]) in build_constraint_name",
"schema/names[.]rs:[0-9]+:[0-9]+: replace ([+]|[*]) with ([*]|[+]) in join_column_names",
"sql/helpers[.]rs:[0-9]+:[0-9]+: replace [+] with (-|[*]) in quote_ident_into",
# E20: the loader's generic `paths.len() < LOAD_FILES_PAR_THRESHOLD`
# seq-vs-parallel dispatch, extracted into `map_paths_with_threshold` by the
# performance wave. Same perf-only category as E1/E7/E9/E14 - both arms map
# the same closure over the same paths and collect the same result.
"loader/src/parallel_config[.]rs:[0-9]+:[0-9]+: replace < with (==|>|<=) in map_paths_with_threshold",
# E21: `sorted_column_refs` skips the sort for 0- or 1-element slices, which
# are already sorted. Every mutant of that guard only changes WHETHER
# `sort_unstable` runs on a slice too short to reorder, so the returned
# order is identical either way.
"diff/constraints[.]rs:[0-9]+:[0-9]+: replace > with (<|==|>=) in sorted_column_refs",
# E22: `compute_integer_enum_remapping`'s empty-side fast path
# (`from_items.is_empty() || to_items.is_empty()`). Under `&&` only the
# both-empty case short-circuits, but the fall-through still yields an empty
# map either way: an empty `from_items` iterates zero times, and an empty
# `to_items` produces an empty `to_by_name` that matches no name. The guard
# skips work, it does not change the result.
"diff/columns[.]rs:[0-9]+:[0-9]+: replace [|][|] with && in compute_integer_enum_remapping",
# E23: `build_create_table`'s `matches!(backend, MySql) || !has_unique_constraints`
# picks between passing the constraint slice through by reference and
# cloning a unique-free copy. `TableConstraint::Unique` dispatches to
# `add_mysql_unique_constraint`, which no-ops on PG/SQLite, so both arms emit
# the same CREATE TABLE - the guard only decides whether the clone is paid
# for. (The `!` inside the partitioning filter on the next lines stays in the
# gate: dropping it would keep only the uniques and lose the PK, which
# `test_create_table_unique_alongside_primary_key` asserts against.) Anchored
# on the COLUMN of the guard's `!` so the filter's `!` a few lines below is
# not swept up - the two are indistinguishable by mutation text alone.
"sql/create_table[.]rs:[0-9]+:77: delete ! in build_create_table",
]

# Focus on logic-heavy crates. Exclude:
Expand All @@ -198,3 +247,4 @@ exclude_globs = [

# 3× baseline test time per mutant (handles proptest variance)
timeout_multiplier = 3.0

1 change: 1 addition & 0 deletions .changepacks/changepack_log_mKQhxic2ssoZF-e_s_8GZ.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"changes":{"crates/vespertide-config/Cargo.toml":"Minor","crates/vespertide-core/Cargo.toml":"Minor","crates/vespertide-exporter/Cargo.toml":"Minor","crates/vespertide-planner/Cargo.toml":"Minor","crates/vespertide-query/Cargo.toml":"Minor"},"note":"성능 최적화 웨이브: 미사용 public API 정리(NameCase::is_*, EnumValues::variant_names/to_sql_values, sql::helpers 일부, find_primary_key_removals 시그니처)와 Orm::Prisma 변형 추가로 0.x 기준 breaking","date":"2026-08-20T03:03:26.0689134Z"}
34 changes: 17 additions & 17 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
name: fmt
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
components: rustfmt
Expand All @@ -44,7 +44,7 @@ jobs:
name: clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
components: clippy
Expand All @@ -55,7 +55,7 @@ jobs:
name: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Test
run: cargo test --workspace --all-features
Expand All @@ -73,7 +73,7 @@ jobs:
matrix:
threads: ["1", "4"]
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Test with Rayon thread count
run: cargo test --workspace --all-features --exclude vespertide-fuzz
Expand All @@ -89,7 +89,7 @@ jobs:
name: SQL validity (daemon-free)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Install build-essential for pg_query (PG C parser)
run: sudo apt-get update && sudo apt-get install -y build-essential libreadline-dev zlib1g-dev flex bison
Expand All @@ -105,7 +105,7 @@ jobs:
name: cargo-deny
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: actions-rust-lang/setup-rust-toolchain@v1
- uses: EmbarkStudios/cargo-deny-action@v2
with:
Expand All @@ -116,7 +116,7 @@ jobs:
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
fetch-depth: 0
- uses: actions-rust-lang/setup-rust-toolchain@v1
Expand Down Expand Up @@ -196,7 +196,7 @@ jobs:
changepacks: ${{ steps.changepacks.outputs.changepacks }}
release_assets_urls: ${{ steps.changepacks.outputs.release_assets_urls }}
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
# changepacks/action@main: project-internal action intentionally tracks main.
# `publish: true` runs `cargo publish` for every Cargo.toml changed in this
# release wave. `release_assets_urls` output is consumed by the downstream
Expand Down Expand Up @@ -258,15 +258,15 @@ jobs:
archive: zip
use_cross: false
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
target: ${{ matrix.target }}

- name: Install cross (aarch64-unknown-linux-gnu only)
if: matrix.use_cross
uses: taiki-e/install-action@v2.81.6
uses: taiki-e/install-action@v2.86.3
with:
tool: cross

Expand Down Expand Up @@ -354,7 +354,7 @@ jobs:
binary_dir_name: win32-x64
archive_format: zip
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- uses: oven-sh/setup-bun@v2
with:
Expand Down Expand Up @@ -485,7 +485,7 @@ jobs:
permissions:
contents: write
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
fetch-depth: 0

Expand Down Expand Up @@ -548,7 +548,7 @@ jobs:
name: doc
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Check docs
run: RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --workspace
Expand All @@ -557,7 +557,7 @@ jobs:
name: schema-drift
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Regenerate schemas
run: cargo run -p vespertide-schema-gen -- --out _tmp_schemas
Expand All @@ -568,7 +568,7 @@ jobs:
name: insta-pending
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: actions-rust-lang/setup-rust-toolchain@v1
- name: Run exporter snapshots
run: cargo test -p vespertide-exporter
Expand All @@ -584,7 +584,7 @@ jobs:
name: line-budget
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- name: Check Rust line budget
run: sh scripts/check-line-budget.sh

Expand All @@ -595,7 +595,7 @@ jobs:
image: xd009642/tarpaulin:develop-nightly
options: --security-opt seccomp=unconfined
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/bench.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- uses: actions-rust-lang/setup-rust-toolchain@v1

Expand All @@ -54,7 +54,7 @@ jobs:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- uses: actions-rust-lang/setup-rust-toolchain@v1

Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/deploy-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,26 +23,26 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: Install bun
uses: oven-sh/setup-bun@v2

- name: Cache bun dependencies
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: ~/.bun/install/cache
key: bun-${{ runner.os }}-${{ hashFiles('**/bun.lock') }}
restore-keys: |
bun-${{ runner.os }}-

- name: Install Node.js
uses: actions/setup-node@v6
uses: actions/setup-node@v7
with:
node-version: 22

- name: Cache Next.js build
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: |
apps/landing/.next/cache
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/fuzz.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
- fuzz_migration_apply
- fuzz_lsp_request
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
Expand All @@ -51,12 +51,12 @@ jobs:
# crt-static libc is incompatible with `-Zsanitizer=address`.
target: x86_64-unknown-linux-gnu

- uses: taiki-e/install-action@v2.81.6
- uses: taiki-e/install-action@v2.86.3
with:
tool: cargo-fuzz

- name: Cache corpus
uses: actions/cache@v5
uses: actions/cache@v6
with:
path: fuzz/corpus/${{ matrix.target }}
key: fuzz-corpus-${{ matrix.target }}-${{ github.sha }}
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/mutants.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@ jobs:
shard:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
fetch-depth: 0

- uses: actions-rust-lang/setup-rust-toolchain@v1

- uses: taiki-e/install-action@v2.81.6
- uses: taiki-e/install-action@v2.86.3
with:
tool: cargo-mutants

Expand Down
Loading
Loading