6.3 KiB
Contract 1 — Goal → Assumption → Problem → Action Chain
Root SSOT: rules/advisory-depth.md §"Contract 1" + §"Why Assumption Surfacing matters"
parent: README.md
Every finding, recommendation, or critique must be expressed as a causal chain with explicit real-world assumptions between the source text and the critique. The chain has seven required fields. None can be omitted.
7-Field Chain Template
- **원래 목표 / Original goal:**
- 인용 / Verbatim quote: "<exact text, byte-for-byte from source>"
- 위치 / Source location: `<path>:<line>` (or `<path>:<startLine>-<endLine>` for ranges)
- 해석 / Interpretation: <agent's one-line restatement of what the quoted text intends>
- **현재 상태 / Current state:**
- 인용 / Verbatim quote: "<exact text, byte-for-byte from source>"
- 위치 / Source location: `<path>:<line>`
- 또는 / Or: "해당 라인 없음 — 명세에 명시되지 않음" (only when the gap is the absence itself)
- **실무 가정 / Real-world assumptions (REQUIRED):**
명시적 가정이 없으면 비판은 "에이전트가 상상한 구현"에 대한 비판이 되어 신뢰성을 잃는다.
최소 1개, 일반적으로 2~3개의 명시적 가정을 나열한다.
1. **가정 A:** <e.g., "implementation will be synchronous", "production scale > 1000 RPS", "team is using Kubernetes", "this branch will be implemented as-written">
- **무효 조건 / Falsifies if:** <under what concrete condition this assumption is false>
- **검증 방법 / How user can verify in their context:** <a specific check the user can run>
2. **가정 B:** ...
3. **가정 C:** ...
- **간극 / Gap (given the assumptions hold):**
- **구체적 실패 모드 / Concrete failure mode:** <X 상황에서 Y가 발생하여 Z가 깨진다>
- **재현 조건 / Reproduction condition:** <the trigger that actually exposes this in practice>
- **이 finding이 무효화되는 시나리오 / When this finding doesn't apply:** <if assumption A or B is false, this gap disappears — be explicit about which assumption is load-bearing>
- **필요 조치 / Required action:** <the specific action that closes the gap>
- **조치 근거 / Why this action:** <why this specific action (not a generic one) is correct here, given the stated assumptions>
- **대안 / Alternatives considered:** 3~5 enumerated per Contract 2 (see [`contracts-2-3-4-structure.md`](contracts-2-3-4-structure.md)).
- **반대 논거 / Counterarguments (REQUIRED — minimum 1, typical 2~3):**
이 권고를 적용하지 말아야 하는 시나리오, 또는 이 비판이 과장된 케이스를 명시한다.
자기 권고에 대한 self-critique이며, falsification 가능성을 더 폭넓게 확보하는 단계다.
1. **반대 A:** <이 권고가 틀릴 수 있는 시나리오, 또는 권고 비용이 효익을 초과하는 케이스>
- **반대 근거:** <왜 이 시나리오에서는 권고가 부적절한가>
- **사용자가 자기 환경에서 이 반대를 검증하는 방법:** <한 줄 체크>
2. **반대 B:** <또 다른 falsification 시나리오>
3. **반대 C:** ...
반대 논거가 0개라면 finding은 자동 `BLOCKED`. 자기 권고에 반대할 시나리오를 단 하나도 떠올리지 못한다면, 그 권고는 충분히 검증되지 않은 것이다.
강제 규칙
- A finding without a cited Original goal (verbatim + line) is
INFERENCEand must be labeled as such. - A finding without a concrete failure mode in Gap is opinion, not advice.
- A finding without explicit Real-world assumptions is forbidden — the agent must surface the implementation, scale, or context assumption that turns the spec text into a critique-worthy situation, so the user can immediately tell whether the assumption applies to their reality.
- Bare findings like "성능이 떨어질 수 있다" or "고려가 필요하다" are forbidden. They must be expanded into a Gap with a named failure mode (for example, "스레드 풀 200 큐 + AbortPolicy → 큐 포화 시 RejectedExecutionException → outbox publish 손실").
Why Assumption Surfacing Matters
When the source text is ambiguous, in-progress (e.g., "검토", "TBD"), or stated at one level (e.g., "decision" vs. "implementation note"), the agent often imagines the worst-case implementation and critiques that. The critique then targets an imagined implementation, not the actual spec.
Past failures this rule fixes
Example 1 — NTP drift:
- Spec says
"NTP drift > 5초 시 readiness fail 검토"(line 116). - Agent imagines
"synchronous NTP query inside the readiness probe"and critiques DoS risk.- Without assumption surfacing: the critique sounds authoritative but targets an imagined naive implementation.
- With assumption surfacing: the agent must write
"가정: 검토 단계에서 동기 호출로 구현될 것". The user immediately sees: "no, my plan is async — this critique doesn't apply" or "yes, I had not thought about sync vs async — this critique stands".
Example 2 — management port:
- Spec says
"management port 9001 분리"and does not specify SecurityFilterChain. - Agent imagines
"no filter chain configured, exposed to internet".- Without assumption surfacing: "9001 포트가 무방비로 노출됨" — overconfident.
- With assumption surfacing:
"가정: 사용자가 management context를 위한 별도 SecurityFilterChain을 아직 구성하지 않았음". User: "아, 나 이미 구성했어" → critique no longer applies, no false alarm.
Rule purpose
The rule is not to weaken critiques — it is to make critiques falsifiable. A critique whose assumption is wrong should be visibly rejectable in 5 seconds, not waste the user's time chasing a non-existent problem.
Antigravity-specific 메모
Counterargument 존재는 hook 미커버. 본 Contract 의 모든 강제는 agent self-check 단독 책임이다. finding 작성 시 self-check 로 다음을 명시적으로 통과시킬 것:
- 7-field 사슬 완비 ?
- Original goal / Current state 가 byte-for-byte verbatim + workspace-relative path?
- 실무 가정 최소 1개 + 무효 조건 + 사용자 검증 방법?
- Counterargument 최소 1개?
하나라도 미달 → finding 폐기 또는 INFERENCE 라벨.