fix(core,engine): OFFSET 순회 중 필터 컬럼 변경으로 인한 처리 누락 수정

Laravel chunk/each 는 OFFSET 기반이라, 콜백이 행의 필터 소속을 바꾸면
(필터 컬럼을 채우거나 매칭 행을 삭제하면) 다음 조회가 그만큼 앞으로 밀려
미처리 행을 조용히 건너뛴다. 250건/청크 100 이면 정확히 100건이 남는다.
코어·번들 확장 전수 조사로 확정한 6곳을 chunkById(키셋 순회)로 통일했다.

브라우저 검수(28축)에서 계획에 없던 결함 12건이 드러나 같은 사슬에서
수정했다. 이 중 layout_strategy=keep 무효화와 수정 감지 실패 시 "수정 없음"
오보는 사용자 작업 소실에 직결된다.

재발 방지로 audit 룰을 추가했고, 수정 6곳을 원복해 red 6건 / 복원 후 green
0건으로 판별력을 검증했다.
This commit is contained in:
HeuJung
2026-07-31 21:50:45 +09:00
parent 1866f0d566
commit 1eedbbdda1
55 changed files with 2764 additions and 198 deletions
+5 -1
View File
@@ -4491,7 +4491,11 @@ class ModuleManager implements ModuleManagerInterface
$onProgress?->__invoke('layout', '레이아웃 갱신 중...');
if ($previousStatus === ExtensionStatus::Active->value && $module) {
$preserveModified = ($layoutStrategy === 'keep');
$this->registerModuleLayouts($identifier);
// registerModuleLayouts() 를 여기서 호출하지 않는다 — 그 메서드는 전략을
// 모른 채 모든 레이아웃의 content 와 original_content_hash 를 파일 기준으로
// 덮어써서, 뒤따르는 refreshModuleLayouts($preserveModified) 가 비교할
// "사용자 수정본" 을 이미 지워버린다(= keep 전략이 항상 무효화).
// 신규 레이아웃 생성은 refreshModuleLayouts 의 created 분기가 담당한다.
$this->registerLayoutExtensions($module);
$this->refreshModuleLayouts($identifier, $preserveModified);
}