| feat(commit): implement write path orchestration components
- P1-W11: ArchiveBuilder - builds ContextNode from CandidateMemory
- P1-W12: CandidatePipeline - parallel extraction with filtering
- P1-W13: MergePolicies - ProfilePolicy, AggregateTopicPolicy, AppendOnlyPolicy, SkillToolPolicy
- P1-W14: PolicyRouter - routes candidates to appropriate policies
- P1-W15: ContextWriter - orchestrates plan → build → write pipeline
- P1-W16: OutboxStore - persists OutboxEvents for async indexing
- P1-W17: Unit tests for all commit components
Merge policies follow CLAUDE.md §5 behavior rules:
- Profile: always merge, fixed URI
- Preference/Entity/Pattern: merge by slug
- Event/Case: always create (append-only)
- Skill: fixed URI, accumulate usage stats
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
| 2 个月前 |
| fix(provenance): merge provenance_ids with dedup, accept list detail, append not overwrite
Three fixes to the provenance tracking system:
1. merge_policies: when an existing memory node is updated, combine
existing and incoming provenance_ids with order-preserving dedup
via _merge_provenance_ids. ArchiveBuilder prefers the merged list
from plan.merged_fields over the raw candidate field.
2. ProvenanceResolver: build_id accepts list[str] as detail for
archive source_type (resolver handles comma join internally).
parse_id returns list[str] for archive, str for others.
Validation centralized in validate_input — only archive allows
list detail.
3. extraction/tools: provenance_ids assignment changed from overwrite
(= [prov_id]) to append (.append(prov_id)) so that existing IDs
from prior pipeline steps are preserved.
Co-Authored-By: Claude [glm-5] <noreply@anthropic.com>
| 15 天前 |
| feat(provenance): preserve message IDs and pre-generate archive_id
- Add message.id to extraction state in _build_incremental_extraction_state
- Extend _Span with message_ids field, extract from messages[span_start:span_end+1]
- Add provenance_ids field to CandidateMemory
- Pass archive_id through extraction pipeline (Extractor -> CandidatePipeline -> MemoryWriteAPI)
- SessionManager.commit_snapshot accepts optional archive_id parameter
- Consolidate archive_id generation into generate_archive_id() in session_manager
- ArchiveBuilder writes provenance_ids to ContextNode.metadata
Co-Authored-By: Claude [glm-5] <noreply@anthropic.com>
| 15 天前 |
| feat(pgdirect): SQL-backed storage backend replacing AGFS
Direct PostgreSQL storage implementation:
- SQLContextFS: full ContextFS implementation with RLS tenant isolation
- SQLOutboxStore: listen-notify based async indexing
- SQLRelationStore, SQLArchiveStore: relation and session persistence
- SQLControlPlaneStore: multi-instance auth state sharing
- Shared connection pool (PoolAdapterMixin) with health checks
- Atomic write+outbox in single transaction
- Archive chain support (soft delete + outbox event)
- Owner-level ACL with visible_owner_spaces
- PostgreSQL schema with idempotent ensure_schema()
- Updated docs/setup scripts to replace AGFS with PostgreSQL
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
| 26 天前 |
| test: cover schema registry integration
| 11 天前 |
| feat(lifecycle): archive/delete operations, access tracking, aging job
P2 Phase 5: Memory lifecycle management with cold/hot detection.
- Add WriteAction constants: CREATE, MERGE, ARCHIVE, DELETE
- Add ContextFS.archive_node(): soft-delete with ARCHIVED status
- Modify context_writer.py: handle archive/delete actions, operation
fingerprinting for idempotency (sha256 of uri+action+session_id)
- Add commit/outbox_store.py: register_archive event type
- Add retrieval/access_tracker.py: AccessTracker records search hits
per URI, flushes to node metadata (last_accessed_at, hit_count_30d)
- Hook access tracking into retrieval pipeline
- Add lifecycle/aging_job.py: AgingJob scans nodes, proposes archive
for cold nodes (>90d, 0 hits) and delete for archived (>365d)
- Auto-approve mode for unattended execution
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
| 1 个月前 |
| feat: formalize schema-driven extraction
| 11 天前 |
| feat: routing_key normalization, tool_stats, hotness formula fix
- Add routing_key normalization with synonym table (commit/routing_key.py)
Maps LLM-generated keys to canonical forms (coffee→beverage, code_style→coding_style)
Prevents memory fragmentation from inconsistent LLM naming
- Populate CandidateMemory.tool_stats with ExtractToolInput-specific fields
(best_for, optimal_params, common_failures, recommendation, tool_identifier)
instead of packing into content string
- Fix hotness formula: freq now ranges [0.0, 1.0) instead of [0.5, 1.0]
Unvisited nodes correctly start at 0 instead of being biased to 0.5
- Increase global_search_topk default from 5 to 15
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
| 1 个月前 |
| feat(pgdirect): SQL-backed storage backend replacing AGFS
Direct PostgreSQL storage implementation:
- SQLContextFS: full ContextFS implementation with RLS tenant isolation
- SQLOutboxStore: listen-notify based async indexing
- SQLRelationStore, SQLArchiveStore: relation and session persistence
- SQLControlPlaneStore: multi-instance auth state sharing
- Shared connection pool (PoolAdapterMixin) with health checks
- Atomic write+outbox in single transaction
- Archive chain support (soft delete + outbox event)
- Owner-level ACL with visible_owner_spaces
- PostgreSQL schema with idempotent ensure_schema()
- Updated docs/setup scripts to replace AGFS with PostgreSQL
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
| 26 天前 |