Skip to content
Draft
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
796a394
⚡ Bolt: [NetworkGraph 배열 슬라이싱 최적화]
seonghobae Sep 7, 2026
9b89f64
⚡ Bolt: [NetworkGraph 배열 슬라이싱 최적화]
seonghobae Sep 7, 2026
939c805
chore(bolt): remove completed task-specific repository guidance
seonghobae Sep 7, 2026
7c36562
test(network): cover bounded graph option materialization
seonghobae Sep 7, 2026
e20685f
⚡ Bolt: [NetworkGraph 배열 슬라이싱 최적화]
seonghobae Sep 8, 2026
8df8332
⚡ Bolt: [NetworkGraph 배열 슬라이싱 최적화]
seonghobae Sep 8, 2026
b3ef18a
test(network-graph): restore bounded option regression
seonghobae Sep 8, 2026
79e2bbc
⚡ Bolt: [NetworkGraph 배열 슬라이싱 최적화]
seonghobae Sep 8, 2026
8770667
chore(bolt): clean up unverified retro doctrines from changelog and j…
seonghobae Sep 8, 2026
08129db
test(network-graph): prove bounded materialization with iterable inst…
seonghobae Sep 8, 2026
816d614
test(network-graph): prove bounded materialization with iterable inst…
seonghobae Sep 8, 2026
06abf77
test(network-graph): preserve bounded option semantics during instrum…
seonghobae Sep 8, 2026
f25d440
test(network-graph): prove bounded materialization with iterable inst…
seonghobae Sep 8, 2026
bb4d04b
test(network-graph): restore isolated bounded-option regression
seonghobae Sep 8, 2026
2638e4f
test(network-graph): assure strict map iteration limits with global r…
seonghobae Sep 8, 2026
f25978c
test(network-graph): combine bounded semantics with failure-safe cleanup
seonghobae Sep 8, 2026
27a5acf
test(network-graph): assure strict map iteration limits with global r…
seonghobae Sep 8, 2026
419d3d7
test(network-graph): restore bounded option semantics
seonghobae Sep 8, 2026
ae7e5ce
test(network-graph): assure strict map iteration limits with global r…
seonghobae Sep 8, 2026
6ed655a
test(network-graph): restore semantic bounds after concurrent rewrite
seonghobae Sep 8, 2026
4a9980b
test(network-graph): bound reads per iterator
seonghobae Sep 8, 2026
cafd2f8
chore(bolt): remove completed task-specific repository guidance
seonghobae Sep 9, 2026
c66d3fb
fix(deps): bump next and sharp to resolve security vulnerabilities (C…
seonghobae Sep 9, 2026
c5c6d23
fix(deps): stack NetworkGraph behind patched frontend floor
seonghobae Sep 9, 2026
fdaaf05
test(ui): make NetworkGraph inspection deterministic
seonghobae Sep 9, 2026
fb1929b
docs(agent): serialize Next artifact verification
seonghobae Sep 9, 2026
f88343d
fix(scope): return Search browser evidence to copy owner
seonghobae Sep 9, 2026
8d18e79
fix(deps): restack NetworkGraph on current security owner
seonghobae Sep 9, 2026
156c16e
chore(network-graph): return governance and release-note ownership
seonghobae Sep 9, 2026
ba857c4
test(network-graph): restore per-iterator read bounds
seonghobae Sep 9, 2026
d01a536
chore(stack): adopt current frontend security contract
seonghobae Sep 9, 2026
9a299c0
chore(stack): adopt repaired frontend security owner
seonghobae Sep 9, 2026
3f5c655
test(network-graph): reject generator-branded source narration
seonghobae Sep 13, 2026
da82377
fix(network-graph): remove generator-branded optimization comments
seonghobae Sep 13, 2026
3379e4f
fix(network-graph): drop unrelated contrast drift
seonghobae Sep 13, 2026
99cd965
test(network-graph): assure strict map iteration limits with global r…
seonghobae Sep 15, 2026
08fcb92
test(network-graph): assure strict map iteration limits with precise …
seonghobae Sep 15, 2026
804401e
merge(network-graph): adopt current dependency-security parent
seonghobae Sep 15, 2026
8f98789
test(network-graph): bound each option iterator independently
seonghobae Sep 15, 2026
cf7092d
chore(stack): adopt current dependency-security parent
seonghobae Sep 16, 2026
f72fdae
chore(stack): adopt final PostCSS security-contract parent
seonghobae Sep 16, 2026
9723520
test(network): restore Map.values on setup failure
seonghobae Sep 16, 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
4 changes: 4 additions & 0 deletions .jules/bolt.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,7 @@
## 2024-05-24 - [React Component Memoization]
**Learning:** In React components like `WorkspaceHome`, when layout state or polling changes trigger parent re-renders, expensive child components like `EmailDetail` will also re-render unnecessarily if not memoized.
**Action:** Always consider `React.memo` for heavy child components that rely on stable props (like IDs) when the parent component has frequent unrelated state updates.

## 2023-10-27 - O(N) Array Mapping Blocked Main Thread in NetworkGraph
**Learning:** When using `Array.from(map.values()).slice(0, N)` inside `useMemo` hooks, it creates a full intermediate O(N) array allocation before truncating to N items. In components with large Maps like `NetworkGraph`, this degrades performance during each render pass.
**Action:** Replace `Array.from(map).slice(0, N)` with a bounded `for...of` loop over `map.values()` and an early `break` when the limit is reached, maintaining O(1) performance and avoiding intermediate array allocations.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2760,3 +2760,6 @@
### 문서 (Documentation)

- `yaml.load()`와 관련해 발생한 Bandit B506 항목에 대해 규칙 한정적 오탐지(false-positive) 판정 및 처분 근거(disposition)를 담은 `docs/doctoring/bandit-b506-false-positive-disposition.md` 문서를 추가했습니다. 이는 제품의 실제 취약점 패치가 아니며, PyYAML의 `SafeLoader`를 명시적으로 사용하는 사용자 정의 로더에 대해 오탐지를 억제하는 조건과 롤백 기준을 테스트 증거와 함께 기록한 문서입니다.

### 변경 사항
- **성능 (Performance)**: `NetworkGraph` 컴포넌트에서 `useMemo` 내부의 `Array.from(map).slice()` 패턴을 크기 제한이 있는 `for...of` 루프로 변경하여 대규모 데이터 처리 시 발생하는 불필요한 중간 배열 할당을 제거하고 O(1) 성능을 달성하도록 최적화했습니다.
36 changes: 26 additions & 10 deletions frontend/src/components/NetworkGraph.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -286,19 +286,35 @@ export default function NetworkGraph() {

const firstEdge = edges[0] ?? null;
const relationshipOptions = useMemo(() => {
return Array.from(edgeMap.values()).slice(0, 5).map((edge, index) => ({
edge,
id: String(edge.id),
label: `관계 ${index + 1}: ${describeEdge(edge, nodeMap)}`,
}));
// ⚡ Bolt Optimization: Replace O(N) Array.from(map).slice() with bounded for...of loop
// to avoid intermediate array allocations and achieve O(1) performance for large maps.
const options = [];
let index = 0;
for (const edge of edgeMap.values()) {
if (options.length >= 5) break;
options.push({
edge,
id: String(edge.id),
label: `관계 ${index + 1}: ${describeEdge(edge, nodeMap)}`,
});
index++;
}
return options;
}, [edgeMap, nodeMap]);

const nodeOptions = useMemo(() => {
return Array.from(nodeInstanceMap.values()).slice(0, 8).map((node) => ({
id: String(node.id),
label: `노드: ${String(node.label ?? node.id)}`,
node,
}));
// ⚡ Bolt Optimization: Replace O(N) Array.from(map).slice() with bounded for...of loop
// to avoid full Map iteration and intermediate allocations on every render pass.
const options = [];
for (const node of nodeInstanceMap.values()) {
if (options.length >= 8) break;
options.push({
id: String(node.id),
label: `노드: ${String(node.label ?? node.id)}`,
node,
});
}
return options;
}, [nodeInstanceMap]);

const selectRelationship = (edge: Edge, status: string) => {
Expand Down
Loading