Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
진행 중: [질문별 자료 선택 영속 계획](docs/changes/question-source-plans.md). 질문만으로 저장 색인에서 최대5자료를 선택하고 같은 요청은 원래 선택과 현재 원문을 재검증합니다. 실제 AI/예산 예약/개발 활성화는 없으며 다자료 실행·브리핑 변환/표시는 후속입니다.

현재 구현: [근거 작업 접수·queue 전달](docs/changes/evidence-job-dispatch.md). 신규23/새전체9,595개(Python8,775+JS820)·정적 검사/빌드/OpenAPI·실패/skip/warning0·독립 최종 검토/수정 재검토를 통과했습니다. 저장→명시 버전 queue 전달·동일 ID 재접수와 권한/원문 재검사를 연결했습니다. 실제 제공자 호출0·현재 앱 활성화0이며 질문 전용 검색·브리핑 변환/표시는 후속입니다.

현재 구현: [영속 근거 작업·비동기 worker](docs/changes/durable-evidence-worker.md). 신규57/새전체9,572개(Python8,752+JS820)·정적 검사/빌드/OpenAPI·실패/skip/warning0·독립 최종 검토 C0I0M0를 통과했습니다. SQL 송신 의도·중단 후 무재호출·공유 예약 예산·현재 권한/원문 검증을 연결했습니다. 이번 실제 AI 호출0회이며 서비스 요청·브리핑 변환·개발 배포는 후속입니다.
Expand Down
2 changes: 2 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
진행 중: [질문별 자료 선택 영속 계획](changes/question-source-plans.md). 질문만으로 저장 색인에서 최대5자료를 선택하고 같은 요청은 원래 선택과 현재 원문을 재검증합니다. 실제 AI/예산 예약/개발 활성화는 없으며 다자료 실행·브리핑 변환/표시는 후속입니다.

현재 구현: [근거 작업 접수·queue 전달](changes/evidence-job-dispatch.md). 신규23/새전체9,595개(Python8,775+JS820)·정적 검사/빌드/OpenAPI·실패/skip/warning0·독립 최종 검토/수정 재검토를 통과했습니다. 저장→명시 버전 queue 전달·동일 ID 재접수와 권한/원문 재검사를 연결했습니다. 실제 제공자 호출0·현재 앱 활성화0이며 질문 전용 검색·브리핑 변환/표시는 후속입니다.

현재 구현: [영속 근거 작업·비동기 worker](changes/durable-evidence-worker.md). 신규57/새전체9,572개(Python8,752+JS820)·정적 검사/빌드/OpenAPI·실패/skip/warning0·독립 최종 검토 C0I0M0를 통과했습니다. SQL 송신 의도·중단 후 무재호출·공유 예약 예산·현재 권한/원문 검증을 연결했습니다. 이번 실제 AI 호출0회이며 서비스 요청·브리핑 변환·개발 배포는 후속입니다.
Expand Down
36 changes: 36 additions & 0 deletions docs/changes/question-source-plans.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# 질문만으로 선택한 근거 자료의 영속 계획

2026-10-26 KST. [작업 접수·queue](evidence-job-dispatch.md) 다음 D019 검색 경계다. 사용자는 질문만 제출하며 서버가 현재 workspace의 승인된 저장 색인에서 최대5자료를 선택한다. 같은 request 재접수는 처음 선택한 원문/hash를 그대로 재검증하고 검색을 새로 하지 않는다. 이 변경은 영속 검색 계획을 구현한다. AI 실행 예약·다자료 실행 orchestration·브리핑 변환/표시·개발 활성화는 후속이다.

## Global Constraints

- 신규5파일과 아래 명시한 기존 migration 검사1개만 변경: `packages/domain/src/issuedigest_domain/question_source_plan.py`, `packages/domain/tests/test_question_source_plan.py`, `packages/storage/src/issuedigest_storage/question_plans.py`, `packages/storage/migrations/versions/0011_question_source_plans.py`, `packages/storage/tests/test_question_plans.py`. 기존484 실행 파일·이전52증거·AI 모델/SDK/workflow/queue·API/UI·exports/dependencies/config는 그대로 둔다. 기존 `packages/storage/tests/test_evidence_jobs.py`의 migration 검사만 동일 연결/트랜잭션의 실제0010 revision upgrade/downgrade 작업을 검사하도록 수정한다. 향후 head 전체를 되돌리거나 version stamp로 우회하지 않는다. 나머지 기존484파일은 보존한다. 문서 변경 허용. 실제 제공자 호출·운영 서버/DB·main 병합/앱 활성화0.
- Domain frozen strict extra-forbid models: `QuestionSourceChoice(snapshot_id: UUID4, source_sha256: lower64hex)`; `QuestionSourcePlan(profile='question-source-plan-v1', retrieval_profile='question-topics-ko-v2', plan_id:UUID4, workspace_id:UUID4, request_id:UUID4, question:strict str nonblank<=1500 preserved, status:Literal['selected','no_match'], reason:Literal['no_terms','no_candidates']|None, sources:tuple[QuestionSourceChoice,...] max5)`. selected requires1..5 unique snapshot IDs/reasonNone; no_match requires0 and explicit reason. No source text/receipt/model facts/actor/private credentials in domain DTO. Exact UUID4/type checks; strict JSON roundtrip accepted, bool/coercion/unknown model_copy fields rejected by storage read reconstruction. No optional parent context in this version; no UI parent mixing or browser source ID input.
- `QuestionPlanRepository(engine)` with `submit(token, workspace_id, request_id, question)->QuestionSourcePlan|None`, `get(token, workspace_id, plan_id)->QuestionSourcePlan|None`. Inputs exact UUID4/nonblank string<=1500 before SQL, no normalization/truncation/rewording. Same current session/member rules as ResearchRepository: submit owner/editor, get current read member; original submitter must still be current writer before any saved result is returned. No cross-workspace lookup/result. Narrow reuse existing ResearchRepository._actor/_member/_presentation/_transaction, EvidenceRepository._load, evidence_jobs.source_digest/_lock_jobs. Acquire same evidence-job advisory transaction gate BEFORE any auth/user/plan locks, consistently on every new operation. SQL only, never provider I/O; this may serialize bounded searches with new-job SQL operations and must be documented as throughput cost. No new independent lock order or auth classification.
- Use new separate MetaData/table `question_source_plans`: UUID plan/workspace/actor/request columns; exact question, input hash, domain payload JSONB + canonical payload hash (including original actor identity so row/payload tampering rejects). Unique workspace+actor+request. Additional minimal fixed columns/constraints implementation choice. Domain payload must match top-level plan/workspace/request/question exactly. Hash uses sorted compact UTF8 JSON allow_nan=False; hash is corruption detection, not signature. Import must not change legacy global metadata registry or perform DB/network/model work.
- New submission: authorize; atomically check prior actor/request; if prior exact question/profile input matches, validate saved payload and ALL chosen current original sources/presentations against stored source hashes then return it WITHOUT retrieval call or duplicate row. Changed same request question or invalid/tampered source/hash/metadata must reject, never reselect/replace. Concurrent identical requests produce one plan. Different actors/workspaces remain separate under existing shared initial validation scope, not personal/public reclassification. A new request can choose newer corpus; same request no_match remains no_match after index additions.
- With no prior, call unchanged `research_retrieval.question_terms(question)` and `retrieve_snapshot_ids(conn, workspace_id, terms)` on current indexed evidence. No planner/model/embedder/web/legacy ResearchRun creation. Empty terms stores no_match/no_terms with retrieval0. Empty IDs stores no_match/no_candidates. Otherwise preserve exact returned order,1..5 unique UUID4 IDs; malformed helper result fails closed. Load/verify every canonical source/presentation in same transaction, hash exactly source_digest tuple(snapshot,bundle,presentation). Existing helper already respects current workspace/latest policy intake/bounded topic search; do not modify or claim semantic relevance/coverage/absence from no_match. On saved read, revalidate only saved originals, not latest search results. Never query another workspace, create budget reservation/research run/evidence job/queue step, or consume paid model. Known no_match isn't a claim no real-world evidence exists.
- Reconstruct stored DTO with strict raw shape/field values, check input/payload/row identities and source hashes on every get and idempotent submit. Unknown fields, missing fields, wrong actual types/bool, duplicate/oversized choices, swapped actor/workspace/request/plan/question/status/reason/profile/hash, canonical bundle tampering, source deletion or title metadata mutation reject with sanitized StorageCorruption/ResearchConflict/ResearchForbidden/AuthenticationDenied as appropriate. No raw question/source/exception/credential logging. No receipt/data exposure in fixed errors. No shallow model_copy trust. No query/repair/downgrade of corrupted plans.
- Migration revision `0011_question_source_plans`, down_revision `0010_evidence_jobs`; upgrade creates only new table/constraints/index, downgrade drops only it. No old schema/data changes/import writes. New tests clean new table before/after (root fixture doesn't know it), never edit conftest or past fixtures. Test migration preservation includes existing evidence_jobs and research budget rows/old metadata snapshot.
- TDD using dedicated local PostgreSQL synthetic sources/index/identities; no provider/server/private fixtures. RED missing modules, GREEN meaningful domain/raw guards + real existing lexical index integration, deterministic duplicate request concurrency, current role/session/workspace/source/presentation rejection, persisted no_match and plan reuse without search/budget/run/job mutations, tamper/rehashed corruption, old/evidence job migration and lock order preservation. Agent owns scoped tests/Ruff/format/mypy; controller full QA/reviews/historical audits/publication. No agent subagents.

저장 계획의 get/재접수에서도 기존 `_presentation`의 지연 복구를 허용한다. presentation 행만 없고 canonical 원문이 존재하면 기존 경로로 presentation을 재구성하며, 재구성한 원문/presentation의 hash가 저장값과 일치할 때만 원래 계획을 반환한다. 원문이 없거나 변경됐거나 재구성한 presentation hash가 다르면 계속 거부한다. presentation만 삭제한 경우의 별도 집중 검사는 비차단 후속으로 남기며 이번 검증 통과 항목으로 세지 않는다.

## Task 1: 질문별 검색 선택 영속화

- [x] 신규5파일을 TDD로 구현한다. 위 global constraints를 읽고 그대로 따른다. 정확 질문과 ordered current sources·source_digest를 고정하고 재접수 때 검색하지 않는다. 역할·동시성·상태/타입/행/원문 변조·no_match·기존 budget/run/job 무변경·migration/import 격리 검사를 포함한다. 기존 migration 검사1개 예외 외484파일을 보존한다. scoped 정적 검사와 집중 테스트 후 owned5파일+이 추적 명세의 Task1 체크박스만 커밋하고 ignored SDD 보고서에 정확 RED/GREEN/명령/인터페이스/한계/자체검토를 남긴다.

## Controller gates

- [x] 독립 태스크/전체 검토·전체9,657개 검사·기존484실행+기존 migration 검사1개 검토/이전52증거 보존·privacy·문서/Draft PR112/Sitesv134·자체QA 정리. 비차단 단독 표시 정보 삭제 검사는 후속.
- [ ] 이 계획의 다자료 AI 실행 연결·브리핑 변환/표시·운영 정책/부하·개발 적용. 이번 활성화 없음.

## 판단과 영향

1. 새 질문은 기존 문자 기반 저장 색인에서 최대5자료를 선택한다. 추가 AI 비용 없이 D019 질문 검색을 연결하지만 의미 검색/관련성·현실의 근거 유무를 보장하지 않는다.
2. 같은 request의 자료 선택과 no_match를 고정한다. 재접수 일관성을 얻지만 새 자료 반영은 새로운 request가 필요하다.
3. 기존 새 작업의 SQL gate를 공유한다. 사용자/자료 잠금 순서 역전을 막지만 검색 중 다른 새 작업 SQL도 기다릴 수 있어 부하 인수가 필요하다.

4. 새 migration으로 드러난 기존0010 검사 가정을 수정한다. 같은 연결에서0010의 실제 작업만 검사하여 최신 head를 훼손하지 않는다. 기존 검사1개를 바꾸는 비용이 있으며 나머지484파일과 실행 코드는 보존하고 전체 migration 경로는 별도 검사한다.

5. 기존 표시 정보 복원을 유지한다. 원문과 복원 hash가 같으면 표시 정보 삭제만으로는 실패하지 않는다. 이 동작을 문서화했고 표시 정보 단독 삭제 회귀 검사는 비차단 후속으로 남는다.
4 changes: 4 additions & 0 deletions docs/planning/implementation-plan.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## M3 진행 · 질문별 자료 선택 영속화

[질문 전용 검색 계획](../changes/question-source-plans.md)으로 원래 질문·선택 순서·현재 source hash를 저장한다. 같은 request는 재검색하지 않고 원래 자료를 다시 검증한다. no_match를 현실의 근거 부재·의미 판정으로 표시하지 않는다. 기존485실행/이전52증거·앱/기본worker/main을 유지하며 실제 제공자/예산 예약 변경0이다. 다자료 AI 실행·브리핑 변환/표시·부하 인수·개발 적용이 후속이다.

## M3 검증 완료 · 근거 작업 접수·queue 전달

[접수·dispatch 계약](../changes/evidence-job-dispatch.md)·[검증 범위](../research/evidence-job-dispatch-validation.md). 신규23/새전체9,595개(Python8,775+JS820)·정적 검사/빌드/OpenAPI·실패/skip/warning0·독립 최종 수정 재검토 C0I0M0다. 실제 DBOSClient/queue·모의 SSE에서 동일 ID/예약1/HTTP1을 조건별로 확인했다. 실행 순서에 기대던 테스트는 결정적 gate로 보완했다. 기존481실행/이전46증거와 앱/기본worker/main은 유지한다. 질문 전용 검색·다자료/브리핑 변환/표시·운영 정책/부하·개발 적용은 다음이다.
Expand Down
6 changes: 6 additions & 0 deletions docs/planning/progress.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## 검증 완료 · 질문별 자료 선택 영속화 · 2026-10-26

[계약](../changes/question-source-plans.md)·[검증](../research/question-source-plans-validation.md). 질문만으로 기존 저장 색인에서 최대5자료를 선택하고 원문/제목 hash를 고정한다. 같은 요청은 재검색하지 않고 현재 권한·원문을 재검증하며 no_match도 유지한다. 실행9ecdce0/기존 검사 보완14e1585·신규62/전체9,657개(Python8,837+JS820)·정적 검사/빌드/OpenAPI·실패/skip/warning0이다. 태스크 C0I0M1/전체 C0I0M2 후 문서 보완 재검토 C0I0M0이며 비차단 후속1개(표시 정보 단독 삭제 집중 검사)를 남겼다. 기존484실행은 그대로이고 승인한 migration 검사1개만 수정했으며 이전52증거를 보존했다. 실제 제공자/운영 변경0·앱/기본worker/main 유지다. 다자료 AI 실행·브리핑 표시·개발 적용은 후속이며 PR/Sites·자체QA 정리는 최종 인계를 따른다.

최종 인계: [Draft PR112](https://github.com/DigestWorks/IssueDigest/pull/112)·[Sitesv134](https://lawdigest-rebuild-plan.ijaesinii.chatgpt.site/) public/native succeeded. 이전v133과 변경7문서의 정확 사본(7cf3552)을 보존했다. Site source `3704954703d97a9f2872d7a4022431ee9dc5ebcd`, saved `appgprj_6ac612dd42708191a7a0c8377be64d48~appgver_a85308e949cc8191b6ca110a73193d04`, deployment `appgdep_6aded7187e8481919a25f09f7239ef3d`다. HTML119/로컬대상3,536/공개텍스트365·비공개60+12항목 제외를 확인했다. 자체QA1/전용volume1 정리와 포트 닫힘을 확인했다. 사용자 탭 이동·신규 브라우저 검사0(기존 레이아웃의 텍스트 변경)이며 앱/기본worker/main 활성화0이다. 비차단 표시 정보 단독 삭제 검사1개는 후속이며 다섯 판단과 비용은 명세/검증 기록에 남겼다. 원격CI는 로컬 전체 검사와 구분한다. PR 채팅 첨부는 도구의100개 한도로 실패했으며 링크는 유효하다. 이후 인계는 저장소 원본을 따른다.

## 검증 완료 · 근거 작업 접수·DBOS queue 전달 · 2026-10-26

[새 계약](../changes/evidence-job-dispatch.md)·[검증 기록](../research/evidence-job-dispatch-validation.md). 실행afac2d7/테스트보완b6cbd98·신규23/새전체9,595개(Python8,775+JS820)·정적 검사/빌드/OpenAPI·실패/skip/warning0·최종 수정 재검토 C0I0M0·미해결0다. 태스크/전체 검토의 minor1(중복 접수 테스트의 실행 순서 의존)은 실제 완료 선행 RED2건으로 재현하고 결정적 대기/해제로 보완했다. 최초 전체 중단 실행은 통과로 세지 않고 보존했다. 기존481실행/이전46증거·앱/기본worker/main을 유지하며 실제 제공자/운영 서버 변경0이다. 질문 전용 검색·브리핑 변환/표시는 후속이며 PR/Sites/자체QA 정리는 최종 인계를 따른다.
Expand Down
11 changes: 11 additions & 0 deletions docs/planning/tasks.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
## 구현·집중 검사 완료 · 질문별 자료 선택 영속화 · 2026-10-26

- [x] [질문 전용 검색·선택/hash 고정·재접수 계약](../changes/question-source-plans.md) 고정.
- [x] strict 계획 DTO·repository/migration·기존 lexical 검색 연결 TDD.
- [x] 역할/자료/동시성·변조·재검색0·no_match·예산/run/job 무변경 집중62개+승인된 기존 migration 검사1개(합계63개)·scoped 정적 검사.
- [x] 기존 파일484개 변경 없이 보존·승인된 기존 migration 검사1개만 수정·이전 증거52개 보존.
- [x] 독립 최종 검토 C0I0M2 비차단·lazy presentation 복구 계약 문서화.
- [ ] 전체QA·PR/Sites·자체QA 정리.
- [ ] presentation만 삭제한 saved get/retry 집중 검사(비차단 후속).
- [ ] 다자료 AI 실행·브리핑 변환/표시·운영 부하·개발 반영.

## 검증 완료 · 근거 작업 접수·queue 전달 · 2026-10-26

- [x] [접수/queue 경계·명시 버전·ack 유실 계약](../changes/evidence-job-dispatch.md) 고정.
Expand Down
Loading
Loading