Priority
P1
Problem
#965는 DI bootstrap validation을 일급 계약으로 만들었고, acceptance criteria에 "diValidation: "off" 또는 explicit unsafe flag 없이 missing registration이 조용히 new type() fallback으로 숨지 않는다"를 포함했다. 정책은 구현됐다.
그런데 그 정책을 구현한 커밋이 같은 커밋에서 모든 진입 템플릿에 diValidation: "off"를 추가했다. 결과적으로 생성된 앱은 예외 없이 새 계약을 우회한 상태로 시작하고, 이후 커밋에서 그 우회가 테스트로 고정됐다. 사용자가 scaffold로 만든 앱은 registration 누락을 부팅 시점에 잡지 못한다.
diValidation: "off"가 필요한 기술적 이유가 코드나 이슈에 남아 있지 않다. 템플릿 컨트롤러는 모두 @Component가 붙어 있어 검증을 켜도 통과할 것으로 보인다.
Evidence
5403360 fix: validate HTTP DI bootstrap contracts는 packages/transports-http/src/libs/CrocoApp.ts에 정책을 추가하면서 동시에 템플릿 5개에 diValidation: "off" 한 줄씩을 추가했다.
- 현재
diValidation: "off"가 있는 위치:
packages/create-croco-app/templates/saas/apps/api-server/src/app.ts:40
packages/create-croco-app/templates/spa-be-split/apps/api-server/src/app.ts:49
packages/create-croco-app/templates/ai-saas/apps/api-server/src/app.ts.hbs:41
packages/create-croco-app/templates/admin-console/apps/api-server/src/app.ts.hbs:48
packages/create-croco-app/templates/addons/web-meta-vite-fullstack/api-worker/src/index.ts:57
packages/create-croco-app/templates/saas/apps/api-server/src/tests/SaasDemo.spec.ts:66-67이 이 우회를 테스트로 고정한다:
// The template production bootstrap intentionally configures diValidation: "off".
validation: { di: "off" },
주석은 "intentionally"라고 하지만 사유는 적혀 있지 않다.
- 템플릿 컨트롤러 3개는 모두
@Component가 붙어 있다: templates/saas/apps/api-server/src/controllers/의 JobsController.ts, OperationsController.ts, SaasController.ts.
packages/transports-http/src/libs/CrocoApp.ts:312-314에 따르면 NODE_ENV가 development/test면 기본값이 이미 warn이므로, 로컬 개발 편의를 위한 명시적 off는 불필요하다.
packages/transports-http/src/libs/CrocoApp.ts:363-374의 di-missing-provider 진단은 provider별 사용처(route, guard, interceptor)를 역추적해 제공하는데, 템플릿 사용자는 이 진단을 받지 못한다.
Desired outcome
생성된 앱이 DI bootstrap 계약을 켠 상태로 시작한다. registration 누락이 부팅 시점 진단으로 드러나며, 검증을 끄는 선택은 문서화된 사유가 있는 경우로 한정된다.
Proposed implementation path
- 템플릿 5개에서
diValidation: "off"를 제거하고 각 템플릿의 generated app smoke를 실행해 실제로 실패하는지 확인한다.
- 실패하는 템플릿이 있으면 원인을 특정한다. 누락된 provider는
@Component 추가 또는 명시적 registration으로 해결한다.
- 구조적으로 켤 수 없는 템플릿이 남으면
off 대신 warn을 사용하고, 사유를 코드 주석이 아니라 이 이슈와 템플릿 README에 기록한다.
SaasDemo.spec.ts의 validation: { di: "off" } override를 제거해, 템플릿 테스트가 production bootstrap을 그대로 검증하게 한다.
pnpm create-croco-app:smoke와 pnpm --filter create-croco-app smoke:generated-apps가 변경된 템플릿으로 통과하는지 확인한다.
Acceptance criteria
grep -rn 'diValidation' packages/create-croco-app/templates/가 "off"를 출력하지 않는다.
templates/saas/.../SaasDemo.spec.ts가 validation override 없이 production bootstrap을 부팅한다.
- 모든 goal에 대한 generated app smoke가 통과한다.
warn으로 남기는 템플릿이 있다면 그 사유가 문서로 설명된다.
- 템플릿에서 provider registration을 누락시킨 fixture가 결정적
transports-http/di-missing-provider 진단을 낸다.
Validation
pnpm create-croco-app:smoke
pnpm --filter create-croco-app smoke:generated-apps
pnpm first-success:verify
pnpm --filter create-croco-app test
pnpm check
Scope boundaries
diValidation의 기본값이나 CrocoApp 정책 로직 변경은 포함하지 않는다.
- 프레임워크 패키지 테스트의 검증 우회 정리는 포함하지 않는다.
examples/의 securityValidation 문제는 별도 이슈에서 다룬다.
Priority
P1
Problem
#965는 DI bootstrap validation을 일급 계약으로 만들었고, acceptance criteria에 "diValidation: "off"또는 explicit unsafe flag 없이 missing registration이 조용히new type()fallback으로 숨지 않는다"를 포함했다. 정책은 구현됐다.그런데 그 정책을 구현한 커밋이 같은 커밋에서 모든 진입 템플릿에
diValidation: "off"를 추가했다. 결과적으로 생성된 앱은 예외 없이 새 계약을 우회한 상태로 시작하고, 이후 커밋에서 그 우회가 테스트로 고정됐다. 사용자가 scaffold로 만든 앱은 registration 누락을 부팅 시점에 잡지 못한다.diValidation: "off"가 필요한 기술적 이유가 코드나 이슈에 남아 있지 않다. 템플릿 컨트롤러는 모두@Component가 붙어 있어 검증을 켜도 통과할 것으로 보인다.Evidence
5403360 fix: validate HTTP DI bootstrap contracts는packages/transports-http/src/libs/CrocoApp.ts에 정책을 추가하면서 동시에 템플릿 5개에diValidation: "off"한 줄씩을 추가했다.diValidation: "off"가 있는 위치:packages/create-croco-app/templates/saas/apps/api-server/src/app.ts:40packages/create-croco-app/templates/spa-be-split/apps/api-server/src/app.ts:49packages/create-croco-app/templates/ai-saas/apps/api-server/src/app.ts.hbs:41packages/create-croco-app/templates/admin-console/apps/api-server/src/app.ts.hbs:48packages/create-croco-app/templates/addons/web-meta-vite-fullstack/api-worker/src/index.ts:57packages/create-croco-app/templates/saas/apps/api-server/src/tests/SaasDemo.spec.ts:66-67이 이 우회를 테스트로 고정한다:@Component가 붙어 있다:templates/saas/apps/api-server/src/controllers/의JobsController.ts,OperationsController.ts,SaasController.ts.packages/transports-http/src/libs/CrocoApp.ts:312-314에 따르면NODE_ENV가 development/test면 기본값이 이미warn이므로, 로컬 개발 편의를 위한 명시적off는 불필요하다.packages/transports-http/src/libs/CrocoApp.ts:363-374의di-missing-provider진단은 provider별 사용처(route, guard, interceptor)를 역추적해 제공하는데, 템플릿 사용자는 이 진단을 받지 못한다.Desired outcome
생성된 앱이 DI bootstrap 계약을 켠 상태로 시작한다. registration 누락이 부팅 시점 진단으로 드러나며, 검증을 끄는 선택은 문서화된 사유가 있는 경우로 한정된다.
Proposed implementation path
diValidation: "off"를 제거하고 각 템플릿의 generated app smoke를 실행해 실제로 실패하는지 확인한다.@Component추가 또는 명시적 registration으로 해결한다.off대신warn을 사용하고, 사유를 코드 주석이 아니라 이 이슈와 템플릿 README에 기록한다.SaasDemo.spec.ts의validation: { di: "off" }override를 제거해, 템플릿 테스트가 production bootstrap을 그대로 검증하게 한다.pnpm create-croco-app:smoke와pnpm --filter create-croco-app smoke:generated-apps가 변경된 템플릿으로 통과하는지 확인한다.Acceptance criteria
grep -rn 'diValidation' packages/create-croco-app/templates/가"off"를 출력하지 않는다.templates/saas/.../SaasDemo.spec.ts가validationoverride 없이 production bootstrap을 부팅한다.warn으로 남기는 템플릿이 있다면 그 사유가 문서로 설명된다.transports-http/di-missing-provider진단을 낸다.Validation
pnpm create-croco-app:smokepnpm --filter create-croco-app smoke:generated-appspnpm first-success:verifypnpm --filter create-croco-app testpnpm checkScope boundaries
diValidation의 기본값이나CrocoApp정책 로직 변경은 포함하지 않는다.examples/의securityValidation문제는 별도 이슈에서 다룬다.