Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
b645b9f
feat(alden): trace scoped source storage, FTS, dense and graph proof …
twoimo Oct 10, 2026
e1193f0
feat(alden): attach provenance trace to node details and scoped action
twoimo Oct 10, 2026
7601ca3
feat(alden): scope proof trace through read-only MCP contract
twoimo Oct 10, 2026
48361eb
feat(alden): permit read-only pipeline trace through desktop action b…
twoimo Oct 10, 2026
7c1bb51
feat(alden): permit read-only pipeline trace through desktop action b…
twoimo Oct 10, 2026
d16ab15
feat(alden): surface scoped source-index proof in selected 3D node ev…
twoimo Oct 10, 2026
9895f06
test(alden): verify scoped source-to-FTS-dense-history-graph-MCP life…
twoimo Oct 10, 2026
37c95a1
test(alden): render only version-bound pipeline proof in 3D node detail
twoimo Oct 10, 2026
7e9f27f
feat(alden): route scoped read-only pipeline trace in shipped menu ru…
twoimo Oct 10, 2026
b74b659
fix(alden): align trace action schema and desktop runtime registration
twoimo Oct 10, 2026
880be4a
style(alden): align read-only bridge trace action arm
twoimo Oct 10, 2026
861bd0d
fix(alden): restore A-B-A snapshots with source-order-bound run identity
twoimo Oct 10, 2026
5eb4ce1
test(alden): reproduce reappearing exact snapshot and preserve idempo…
twoimo Oct 10, 2026
f852c01
test(alden): use deterministic embedding profile without loopback net…
twoimo Oct 10, 2026
c83398e
docs(alden): trace entire scoped provenance lifecycle and CI failure-…
twoimo Oct 10, 2026
82db405
docs(alden): connect pipeline audit to README, 3D design and continui…
twoimo Oct 10, 2026
b2aef82
docs(alden): connect pipeline audit to README, 3D design and continui…
twoimo Oct 10, 2026
8831f44
docs(alden): connect pipeline audit to README, 3D design and continui…
twoimo Oct 10, 2026
b91426f
test(alden): fence and route read-only pipeline trace at Tauri bridge
twoimo Oct 10, 2026
4faea1c
test(alden): verify actual MCP stdio list/call scope and no-write proof
twoimo Oct 10, 2026
56e5ec2
docs(alden): record owned MCP stdio and Tauri Rust CI receipts
twoimo Oct 10, 2026
2114b8a
feat(alden): choose source versions per declared GraphRAG target scope
twoimo Oct 10, 2026
99ed4de
feat(alden): preserve exact target membership across lexical/dense Gr…
twoimo Oct 10, 2026
1777fe9
feat(alden): expose optional target-bound GraphRAG search in own MCP
twoimo Oct 10, 2026
a8c09c5
test(alden): isolate target versions and relation evidence through BM…
twoimo Oct 10, 2026
e3e81e0
test(alden): isolate lexical candidate when checking target-specific …
twoimo Oct 10, 2026
cf8db25
fix(alden): stop temporal publisher loop from shadowing requested tar…
twoimo Oct 10, 2026
7610fd2
docs(alden): record target-scope GraphRAG regression and latest 114 t…
twoimo Oct 10, 2026
8f5fca1
docs(alden): describe target-scoped GraphRAG and current macOS receipt
twoimo Oct 10, 2026
69cc1c4
docs(alden): describe target-scoped GraphRAG and current macOS receipt
twoimo Oct 10, 2026
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
29 changes: 29 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,34 @@
# Alden

## 2026-10-11 개발 브랜치 — 문서 한 건의 통합 증거 대사

[구현·스코프·복구·CI 상세](docs/architecture/alden-pipeline-readback-20261011.md).
`codex/alden-pipeline-readback-20261011`은 PR #28 다음의 별도 검토 브랜치입니다.
읽기 전용 `alden_knowledge_trace`와 앱 `collection-trace` 경로는 원본
문서 ID, 허용 프로젝트 및 선택적 대상/버전을 받아 확정된 수집 단계·해시·
FTS5·파생 Dense 벡터·그래프 관계를 개별 검증합니다. 3D 노드 상세에서도
현재 노드/버전/대상이 일치할 때만 그 결과가 표시됩니다. 조회로 수집
이벤트나 가상의 3D 활동을 생성하지 않습니다. 외부 osk-system MCP 연결은
여전히 별개입니다.

같은 프로젝트의 서로 다른 등록 대상에 원본 ID가 중복될 경우 GraphRAG는
선택한 `target_id`의 현재 버전·검색 후보·관계 근거를 일관되게 사용합니다.
허용 프로젝트 전체 검색은 기본값으로 유지됩니다. 대상별 검색·MCP 범위 격리는
[2026-10-11 테스트](docs/architecture/alden-pipeline-readback-20261011.md)에 기록했습니다.

원본이 A→삭제→A로 복귀해도 기존 run_id가 충돌하여 복구를 건너뛰지 않도록
스냅샷 원본 순서를 실행 정체성에 포함했습니다. 동일 순서 재요청은 멱등성을
유지하고 과거 버전·관계 근거를 보존합니다. GitHub macOS CI
[38067729712](https://github.com/twoimo/alden/actions/runs/38067729712)에서
Python 112개·UI 30개·TS/Vite 빌드가 통과했습니다. 원 사용자 Mac 설치,
실물 MLX/음성·osk-system, 서명/공증과 프로덕션은 미검증입니다.

사용 가능한 저장소와 명시적 프로젝트 권한이 있을 때 자체 MCP
`alden_knowledge_trace`의 입력은
`{"projects":["career"],"document_id":"graph:<실제 64자리 해시>"}`입니다.
`expected_version`과 `target_id`를 추가해 화면에 표시된 정확한 원본만
확인할 수 있습니다. 외부 도구/워크스페이스 ID는 임의로 대체하지 않습니다.

## Alden 0.3.55 — 실제 관계와 저장 벡터를 참고한 배치

큰 그래프의 출처별 고정 배치를 실제 관계와 별도의 의미 유사도 후보를 사용하는 배치로 연결했습니다. 현재 대상·버전·권한·원문·텍스트·E5 프로필이 일치하는 저장 벡터만 읽으며, 새 모델 추론이나 사실 관계 생성은 수행하지 않습니다. 배치는 전용 작업 스레드에서 계산하고, 표시 노드 중 물리 계산 밖의 노드에도 목표 위치를 보간합니다. 선택·카메라와 무관한 기존 위치를 유지하며 오래된 범위의 결과를 버립니다.
Expand Down
19 changes: 19 additions & 0 deletions desktop/DESIGN.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
# Alden desktop design contract

## 2026-10-11 — Evidence in the real 3D note view (source branch)

The selected source detail retains the calm existing note layout and a single
plain-text proof line inside its established original-evidence disclosure.
It checks the selected node ID, current source version and source target against
a new read-only backend receipt before showing stored source hash, committed
journal stage, FTS5 binding or derived local Dense vector binding. Missing or
lagging stages say "미확인/대기". The line never claims a rendered GPU frame,
a loaded MLX model, or a strengthened fact relationship. Collection events and
visual pulses still originate exclusively in persisted successful journal
activity; opening a note or reading trace produces none.

[Scoped pipeline proof and bounded test receipts](../docs/architecture/alden-pipeline-readback-20261011.md)
include the A→removal→A rollback defect and its fixed run identity. This UI
source integration is validated on a macOS CI DOM/Vite harness, not yet the
owner's physical installed Alden window. The nine existing Archify diagrams
remain dated descriptions of their own verified source versions; a new Archify
render of this extension is pending a supported local Archify host.

## 0.3.49 구현 경로 도식

[현재 9개 Archify 도식](../docs/architecture/alden-0.3.49/README.md)은 프로세스·음성/취소·수집·계보·MCP·정규화/검색·이력/활동·복구·평가 경로를 설명합니다. 작성 문구는 한국어이며 고정 Viewer UI는 영어입니다. 9/9 구성 검사, 네 데스크톱 크기의 브라우저 검사와 밝은/어두운 이미지 검토를 제품의 실제 실행 증거와 구분합니다.
Expand Down
40 changes: 40 additions & 0 deletions desktop/src-tauri/src/python_bridge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1198,6 +1198,7 @@ impl PythonBridge {
| "db-sync-history"
| "collection-history"
| "collection-graph"
| "collection-trace"
| "collection-affinity"
| "collection-projects"
| "collection-scheduler-status"
Expand Down Expand Up @@ -2328,6 +2329,7 @@ fn settings_action_args(
| "db-sync-history"
| "collection-history"
| "collection-graph"
| "collection-trace"
| "collection-affinity"
| "collection-projects"
| "reply-history"
Expand Down Expand Up @@ -5467,6 +5469,44 @@ mod tests {
}
}

#[test]
fn collection_trace_dispatches_as_read_only_bounded_action() {
let query = r#"{"projects":["research"],"document_id":"youtube:document-hash","target_id":"declared-target"}"#;
let args = settings_action_args(
"collection-trace",
Some(query),
None,
None,
None,
None,
None,
)
.unwrap();
assert!(args
.windows(2)
.any(|pair| pair == ["--history-query", query]));
assert!(args
.windows(2)
.any(|pair| pair == ["--action", "collection-trace"]));
assert!(!args.iter().any(|arg| {
matches!(arg.as_str(), "--explicit-opt-in" | "--model" | "--catalog-delete")
}));
for invalid in ["[]".to_owned(), "{broken".to_owned(), "x".repeat(4097)] {
assert!(matches!(
settings_action_args(
"collection-trace",
Some(&invalid),
None,
None,
None,
None,
None
),
Err(BridgeError::ActionNotAllowed)
));
}
}

#[test]
fn room_upsert_action_args_and_sanitization() {
let args = settings_action_args(
Expand Down
22 changes: 22 additions & 0 deletions desktop/src/__tests__/node-details.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,28 @@ describe('selected-node explanations',()=>{
const collection=parseKnowledgeGraph({nodes:[{id:'group',label:'대화 맥락',category:'collection',is_hub:true},...graph.nodes],edges:[{source:'group',target:id,relation:'linked',purpose:'navigation'}]});
expect(nodeSummary(collection,collection.nodes[0])).toContain('입구 1개');
});
it('shows stored source-to-index proof only for the exact selected source and target',()=>{
const documentId='youtube:'+'a'.repeat(64),version='version:'+'b'.repeat(64),target='target-one';
const view=parseKnowledgeGraph({nodes:[{id:documentId,label:'저장된 영상',category:'video',
source_version:version,source_target:target}],edges:[]});
const details={node_id:documentId,basis:'source_record',version,target_id:target,platform:'youtube',
raw_sha256:'c'.repeat(64),body:'원본에 접근한 본문'};
const pipeline_trace={ok:true,state:'available',document_id:documentId,version,target_id:target,
stages:{discovered:true,parsed:true,validated:true,stored:true,indexed:true},
source:{state:'hash_verified'},fts:{state:'verified'},
dense:{state:'stored_vector_binding_verified',model_residency_verified:false}};
renderNodeDetails(view,view.nodes[0],{details,pipeline_trace});
expect(document.getElementById('knowledge-node-evidence')!.textContent).toContain('저장·원본 해시 확인');
expect(document.getElementById('knowledge-node-evidence')!.textContent).toContain('로컬 Dense 저장 바인딩 확인');
expect(document.getElementById('knowledge-node-evidence')!.textContent).toContain('실제 모델 로딩 및 화면 렌더링은 별도 확인');
expect(document.querySelector('script,img')).toBeNull();
renderNodeDetails(view,view.nodes[0],{details,pipeline_trace:{...pipeline_trace,target_id:'another'}});
expect(document.getElementById('knowledge-node-evidence')!.textContent).not.toContain('저장·원본 해시 확인');
renderNodeDetails(view,view.nodes[0],{details,pipeline_trace:{...pipeline_trace,
fts:{state:'missing_or_mismatched'},dense:{state:'not_indexed'}}});
expect(document.getElementById('knowledge-node-evidence')!.textContent).toContain('FTS 미확인');
expect(document.getElementById('knowledge-node-evidence')!.textContent).toContain('Dense 미확인/대기');
});
it('keeps a room node scoped to its own account and room even without an explicit detail scope',()=>{
const roomId=`chat:kakao:${account}:room:42`;
const roomGraph=parseKnowledgeGraph({nodes:[{id:roomId,label:'회의',category:'채팅방'}],edges:[]});
Expand Down
15 changes: 15 additions & 0 deletions desktop/src/knowledge/node-details.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,21 @@ export function renderNodeDetails(graph: KnowledgeGraph, node: KnowledgeNode, pa
receipt.append(element('p', '', `수집 기록 · ${text(selected.platform, 32)} · ${date(selected.collected_at)}${selected.truncated === true ? ' · 일부 발췌' : ''}`));
receipt.append(element('p', '', `기록 버전: ${text(selected.version, 256)}`));
receipt.append(element('p', '', `보존 기록 SHA-256: ${text(selected.raw_sha256, 64)}`));
// A trace belongs to this exact selected source version and target only.
// It reports stored proof; it never claims the GPU rendered this node or
// that a local model ran because a derived vector was found.
const trace = record(payload?.pipeline_trace);
const proof = trace?.ok === true && trace.state === 'available' && trace.document_id === node.id
&& trace.version === node.sourceVersion && trace.target_id === node.sourceTarget ? trace : null;
if (proof) {
const stages = record(proof.stages), source = record(proof.source), fts = record(proof.fts), dense = record(proof.dense);
const stored = stages?.stored === true && source?.state === 'hash_verified';
const indexed = stored && stages?.indexed === true && fts?.state === 'verified';
const vector = dense?.state === 'stored_vector_binding_verified';
const status = stored ? '저장·원본 해시 확인' : '저장 상태 재확인 필요';
receipt.append(element('p', '', `처리 경로 · ${status} · FTS ${indexed ? '확인' : '미확인'} · 로컬 Dense ${vector ? '저장 바인딩 확인' : '미확인/대기'}`));
receipt.append(element('p', '', '검증 범위: 저장 기록과 파생 색인 · 실제 모델 로딩 및 화면 렌더링은 별도 확인'));
}
const capture = record(selected.capture);
if (capture?.status === 'manifest_verified') {
receipt.append(element('p', '', `보존 파일: ${text(capture.byte_scope, 160)} · ${text(capture.json_pointer, 256)}`));
Expand Down
2 changes: 1 addition & 1 deletion desktop/src/runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ type SettingsAction =
| "history-rooms" | "history-messages"
| "reply-history" | "geeknews-history"
| "voice-history-sessions" | "voice-history-messages" | "db-sync-history"
| "collection-history" | "collection-graph" | "collection-affinity" | "collection-projects"
| "collection-history" | "collection-graph" | "collection-trace" | "collection-affinity" | "collection-projects"
| "collection-scheduler-status" | "collection-scheduler-control";

export async function operatorPause(): Promise<EmergencyState | null> {
Expand Down
9 changes: 9 additions & 0 deletions docs/ALDEN_CONTINUATION.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
> 2026-10-11 다중 대상 검색 추가: 같은 프로젝트 안의 대상별 버전·후보·관계 근거를 `target_id`로 격리하고, 최신성 반복문의 범위 변수 충돌을 수정했다. [macOS CI 38068930145](https://github.com/twoimo/alden/actions/runs/38068930145): Python 114/114, UI 30/30, TS/Vite 성공. 운영 대상 검색/모델/호스트 실물 E2E는 아직 확인하지 못했다.

> 2026-10-11 추가 통합: [스냅샷 A→삭제→A 복원 및 수집→색인→이력→그래프/MCP 일치 검사](architecture/alden-pipeline-readback-20261011.md).
> 별도 `codex/alden-pipeline-readback-20261011` 브랜치에 소스와 회귀가 구현되었다.
> macOS CI `38067729712`: Python 112/112, UI 30/30, TypeScript/Vite build 성공(격리 fixture).
> 상태: **구현됨 / GitHub macOS 테스트 실제 실행 검증됨**, 소유자 Mac의 설치본·osk-system·물리 음성·운영 자료 E2E 및 서명/공증은 **미착수(이번 변경)**.
> 원본 `outputs/STATUS.md`는 Mac의 유효한 실행 연결이 확보되기 전까지 수정할 수 없었다.
> PR #27·#28, 운영 설정, 원본 DB, 메시지 전송 큐는 변경하지 않았다.

> 2026-10-11 원격 독립 구현 기록: [source integrity, OSK 삭제 이력과 MLX 검증](architecture/alden-remote-integrity-20261011.md). 이 링크는 Mac 설치 상태를 갱신했다는 의미가 아니다. 아래 날짜별 설치 버전과 검증 수치는 각 당시의 기록이며 새 브랜치의 실행 성과로 재사용하지 않는다. 로컬 `outputs/STATUS.md` 원문은 Mac 연결 복구 후 이어 갱신한다.

# 현재 이어받기 상태 — 2026-10-05
Expand Down
Loading