Skip to content

docs(spec): Sprint 1 plan — 4 SPECs audit-ready#118

Merged
GoosLab merged 3 commits intomainfrom
feature/sprint-1-plan
May 5, 2026
Merged

docs(spec): Sprint 1 plan — 4 SPECs audit-ready#118
GoosLab merged 3 commits intomainfrom
feature/sprint-1-plan

Conversation

@GoosLab
Copy link
Copy Markdown
Contributor

@GoosLab GoosLab commented May 5, 2026

Summary

GOOSE Sprint 1 (Hermes Agent 추월 8주 로드맵의 첫 sprint) plan phase 완료. 4 SPEC 모두 audit-ready (총 79 EARS REQs + 60 ACs).

4 신규 SPECs

SPEC Priority REQ AC Audit Verdict
LLM-ROUTING-V2-001 P1 14 11 self-audit CONDITIONAL_GO (수용)
MSG-TELEGRAM-001 P0 25 11 iter-1 CONDITIONAL_GO → fix → iter-2 PASS (0.91)
TOOLS-WEB-001 P0 18 18 self-audit PASS
SCHEDULER-001 P0 22 20 PASS (0.92)

전략 결정 (이번 plan phase에서 결정된 사항)

  • LLM 어댑터: 현 15 direct 유지, OpenRouter 미도입 (6개월 후 재평가). 자동 failover 부재는 ROUTING-V2 수동 fallback chain으로 보완.
  • 도구 카탈로그: 75개 목표 (Hermes 40+ 대비 1.9배). 멀티미디어/사주/한국특화는 별도 백로그.
  • 메시징 우선순위: Telegram → (Sprint 2: Email) → Discord/Slack.
  • 자동 생성 아키텍처: 3-tier (skill + agent + team). Hermes는 skill만, 우리는 agent + team도 자동 생성.

산출물 (24 files, 6,107 insertions)

  • 20 SPEC 문서 (spec/plan/acceptance/spec-compact/research × 4)
  • 3 plan-audit reports
  • 2 status.txt

Test Plan

  • EARS 컴플라이언스 (Ubiquitous/Event-Driven/State-Driven/Unwanted) 4 카테고리 일관성
  • REQ ↔ AC traceability (Optional 제외 모든 REQ 매핑)
  • Frontmatter 8 필드 + labels
  • 한국어 본문 + 영어 식별자
  • 시간 추정 부재
  • 의존 SPEC FROZEN 검증

Next Steps (After Merge)

각 SPEC /moai run 진입 가능. 권장 순서:

  1. TOOLS-WEB-001 (웹 도구 인프라)
  2. MSG-TELEGRAM-001 (사용자 채널)
  3. LLM-ROUTING-V2-001 (라우팅 v2)
  4. SCHEDULER-001 (proactive 인프라)

관련 SPECs (예정)

  • COMPRESSOR-001 metadata drift 처리 (별도 chore commit; spec.md status: planned → implemented)
  • Sprint 2 (W3-4): SKILL-AUTOGEN + INSIGHTS-V2 + MSG-EMAIL
  • Sprint 3 (W5-6): WEATHER + CALENDAR + RITUAL-MORNING + MSG-DISCORD
  • Sprint 4 (W7-8): AGENT-AUTOGEN + JOURNAL + RITUAL-EVENING + MSG-SLACK

🗿 MoAI email@mo.ai.kr

Summary by CodeRabbit

릴리스 노트

  • 문서
    • 텔레그램 메시징 채널 통합 사양 추가
    • LLM 라우팅 v2 고도화 사양 추가
    • 일일 스케줄러 (일상 반려자) 사양 추가
    • 웹 도구 8종 (검색, 브라우징, RSS, 위키백과, ArXiv, 지도, Wayback, HTTP 조회) 사양 추가
    • 사양 감사 및 검토 보고서 생성

…-TELEGRAM + TOOLS-WEB + SCHEDULER)

GOOSE Sprint 1 (Hermes Agent 추월 8주 로드맵의 첫 sprint) plan phase 완료.
4 SPEC 모두 audit-ready 상태 도달 (총 79 EARS REQs + 60 ACs).

## 신규 SPEC 4종

- SPEC-GOOSE-LLM-ROUTING-V2-001 (P1, 14 REQ + 11 AC)
  - 15 direct adapter cost/latency/capability-aware 라우팅 + 수동 fallback chain
  - OpenRouter 미도입 결정 (6개월 후 재평가)
  - self-audit CONDITIONAL_GO (REQ-003/006 minor gap, 사용자 수용 후 audit-ready)

- SPEC-GOOSE-MSG-TELEGRAM-001 (P0, 25 REQ + 11 AC)
  - Telegram bot ingress + send tool, BRIDGE-001 위 wiring
  - plan-auditor iter-1 CONDITIONAL_GO → 5 clerical fix → iter-2 PASS (Score 0.91)

- SPEC-GOOSE-TOOLS-WEB-001 (P0, 18 REQ + 18 AC)
  - 8 web 도구 (search/browse/RSS/Wikipedia/ArXiv/maps/wayback/HTTP)
  - self-audit PASS

- SPEC-GOOSE-SCHEDULER-001 (P0, 22 REQ + 20 AC)
  - Proactive Ritual Scheduler (cron + timezone + holiday + pattern learning hook)
  - plan-auditor iter-1 PASS (Score 0.92)
  - RITUAL-MORNING/EVENING (Sprint 3-4) 인프라

## 산출물

- 20 SPEC 문서 (spec/plan/acceptance/spec-compact/research × 4)
- 3 plan-audit reports (.moai/reports/plan-audit/)
- 2 status.txt (MSG-TELEGRAM 신규, SCHEDULER 갱신)

## 전략 결정

- LLM 어댑터: 현 15 direct 유지 (OpenRouter 미도입)
- 도구 카탈로그: 75개 (멀티미디어/사주/한국특화 별도 백로그, Hermes 40+ 대비 1.9배)
- 메시징 우선순위: Telegram → (Sprint 2: Email) → Discord/Slack
- 자동 생성: 3-tier (skill + agent + team), Sprint 2-4에서 단계적 도입

## 다음 단계

각 SPEC /moai run 진입 가능. 권장 순서:
1. TOOLS-WEB-001 (웹 도구 인프라)
2. MSG-TELEGRAM-001 (사용자 채널)
3. LLM-ROUTING-V2-001 (라우팅 v2)
4. SCHEDULER-001 (proactive 인프라)

🗿 MoAI <email@mo.ai.kr>
@GoosLab GoosLab added type/docs 문서 작업 priority/p1-high 다음 릴리스 포함 area/llm-provider LLM provider 어댑터 영역 area/cli goosed / goose CLI labels May 5, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 5, 2026

Warning

Rate limit exceeded

@GoosLab has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 42 minutes and 32 seconds before requesting another review.

To keep reviews running without waiting, you can enable usage-based add-on for your organization. This allows additional reviews beyond the hourly cap. Account admins can enable it under billing.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: dbaa1237-e05f-4e3f-8e87-db567348edd0

📥 Commits

Reviewing files that changed from the base of the PR and between e2f4123 and dc31912.

📒 Files selected for processing (4)
  • .moai/reports/plan-audit/SPEC-GOOSE-MSG-TELEGRAM-001-review-2.md
  • .moai/reports/plan-audit/SPEC-GOOSE-SCHEDULER-001-review-1.md
  • .moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/spec-compact.md
  • .moai/specs/SPEC-GOOSE-TOOLS-WEB-001/spec-compact.md

Walkthrough

이 PR은 GOOSE 에이전트의 세 가지 주요 기능(LLM 라우팅 v2, Telegram 메시징, 웹 도구)과 스케줄러 구현을 위한 specification 문서들을 추가합니다. Telegram과 스케줄러 spec에 대한 감사 리뷰 보고서도 포함되어 있습니다.

Changes

SPEC-GOOSE-MSG-TELEGRAM-001 (Telegram 메시징 통합)

계층 / 파일(s) 설명
설계 및 리서치
spec-GOOSE-MSG-TELEGRAM-001/research.md
Telegram Bot API 6.x 선택 근거, Go 라이브러리(go-telegram/bot) 평가, long polling vs webhook 전략, GOOSE 의존 SPEC 통합 패턴(BRIDGE/TOOLS/MEMORY/CREDENTIAL-PROXY/AUDIT) 정의.
구현 계획
spec-GOOSE-MSG-TELEGRAM-001/plan.md
4단계 phase 분해(P1 기초 설정, P2 감사/메모리 통합, P3 아웃바운드/파일, P4 스트리밍), 부트스트랩 의존성 주입 순서, 보안 고려사항 정의.
수용 기준
spec-GOOSE-MSG-TELEGRAM-001/acceptance.md
11개 AC-MTGM-001~011: setup/inbound/outbound/파일/Markdown V2/인라인 키보드/감시 로그, Given-When-Then 시나리오 및 edge case 정의.
Compact 스펙
spec-GOOSE-MSG-TELEGRAM-001/spec-compact.md
핵심 기능 정리, EARS 요구사항, 내부 패키지 구조, 외부 라이브러리 의존성.
완전 스펙 및 상태
spec-GOOSE-MSG-TELEGRAM-001/spec.md, status.txt
CLI 워크플로우, 폴링/웹훅 모드, inbound/outbound 처리 흐름, 권한 게이팅, audit 필드 스키마, status: audit-ready로 설정.
감사 리뷰
.moai/reports/plan-audit/SPEC-GOOSE-MSG-TELEGRAM-001-review-1.md, review-2.md
Iteration 1: CONDITIONAL_GO (0.83점), 5개 결함(AC 개수 불일치, 참조 오류, Markdown V2 예약문자 개수). Iteration 2: PASS (0.91점), 모든 결함 해결 확인, APPROVE for promotion.

SPEC-GOOSE-LLM-ROUTING-V2-001 (라우팅 v2 decorator)

계층 / 파일(s) 설명
리서치 및 설계
spec-GOOSE-LLM-ROUTING-V2-001/research.md
의존 SPEC 인터페이스 검토(ROUTER-001, RATELIMIT-001, ERROR-CLASS-001, LLM-001), OpenRouter 제외 근거 5가지, 정적 가격 테이블 trade-off, capability 매트릭스 검증 계획.
구현 계획
spec-GOOSE-LLM-ROUTING-V2-001/plan.md
4단계 phase: P1 정책/로더, P2 capability/rate-limit 어댑터, P3 fallback 체인/decorator, P4 E2E 통합 테스트. 각 phase별 REQ/AC 매핑, 커버리지 게이트, drift guard 정의.
수용 기준
spec-GOOSE-LLM-ROUTING-V2-001/acceptance.md
11개 AC-RV2-001~011: v1 호환성, 정책 모드 우선순위, 능력 필터링, rate-limit 제외, fallback 체인 실행, OpenRouter 통합 예외 처리, trace logging 형식.
Compact 스펙
spec-GOOSE-LLM-ROUTING-V2-001/spec-compact.md
핵심 결정(v2 decorator, OpenRouter 제외, 15×4 capability 정적 매트릭스), REQ-RV2-001~014 및 AC, pricing 테이블, quality gate, out-of-scope 항목.
완전 스펙
spec-GOOSE-LLM-ROUTING-V2-001/spec.md
정책 평가, capability 매트릭스 필터링, rate-limit 임계값 기반 후보 제외, manual fallback 체인 실행, RouterV2 decorator API, RoutingReason v2 prefix 포맷, YAML 스키마.

SPEC-GOOSE-SCHEDULER-001 (Daily Companion 스케줄러)

계층 / 파일(s) 설명
수용 기준
spec-GOOSE-SCHEDULER-001/acceptance.md
20개 AC-SCHED-001~020: cron 이벤트, 시간대 처리, 백오프 정책, 한국 공휴일 인식, quiet-hours, 패턴 학습, 영속성, 중복 제거, TZ 변화 대응, 로그 스키마, 강제 emit, 놓친 이벤트 재실행 (모두 BDD 형식, zap 로그 필드 검증 포함).
구현 계획
spec-GOOSE-SCHEDULER-001/plan.md
4단계 phase: P1 cron+persist, P2 TZ/holiday, P3 backoff/quiet-hours, P4 pattern-learner/replay. 의존성, 리스크/완화책, TDD 순서, TRUST 5 매핑, 종료 조건.
Compact 스펙
spec-GOOSE-SCHEDULER-001/spec-compact.md
5개 주요 이벤트, IN/OUT 범위, 22 REQ → 20 AC 매핑 요약, 5가지 안전 메커니즘(quiet-hours, backoff cap, replay 한계, suppression key, 버퍼드 채널 decoupling).
완전 스펙 및 상태
spec-GOOSE-SCHEDULER-001/spec.md, status.txt
메타데이터 업데이트: status: draftaudit-ready, updated_at 갱신.
감사 리뷰
.moai/reports/plan-audit/SPEC-GOOSE-SCHEDULER-001-review-1.md
Iteration 1: PASS (0.92점), must-pass 항목 4개 모두 통과, 3개 minor advisory(cosmetic/stylistic/grammar), 0개 blocking defect, "audit-ready" 권장.

SPEC-GOOSE-TOOLS-WEB-001 (웹 도구 카탈로그)

계층 / 파일(s) 설명
리서치 및 선택
spec-GOOSE-TOOLS-WEB-001/research.md
8개 웹 도구(web_search/web_browse/web_rss/web_wikipedia/web_arxiv/web_maps/web_wayback/http_fetch) 프로바이더/라이브러리 선택(Brave/Playwright/gofeed/go-readability/robotstxt/bbolt), Hermes와의 비교, 보안 고려사항(Landlock sandbox, 10MB cap, SSRF).
구현 계획
spec-GOOSE-TOOLS-WEB-001/plan.md
4개 milestone: M1 Search/HTTP, M2 Browse/Wikipedia, M3 RSS/ArXiv, M4 Maps/Wayback. 각 마일스톤별 파일 구조, 입력/출력 JSON 스키마, 공통 인프라(캐시/robots/safety/표준 응답), 테스트 전략.
수용 기준
spec-GOOSE-TOOLS-WEB-001/acceptance.md
18개 AC-WEB-001~018: 레지스트리, JSON 스키마 검증, 권한/robots/blocklist sequencing, redirect/크기 제한, 캐시 TTL, rate-limit 소진, Playwright 부재 처리, 표준 응답 shape, 도구별 정확도(Wikipedia 언어, RSS since, maps geocode, Wayback 스냅샷, search provider, audit 로그).
Compact 스펙
spec-GOOSE-TOOLS-WEB-001/spec-compact.md
8개 도구 공통 계약, 표준 응답 shape, User-Agent/robots/redirect/크기/권한/감시/rate-limit/캐시/blocklist 규칙, EARS 18개 항목 요약, AC 18개 항목, milestone 우선순위.
완전 스펙
spec-GOOSE-TOOLS-WEB-001/spec.md
도구 레지스트리 등록, JSON Schema draft 2020-12 강제, 표준 응답 wrapper, 제어 흐름(권한→robots→blocklist→redirect→크기), User-Agent/rate-limit/감시 통합, Playwright 격리(Linux Landlock), 18개 AC, implementation 가이드, 의존성, 리스크/마이그레이션 맵핑, DoD 체크리스트.

Estimated Code Review Effort

🎯 4 (Complex) | ⏱️ ~50 minutes

이유: 이 PR은 18개 이상의 specification 문서를 추가하며, 각 spec은 다음을 포함합니다:

  • 상세한 수용 기준(AC)과 BDD 시나리오 (11~20개 항목)
  • 4단계 구현 계획 및 phase별 deliverable
  • REQ/AC 교차 참조 및 추적성 매트릭스
  • 의존 SPEC 간의 복잡한 인터페이스 관계

reviewer는 다음을 확인해야 합니다:

  1. 각 spec 내 AC↔REQ 매핑의 일관성
  2. 다중 spec 간 의존성 정확성 (예: Telegram spec이 BRIDGE/TOOLS/MEMORY/AUDIT 인터페이스 올바르게 인용)
  3. 감사 리뷰 보고서의 결함 해결 상태 및 점수 타당성
  4. 구현 계획의 실현 가능성 및 우선순위 설정
  5. 보안/동시성/리소스 고려사항의 포괄성

문서의 양이 크고 상호 참조가 많아 종합적인 검토가 필요합니다.

Suggested Labels

area/specs, area/docs, component/telegram, component/routing, component/web-tools, component/scheduler, type/specification, status/audit-ready

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목은 주요 변경 사항(4개 SPEC 감사 완료)을 명확하게 요약하고 있으며, 기술적이고 구체적입니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/sprint-1-plan

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 9

🧹 Nitpick comments (9)
.moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/plan.md (1)

86-102: ⚡ Quick win

ASCII/의사코드 fenced block에 language를 지정해 주세요.

Line 86, Line 112 코드 블록이 language 없이 열려 markdownlint(MD040) 경고가 납니다. text를 지정하면 린트/렌더링이 안정적입니다.

제안 diff
-```
+```text
 ┌────────────────────────────────────────────────────────┐
 ...
 └────────────────────────────────────────────────────────┘
-```
+```

-```
+```text
 Start(ctx, deps):
   1. config.Load() → yaml + keyring token
 ...
   9. block until ctx.Done()
-```
+```

Also applies to: 112-124

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/plan.md around lines 86 - 102, Two
fenced code blocks (the ASCII diagram block near "cmd/goose/cmd/telegram.go
(cobra: setup/start/...)" and the pseudocode block beginning "Start(ctx,
deps):") are missing a language tag and trigger markdownlint MD040; update their
opening fences from ``` to ```text so the blocks are explicitly marked as plain
text (apply the same change for the second block around the Start(ctx, deps)
pseudocode).
.moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/spec-compact.md (1)

29-46: ⚡ Quick win

Fenced code block에 language 지정이 필요합니다.

Line 29 코드 블록에 language가 없어 markdownlint(MD040) 경고가 발생합니다. 문서 렌더링/하이라이팅 일관성을 위해 text 또는 bash 등 명시를 권장합니다.

제안 diff
-```
+```text
 internal/messaging/telegram/
 ├── bootstrap.go      # Start(ctx, deps) entry — daemon hook
 ...
 internal/daemon/bootstrap.go  # MODIFY: messaging.Start 호출 추가
-```
+```
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/spec-compact.md around lines 29 -
46, The fenced code block containing the directory listing (the block starting
with "internal/messaging/telegram/") lacks a language tag and triggers
markdownlint MD040; update that block by adding a language identifier such as
text (i.e., change the opening fence from ``` to ```text) so the snippet is
consistently rendered/highlighted in the spec file
(SPEC-GOOSE-MSG-TELEGRAM-001/spec-compact.md).
.moai/specs/SPEC-GOOSE-TOOLS-WEB-001/research.md (1)

244-247: ⚡ Quick win

SSRF 방지 로직 명확화 필요.

Line 246에서 "본 SPEC 은 이런 IP 를 hard block 하지 않음" 이라고 했다가, line 247에서 "default blocklist 에 포함하여 explicit allow 필요" 라고 하여 약간 모순적입니다.

의도가 "hard block은 아니지만 default blocklist에 포함되어 있어서 사용자가 명시적으로 허용해야 호출 가능" 이라면, 이를 더 명확하게 표현하는 것이 좋겠습니다.

📝 명확성 개선 제안
-본 SPEC 은 이런 IP 를 hard block 하지 않음 (사용자가 의도적으로 로컬 서비스 호출 가능). 그러나 **default blocklist 에 포함하여 explicit allow 필요** 하도록 설계.
+본 SPEC 은 이런 IP 를 시스템 레벨에서 hard block 하지 않으나, **default blocklist 에 포함**하여 사용자가 명시적으로 허용(blocklist 에서 제거 또는 override)해야만 호출 가능하도록 설계.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.moai/specs/SPEC-GOOSE-TOOLS-WEB-001/research.md around lines 244 - 247,
Clarify the apparent contradiction in section "9.6 SSRF 방지": update the text
around "본 SPEC 은 이런 IP 를 hard block 하지 않음" and the following sentence about
"**default blocklist 에 포함하여 explicit allow 필요**" to state clearly that
http_fetch will not be universally hard-blocked but that these IPs are placed in
a default blocklist (so calls are blocked by default) and require an explicit
allow action via the PERMISSION-001 Confirmer (include how the Confirmer
indicates scope), and mention examples like 127.0.0.1, localhost,
169.254.169.254 and private CIDRs to make the intended behavior unambiguous.
.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/spec.md (3)

347-355: 💤 Low value

Decision tree 블록에 language identifier 추가 권장

의사결정 트리가 fenced code block으로 작성되었지만 언어 식별자가 누락되었습니다. text 식별자를 추가하면 렌더링이 개선됩니다.

제안된 수정
-```
+```text
 1. v1.Route(req) → primary/cheap 결정
 2. policy.Mode == PreferQuality && chain 없음 → v1 결정 그대로 (v1:simple|complex)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/spec.md around lines 347 - 355,
The fenced decision-tree code block that starts with "1. v1.Route(req) →
primary/cheap 결정" is missing a language identifier; update the opening
triple-backtick to include the text language identifier (```text) so the block
renders correctly (affects the decision tree lines referencing v1.Route(req) and
policy.Mode conditions).

319-330: 💤 Low value

Package structure 블록에 language identifier 추가 권장

패키지 구조 diagram이 fenced code block으로 작성되었지만 언어 식별자가 누락되었습니다. 디렉터리 구조이므로 text 식별자를 추가하는 것이 적절합니다.

제안된 수정
-```
+```text
 internal/llm/router/v2/
 ├── policy.go           # RoutingPolicy, PolicyMode, ProviderRef
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/spec.md around lines 319 - 330,
The fenced code block that lists the package structure (the block beginning with
"internal/llm/router/v2/") is missing a language identifier; update the opening
fence from ``` to ```text so the directory tree is treated as plain text (i.e.,
change the code fence that starts the block containing "internal/llm/router/v2/"
to use ```text).

169-177: 💤 Low value

Dependency graph 블록에 language identifier 추가 권장

의존성 그래프 diagram이 fenced code block으로 작성되었지만 언어 식별자가 누락되었습니다. ASCII art 형태이므로 text 식별자를 추가하면 렌더링이 개선됩니다.

제안된 수정
-```
+```text
 SPEC-GOOSE-LLM-001 (Provider 인터페이스, ProviderCapabilities)
     └─ SPEC-GOOSE-ROUTER-001 (Smart Routing v1, ProviderRegistry, completed)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/spec.md around lines 169 - 177,
The fenced dependency graph containing the ASCII art lines beginning with
"SPEC-GOOSE-LLM-001 (Provider 인터페이스, ProviderCapabilities)" should have a
language identifier added to the opening fence; change the opening "```" to
"```text" for that code block (keeping the closing "```") so the diagram
(including SPEC-GOOSE-ROUTER-001, SPEC-GOOSE-RATELIMIT-001,
SPEC-GOOSE-ERROR-CLASS-001, SPEC-GOOSE-ADAPTER-001/002) renders correctly.
.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/acceptance.md (1)

199-202: 💤 Low value

Trace 출력 예시 블록에 language identifier 추가 권장

여러 AC 시나리오의 trace 출력 예시가 fenced code block으로 작성되었지만 언어 식별자가 누락되었습니다. text 또는 log 식별자를 추가하면 렌더링이 개선되고 markdownlint 경고를 해소할 수 있습니다.

해당 위치:

  • Line 199-202 (AC-RV2-006)
  • Line 231-234 (AC-RV2-007)
  • Line 266-269 (AC-RV2-008)
  • Line 324-328 (AC-RV2-010)
제안된 수정 (예시)
-  ```
+  ```text
   v2:fallback_chain_step_1_rate_limit (anthropic, claude-sonnet-4.6, 120ms)
   v2:fallback_chain_step_2_success (openai, gpt-4o, 230ms)
</details>


Also applies to: 231-234, 266-269, 324-328

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/acceptance.md around lines 199 -
202, Add a language identifier (e.g., "text" or "log") to the fenced code blocks
that show trace output so markdown renders correctly and linter warnings are
resolved; locate the example blocks referenced by AC IDs AC-RV2-006, AC-RV2-007,
AC-RV2-008, and AC-RV2-010 (the blocks containing lines like
"v2:fallback_chain_step_1_rate_limit (anthropic, claude-sonnet-4.6, 120ms) ...")
and change the opening fences from totext (or ```log).


</details>

</blockquote></details>
<details>
<summary>.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/plan.md (1)</summary><blockquote>

`283-294`: _💤 Low value_

**Fenced code block에 language identifier 추가 권장**

plan_complete signal 블록이 언어 식별자 없이 정의되어 있습니다. `yaml` 또는 `text`를 명시하면 렌더링 및 린터 경고를 해소할 수 있습니다.




<details>
<summary>제안된 수정</summary>

```diff
-```
+```yaml
 <moai>plan_complete</moai>
 SPEC: SPEC-GOOSE-LLM-ROUTING-V2-001
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/plan.md around lines 283 - 294,
The fenced code block containing the plan_complete signal is
missing a language identifier; update the opening fence for that block from toyaml (or ```text) so the block is explicitly typed (e.g., change the
triple-backtick that begins the block with a language identifier), ensuring
linters and renderers treat it correctly and preserve the existing block
contents.


</details>

</blockquote></details>
<details>
<summary>.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/spec-compact.md (1)</summary><blockquote>

`63-80`: _💤 Low value_

**Table 블록에 language identifier 추가 권장**

Capability matrix와 pricing table이 fenced code block으로 작성되었지만 언어 식별자가 누락되었습니다. 테이블 형태이므로 `text` 식별자를 추가하면 렌더링이 개선되고 markdownlint 경고를 해소할 수 있습니다.

해당 위치:
- Line 63-80 (Capability matrix)
- Line 86-105 (Pricing table)




<details>
<summary>제안된 수정 (예시)</summary>

```diff
-```
+```text
               prompt_cache  func_call  vision  realtime
 anthropic     ✅            ✅         ✅      ❌
```
</details>


Also applies to: 86-105

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/spec-compact.md around lines 63 -
80, The fenced code blocks containing the capability matrix and the pricing
table currently lack a language identifier; update the opening backticks for
those table blocks (the triple-backtick blocks that wrap the "prompt_cache
func_call vision realtime" matrix and the subsequent pricing table) to include
the text identifier (i.e. change totext) so markdown rendering and
markdownlint warnings are fixed.


</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>🤖 Prompt for all review comments with AI agents</summary>

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.moai/reports/plan-audit/SPEC-GOOSE-MSG-TELEGRAM-001-review-2.md:

  • Line 146: 문서의 감사 리포트 작성일이 미래 날짜로 잘못 기록되어 있습니다: 찾아서 "Report written:
    2026-05-06" 항목을 현재 기준 실제 작성일인 "Report written: 2026-05-05"로 수정하세요 (파일 내 해당 텍스트을
    검색해 교체; 참조 텍스트: "Report written: 2026-05-06").

In @.moai/reports/plan-audit/SPEC-GOOSE-SCHEDULER-001-review-1.md:

  • Line 25: Update the report's metadata field "status" (currently set as
    status: draft) to the current SPEC state audit-ready so the MP-3 evidence
    line matches the actual SPEC status; locate the status entry in the document
    header/metadata (the status: draft line referenced in the review) and replace
    the value with audit-ready.

In @.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/spec-compact.md:

  • Line 5: The SPEC metadata in spec-compact.md for SPEC-GOOSE-LLM-ROUTING-V2-001
    has status=draft which conflicts with spec.md (status=audit-ready) and PR
    objectives; update the Meta line for id=SPEC-GOOSE-LLM-ROUTING-V2-001 in
    spec-compact.md to status=audit-ready so both files and PR objectives match,
    leaving the rest of the Meta fields unchanged and ensure no other compact SPECs
    have mismatched statuses.

In @.moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/spec.md:

  • Line 247: The table's code span containing setup|start|status|approve|revoke
    is breaking Markdown table parsing because the pipe characters are unescaped;
    update the cell that currently shows cmd/goose/cmd/telegram.go and the inline
    code span to either escape each pipe as \| (i.e.,
    setup\|start\|status\|approve\|revoke) or replace the inline backtick code
    span with an HTML code element like
    setup|start|status|approve|revoke so the table columns render
    correctly; search for the exact text "setup|start|status|approve|revoke" in the
    spec to locate and fix the issue.
  • Line 278: The table row for "R2" contains the Telegram reserved-char code span
    that currently includes an unescaped pipe character; escape the pipe by changing
    '|' to '|' inside that code span (the reserved-char list that includes _ * [ ] ( ) ~ \ > # + - = | { } . !`) so the Markdown table column parsing is preserved
    and MD056 is avoided—update the code span in the spec.md table row for R2
    accordingly.

In @.moai/specs/SPEC-GOOSE-SCHEDULER-001/acceptance.md:

  • Around line 268-270: Update AC-SCHED-018(a) to remove the ambiguous "or panic"
    wording and state a single deterministic outcome: when the FastForward symbol
    (and ErrFastForwardNotAvailable) are gated by //go:build test_only, a
    production build must fail at compile/link time (no runtime panic possible).
    Ensure the text explicitly says the symbol is not linked in production builds
    and that absence causes a compile/link error, and keep the existing check
    sentence about verifying file-level gating with //go:build test_only.

In @.moai/specs/SPEC-GOOSE-SCHEDULER-001/plan.md:

  • Around line 34-40: 파일의 두 개의 펜스드 코드블록(하나는 ASCII 아트 다이어그램 "P1 (cron +
    persistence) ... P4 (catchup ...)"을 포함하는 블록, 다른 하나는 "key = fmt.Sprintf..." 예시를
    포함하는 블록)에 언어 식별자를 추가하여 markdownlint MD040 경고를 제거하세요; 구체적으로 각각의 시작 text 로
    변경해 펜스 코드블록에 language="text"를 지정하면 됩니다.

In @.moai/specs/SPEC-GOOSE-SCHEDULER-001/spec-compact.md:

  • Line 81: 문구 "다음 단계: plan-auditor 라운드 1 → PASS 시 status draft → audit-ready"가
    현재 문서의 메타데이터(audit-ready)와 모순됩니다; 해당 "다음 단계" 문구를 현재 상태 기준으로 갱신하세요 — 즉 파일 내 "다음
    단계" 라인(현재 draft → audit-ready 표기)을 찾아 draft → audit-ready를 현재 메타데이터에 맞는
    전환(예: audit-ready → <다음_상태> 또는 리포지토리에 정의된 실제 다음 상태명)으로 교체하고, 필요하면 "현재 상태:
    audit-ready" 같은 짧은 문구를 추가해 혼동을 없애세요.
  • Around line 45-47: The compact summary table's AC mappings for the
    "Event-Driven (5)" and "State-Driven (3)" rows are inconsistent with the
    canonical Coverage Map: update the "Event-Driven (5)" row to list AC-002,
    AC-003, AC-004, AC-009, AC-011 and update the "State-Driven (3)" row to list
    AC-006, AC-012 so the compact table matches the canonical mapping (ensure AC-003
    and AC-006 are moved to the correct rows).

Nitpick comments:
In @.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/acceptance.md:

  • Around line 199-202: Add a language identifier (e.g., "text" or "log") to the
    fenced code blocks that show trace output so markdown renders correctly and
    linter warnings are resolved; locate the example blocks referenced by AC IDs
    AC-RV2-006, AC-RV2-007, AC-RV2-008, and AC-RV2-010 (the blocks containing lines
    like "v2:fallback_chain_step_1_rate_limit (anthropic, claude-sonnet-4.6, 120ms)
    ...") and change the opening fences from totext (or ```log).

In @.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/plan.md:

  • Around line 283-294: The fenced code block containing the
    plan_complete signal is missing a language identifier; update the
    opening fence for that block from toyaml (or ```text) so the block is
    explicitly typed (e.g., change the triple-backtick that begins the block with a
    language identifier), ensuring linters and renderers treat it correctly and
    preserve the existing block contents.

In @.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/spec-compact.md:

  • Around line 63-80: The fenced code blocks containing the capability matrix and
    the pricing table currently lack a language identifier; update the opening
    backticks for those table blocks (the triple-backtick blocks that wrap the
    "prompt_cache func_call vision realtime" matrix and the subsequent pricing
    table) to include the text identifier (i.e. change totext) so markdown
    rendering and markdownlint warnings are fixed.

In @.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/spec.md:

  • Around line 347-355: The fenced decision-tree code block that starts with "1.
    v1.Route(req) → primary/cheap 결정" is missing a language identifier; update the
    opening triple-backtick to include the text language identifier (```text) so the
    block renders correctly (affects the decision tree lines referencing
    v1.Route(req) and policy.Mode conditions).
  • Around line 319-330: The fenced code block that lists the package structure
    (the block beginning with "internal/llm/router/v2/") is missing a language
    identifier; update the opening fence from totext so the directory tree
    is treated as plain text (i.e., change the code fence that starts the block
    containing "internal/llm/router/v2/" to use ```text).
  • Around line 169-177: The fenced dependency graph containing the ASCII art
    lines beginning with "SPEC-GOOSE-LLM-001 (Provider 인터페이스, ProviderCapabilities)"
    should have a language identifier added to the opening fence; change the opening
    "" to "text" for that code block (keeping the closing "```") so the
    diagram (including SPEC-GOOSE-ROUTER-001, SPEC-GOOSE-RATELIMIT-001,
    SPEC-GOOSE-ERROR-CLASS-001, SPEC-GOOSE-ADAPTER-001/002) renders correctly.

In @.moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/plan.md:

  • Around line 86-102: Two fenced code blocks (the ASCII diagram block near
    "cmd/goose/cmd/telegram.go (cobra: setup/start/...)" and the pseudocode block
    beginning "Start(ctx, deps):") are missing a language tag and trigger
    markdownlint MD040; update their opening fences from totext so the
    blocks are explicitly marked as plain text (apply the same change for the second
    block around the Start(ctx, deps) pseudocode).

In @.moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/spec-compact.md:

  • Around line 29-46: The fenced code block containing the directory listing (the
    block starting with "internal/messaging/telegram/") lacks a language tag and
    triggers markdownlint MD040; update that block by adding a language identifier
    such as text (i.e., change the opening fence from totext) so the snippet
    is consistently rendered/highlighted in the spec file
    (SPEC-GOOSE-MSG-TELEGRAM-001/spec-compact.md).

In @.moai/specs/SPEC-GOOSE-TOOLS-WEB-001/research.md:

  • Around line 244-247: Clarify the apparent contradiction in section "9.6 SSRF
    방지": update the text around "본 SPEC 은 이런 IP 를 hard block 하지 않음" and the
    following sentence about "default blocklist 에 포함하여 explicit allow 필요" to
    state clearly that http_fetch will not be universally hard-blocked but that
    these IPs are placed in a default blocklist (so calls are blocked by default)
    and require an explicit allow action via the PERMISSION-001 Confirmer (include
    how the Confirmer indicates scope), and mention examples like 127.0.0.1,
    localhost, 169.254.169.254 and private CIDRs to make the intended behavior
    unambiguous.

</details>

<details>
<summary>🪄 Autofix (Beta)</summary>

Fix all unresolved CodeRabbit comments on this PR:

- [ ] <!-- {"checkboxId": "4b0d0e0a-96d7-4f10-b296-3a18ea78f0b9"} --> Push a commit to this branch (recommended)
- [ ] <!-- {"checkboxId": "ff5b1114-7d8c-49e6-8ac1-43f82af23a33"} --> Create a new PR with the fixes

</details>

---

<details>
<summary>ℹ️ Review info</summary>

<details>
<summary>⚙️ Run configuration</summary>

**Configuration used**: Path: .coderabbit.yaml

**Review profile**: CHILL

**Plan**: Pro

**Run ID**: `712a5679-cd37-4964-9a19-e35d0c1b0872`

</details>

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between ed4570186ee316c820a733128dfbea46444c3538 and e2f4123c2b89dc856a0428e9043e0448f637de1b.

</details>

<details>
<summary>📒 Files selected for processing (24)</summary>

* `.moai/reports/plan-audit/SPEC-GOOSE-MSG-TELEGRAM-001-review-1.md`
* `.moai/reports/plan-audit/SPEC-GOOSE-MSG-TELEGRAM-001-review-2.md`
* `.moai/reports/plan-audit/SPEC-GOOSE-SCHEDULER-001-review-1.md`
* `.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/acceptance.md`
* `.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/plan.md`
* `.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/research.md`
* `.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/spec-compact.md`
* `.moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/spec.md`
* `.moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/acceptance.md`
* `.moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/plan.md`
* `.moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/research.md`
* `.moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/spec-compact.md`
* `.moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/spec.md`
* `.moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/status.txt`
* `.moai/specs/SPEC-GOOSE-SCHEDULER-001/acceptance.md`
* `.moai/specs/SPEC-GOOSE-SCHEDULER-001/plan.md`
* `.moai/specs/SPEC-GOOSE-SCHEDULER-001/spec-compact.md`
* `.moai/specs/SPEC-GOOSE-SCHEDULER-001/spec.md`
* `.moai/specs/SPEC-GOOSE-SCHEDULER-001/status.txt`
* `.moai/specs/SPEC-GOOSE-TOOLS-WEB-001/acceptance.md`
* `.moai/specs/SPEC-GOOSE-TOOLS-WEB-001/plan.md`
* `.moai/specs/SPEC-GOOSE-TOOLS-WEB-001/research.md`
* `.moai/specs/SPEC-GOOSE-TOOLS-WEB-001/spec-compact.md`
* `.moai/specs/SPEC-GOOSE-TOOLS-WEB-001/spec.md`

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

Comment thread .moai/reports/plan-audit/SPEC-GOOSE-MSG-TELEGRAM-001-review-2.md Outdated
Comment thread .moai/reports/plan-audit/SPEC-GOOSE-SCHEDULER-001-review-1.md Outdated
Comment thread .moai/specs/SPEC-GOOSE-LLM-ROUTING-V2-001/spec-compact.md Outdated
Comment thread .moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/spec.md
Comment thread .moai/specs/SPEC-GOOSE-MSG-TELEGRAM-001/spec.md
Comment thread .moai/specs/SPEC-GOOSE-SCHEDULER-001/acceptance.md
Comment thread .moai/specs/SPEC-GOOSE-SCHEDULER-001/plan.md
Comment thread .moai/specs/SPEC-GOOSE-SCHEDULER-001/spec-compact.md
Comment thread .moai/specs/SPEC-GOOSE-SCHEDULER-001/spec-compact.md
GoosLab added 2 commits May 6, 2026 00:16
- §목적 첫 줄의 GOOSE-AGENT (백틱 외부) 를 AI.GOOSE 로 치환
- scripts/check-brand.sh 로컬 통과 확인 (0 violations)
- PR #118 Brand Notation Check FAILURE 해소용

SPEC: SPEC-GOOSE-TOOLS-WEB-001

🗿 MoAI <email@mo.ai.kr>
CodeRabbit review 지적 중 자명한 drift 3건을 spec.md (정본) 기준으로 정정:

- SPEC-GOOSE-LLM-ROUTING-V2-001/spec-compact.md:5
  Meta status=draft → audit-ready (spec.md L4 정본과 동기화, Critical drift 해소)
- .moai/reports/plan-audit/SPEC-GOOSE-MSG-TELEGRAM-001-review-2.md:146
  Report written 2026-05-06 → 2026-05-05 (실제 작성일 보정)
- .moai/reports/plan-audit/SPEC-GOOSE-SCHEDULER-001-review-1.md:25
  MP-3 인용값 status: draft → audit-ready (spec.md L4 정본과 동기화)

Cosmetic markdownlint 경고(MD040/MD056), AC mapping 정정, AC-018 단일경로화는
별도 hygiene PR 또는 후속 sync 에서 처리.

SPEC: SPEC-GOOSE-LLM-ROUTING-V2-001, SPEC-GOOSE-MSG-TELEGRAM-001, SPEC-GOOSE-SCHEDULER-001

🗿 MoAI <email@mo.ai.kr>
@GoosLab GoosLab merged commit 7784a18 into main May 5, 2026
4 checks passed
@GoosLab GoosLab deleted the feature/sprint-1-plan branch May 5, 2026 15:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/cli goosed / goose CLI area/llm-provider LLM provider 어댑터 영역 priority/p1-high 다음 릴리스 포함 type/docs 문서 작업

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant