Agent Contract
opt-shell는 에이전트가 제품급 화면을 일관되게 산출하도록 제약을 제공해야 합니다. 이 문서는 그 실행 규약입니다.
reopt design업데이트
1. 기본 우선순위
DESIGN.md first
새 화면을 만들기 전에 루트 DESIGN.md로 visual intent와 component styling을 먼저 읽습니다.
Workspace first
workspace component가 primary API입니다. covered screen에서는 className 조합이나 low-level ShellPage보다 workspace를 먼저 선택합니다.
Adapter before engine
DataGrid와 Editor가 필요하면 직접 렌더링보다 ShellDataGridAdapter, ShellEditorAdapter를 우선합니다.
Shared state boundary
page-local spinner와 empty card를 만들지 않고 ShellStateBoundary를 사용합니다.
Policy over ad-hoc layout
width, density, aside behavior는 manifest policy로 결정하고 임의 class override를 최소화합니다.
Audit is part of rollout
`opt harness check`, `opt harness doctor`, package lint, generated docs integrity를 통과해야 rollout 완료로 간주합니다.
Review before activation
managed harness draft는 저장 후 review를 거쳐 APPROVED 상태가 되어야 하고, DESIGN.md alignment가 review 상태가 아니어야만 active runtime으로 올릴 수 있습니다.
Fresh proof before activation
Preview에서 현재 draft hash에 연결된 PASS design proof를 캡처해야 하며, 수정으로 stale된 proof는 activation을 막습니다.
Operational artifacts stay current
generated docs, scaffold guard matrix, `opt harness check/doctor` report는 같은 contract source를 보며 drift를 남기지 않아야 합니다.
Scaffold before ad-hoc layout
새 화면은 opt-shell scaffold로 시작하고, 그 위에서 recipe와 domain content를 채웁니다.
2. 작업 모델
에이전트는 먼저 루트 `DESIGN.md`로 look and feel을 읽고, 그 다음 현재 화면이 어떤 작업 흐름인지 분류한 뒤 recipe와 adapter를 선택해야 합니다. 현재 runtime에서는 `ListWorkspace` 같은 helper가 우선 진입점이고, `ShellPage recipe="..."`는 escape hatch로 남습니다. 임의 div 조합으로 화면을 완성한 뒤 나중에 harness를 덧씌우는 방식은 허용하지 않습니다. harness는 후처리 테마가 아니라 설계의 시작점이어야 합니다.
managed harness를 다룰 때도 같은 원칙이 적용됩니다. draft를 수정한 뒤 바로 activate하는 것이 아니라 preview로 결과를 확인하고, current hash 기준 fresh proof를 캡처하고, review note와 approval evidence를 남긴 뒤, APPROVED 상태와 DESIGN.md alignment readiness를 모두 만족할 때만 runtime으로 승격해야 합니다. 하네스는 단순 설정 JSON이 아니라 검토 가능한 제품 정책 단위입니다.
3. definition of done
- DESIGN.md의 visual intent와 opt-shell recipe가 충돌하지 않는다.
- 화면이 canonical recipe 중 하나로 설명 가능하다.
- loading / empty / error 상태가 ShellStateBoundary로 통일된다.
- DataGrid / Editor chrome이 adapter ownership 아래 있다.
- page width와 density가 manifest policy로 결정된다.
- managed harness draft는 review를 거쳐 APPROVED가 된 뒤에만 activation 대상이 된다.
- managed harness draft의 design alignment score가 review 상태면 activation 대상이 아니다.
- managed harness draft는 current hash에 연결된 fresh PASS design proof가 없으면 activation 대상이 아니다.
- approved draft를 수정하면 review 상태가 다시 DRAFT로 돌아가 stale approval을 막는다.
- approved draft를 수정하면 이전 design proof도 stale이 되어 다시 proof를 캡처해야 한다.
- scaffold bundle, generated docs, opt harness check/doctor가 현재 contract와 같은 상태를 가리킨다.
- opt harness check/doctor와 package lint가 위반을 잡고 docs가 현재 상태를 반영한다.
covered screen에서는 low-level `ShellPage` 조합보다 workspace-first abstraction이 우선입니다. direct `ShellPage` 사용은 예외로 남겨야 recipe가 단순 label이 아니라 실제 설계 계약으로 기능합니다.
4. enforcement 계층
Type contract
workspace component가 최소 `header`와 body를 강제해 recipe를 raw page composition보다 앞세웁니다.
Audit contract
covered screen은 expected slot, shared helper, adapter ownership, fullscreen-tool surface contract까지 검사합니다.
Browser proof
smoke와 visual proof가 대표 Builder 화면에서 recipe와 fullscreen contract를 실제 UI로 검증하고, managed harness activation에는 fresh PASS proof를 직접 연결합니다.
Governance contract
Builder Harness Manager가 draft, review, approval, activity evidence를 노출하고 activation gate를 실제 운영 흐름으로 강제합니다. activity intelligence는 timeline, learnings, export를 위한 searchable read model도 제공합니다.
5. 리뷰 기준
리뷰에서는 "예뻐 보이는가"보다 "harness ownership이 유지되는가"를 먼저 봅니다. 직접 엔진 렌더링, 임의 width override, 상태 UX 분산, recipe 불명확성은 모두 품질 회귀로 취급합니다. 이 기준이 있어야 에이전트 산출물이 팀 내에서 반복 가능해집니다.
managed harness 리뷰에서는 여기에 한 가지가 더 붙습니다. `preview가 충분히 설명력을 가지는가`, `review note와 actor evidence가 남는가`, `승인 전 activation이 막히는가`, `DESIGN.md alignment review 상태가 activation gate에 실제로 연결되는가`, `current draft 기준 fresh design proof가 있는가`, `activity intelligence가 이후 운영 학습으로 남는가`를 함께 봐야 합니다. 그래야 하네스가 단순 개인 설정이 아니라 팀이 공유하는 제품 운영 기준이 됩니다.
6. ESLint 하네스 규칙
@reopt/eslint-config/opt-shell-rules 플러그인이 IDE 실시간 피드백을 제공합니다. CI 시점 감사 외에 개발 중 즉시 위반을 잡습니다.
| Rule | Severity | Description |
|---|---|---|
| no-raw-engine-in-recipe | error | workspace 파일에서 DataGrid/Editor를 직접 import하면 에러. 반드시 ShellDataGridAdapter/ShellEditorAdapter 사용. |
| require-state-boundary | warning | workspace 화면에 ShellStateBoundary가 없으면 경고. loading/empty/error 상태 처리 누락 방지. |
| no-hardcoded-width | warning | recipe 화면에서 max-w-*/w-full 직접 사용 감지. policy.contentWidth를 사용해야 함. |
7. progressive phase disclosure
ShellAgentPhase는 agent에 노출되는 하네스 정보를 개발 단계별로 제한합니다. 한 번에 모든 recipe/slot/policy/adapter를 보여주면 agent 정확도가 떨어지므로, 단계에 맞는 정보만 제공합니다.
| Phase | Exposed | Blocked |
|---|---|---|
| scaffold | recipe 선택 + scaffold 명령 | slot 상세, policy, adapter |
| implement | 선택된 recipe의 slot + adapter | 다른 recipe, policy 조정 |
| polish | policy 옵션 + state labels | recipe 변경, 생성 |
| audit | 감사 코드 + 수정 패턴 | 모든 생성/변경 action |
| full | 전부 (하위 호환) | 없음 |
8. completeness scoring
computeCompletenessScore()는 audit finding을 7개 카테고리로 분류하고 가중 평균으로 0-100 점수를 산출합니다. agent가 "얼마나 완성됐는지" 임계값 기반 판단을 할 수 있습니다.
| Category | Weight |
|---|---|
| layout | 20% |
| recipe-contract | 25% |
| adapter-ownership | 15% |
| state-ux | 10% |
| design-document | 10% |
| scaffold-bundle | 10% |
| accessibility | 10% |
Builder 하네스 매니저의 Activation Readiness 체크리스트와 Recipe 탭 사이드바에서 이 점수를 실시간으로 확인할 수 있습니다.