refactor!: remove memory, catalog, and clean up API#2
Conversation
BREAKING CHANGE: Memory, Embedder, Vector, and Catalog interfaces removed. Users should implement persistence as custom pipz.Chainable[*Thought] primitives. - Remove Memory interface and all persistence primitives (Seek, Survey, Recall, Checkpoint, Restore, Forget) - Remove Embedder interface and OpenAI embedder implementation - Remove Vector type (pgvector wrapper) - Remove Catalog interface and data primitives (Fetch, Discover, Relate) - Simplify Thought constructors: New/NewWithTrace no longer require Memory or return error - Remove NewForTask constructor and TaskID field (orphaned after memory removal) - MarkNotesPublished now accepts context.Context for traceable signal emission - Remove unreachable error path in Prioritize.resolveItems - Fix typo in Thought.Clone documentation - Update all documentation to reflect changes Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
📝 WalkthroughWalkthroughThis PR removes persistence, embedding, catalog, and many discovery/search primitives, simplifies the Thought/Note public API (constructors no longer require Memory; MarkNotesPublished now accepts a context), and updates docs, tests, and benchmarks to the new two-concept model. Changes
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
📋 Version PreviewCurrent: v0.0.2 Version will be applied when PR is merged and release triggered. |
📊 Coverage ReportTotal Coverage: 75.5%
Coverage by PackageCoverage report generated by Codecov |
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (4)
prioritize.go (1)
181-199:⚠️ Potential issue | 🟡 MinorEmpty
itemsKeyproduces a confusing error whenitemsis also empty.If
NewPrioritizeis called with anilor empty items slice,len(r.items) == 0falls through to Mode 2, wherer.itemsKeyis the zero-value"".t.GetContent("")then returns an error surfaced asprioritize: items note "" not found, which offers no useful signal to the caller.The removed guard (
itemsKey == "") was described as "unreachable" under normal API use, but bothNewPrioritize(k, c, nil)andNewPrioritize(k, c, []string{})still reach this path.🛡️ Proposed fix
// Mode 2: Read items from specific note key +if r.itemsKey == "" { + return nil, fmt.Errorf("prioritize: no items provided") +} itemsJSON, err := t.GetContent(r.itemsKey)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@prioritize.go` around lines 181 - 199, resolveItems in type Prioritize currently falls through to calling t.GetContent with an empty itemsKey when r.items is empty and r.itemsKey is the zero value, producing an unclear error; add a guard at the start of resolveItems (or just before Mode 2) to check if r.itemsKey == "" and return a clear error like "prioritize: no items to rank" (or "prioritize: itemsKey is empty") so callers get a meaningful message; reference resolveItems, Prioritize, r.items, r.itemsKey, NewPrioritize and t.GetContent when making the change.docs/2.learn/3.architecture.md (1)
143-165:⚠️ Potential issue | 🟡 MinorUpdate documentation example to match actual interface implementation — replace
Name()withIdentity()andSchema().The example shows
func (p *MyPrimitive) Name() pipz.Nameon line 163, but all concrete implementations in the codebase (Decide, Discern, Sift, Prioritize) implementIdentity() pipz.IdentityandSchema() pipz.Nodeinstead. The example will fail to satisfypipz.Chainableas currently defined.Suggested correction
-func (p *MyPrimitive) Name() pipz.Name { return pipz.Name(p.key) } -func (p *MyPrimitive) Close() error { return nil } +func (p *MyPrimitive) Identity() pipz.Identity { return pipz.NewIdentity(p.key, "My custom primitive") } +func (p *MyPrimitive) Schema() pipz.Node { return pipz.Node{Identity: p.Identity(), Type: "my_primitive"} } +func (p *MyPrimitive) Close() error { return nil }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/2.learn/3.architecture.md` around lines 143 - 165, The doc example's MyPrimitive does not implement the real pipz.Chainable interface because it defines Name() instead of the required Identity() and Schema() methods; update the example by removing func (p *MyPrimitive) Name() pipz.Name and adding two methods: func (p *MyPrimitive) Identity() pipz.Identity that returns an identity built from p.key, and func (p *MyPrimitive) Schema() pipz.Node that returns the node/schema for the primitive (matching how other implementations like Decide/Discern/Sift/Prioritize do it) so MyPrimitive implements pipz.Chainable alongside Process and Close.docs/5.reference/1.api.md (2)
6-6:⚠️ Potential issue | 🟡 MinorStale
updateddate in frontmatter.Same as the concepts doc —
updated: 2025-01-11should reflect the current revision date.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/5.reference/1.api.md` at line 6, The frontmatter in docs/5.reference/1.api.md has a stale updated field ("updated: 2025-01-11"); update the updated value to the current revision date by editing the frontmatter entry named updated so it matches the actual doc revision (replace the "2025-01-11" value with the correct ISO date).
19-27:⚠️ Potential issue | 🟡 Minor
Sessiontype shown as*Sessionbut actual type is*zyn.Session.The documented struct shows
Session *Session(line 24), but the implementation usesSession *zyn.Session. This is a minor doc simplification, but since this is an API reference doc, showing the correct qualified type would help users who need to interact with the Session field directly.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/5.reference/1.api.md` around lines 19 - 27, Update the API reference for the Thought struct so the Session field shows the fully-qualified type used in the codebase: change Session *Session to Session *zyn.Session in the Thought definition, ensuring the doc matches the actual implementation and helps users reference the correct package/type.
🧹 Nitpick comments (2)
thought.go (2)
361-375: Consider capturingpublishedCountin a local variable before unlocking.
t.publishedCountis read at lines 372–373 aftert.mu.Unlock()on line 367. While the doc contract forbids concurrent writes, capturing the value in a local (likepreviousPublished) keeps the pattern consistent and is more resilient against future contract violations.♻️ Suggested tweak
func (t *Thought) MarkNotesPublished(ctx context.Context) { t.mu.Lock() previousPublished := t.publishedCount t.publishedCount = len(t.notes) + newPublished := t.publishedCount t.mu.Unlock() // Emit notes published event capitan.Emit(ctx, NotesPublished, FieldTraceID.Field(t.TraceID), - FieldPublishedCount.Field(t.publishedCount), - FieldUnpublishedCount.Field(t.publishedCount-previousPublished), + FieldPublishedCount.Field(newPublished), + FieldUnpublishedCount.Field(newPublished-previousPublished), ) }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@thought.go` around lines 361 - 375, MarkNotesPublished reads t.publishedCount after releasing t.mu which risks seeing concurrent changes; capture the updated publishedCount into a local variable before t.mu.Unlock() (e.g., newPublished := t.publishedCount) and use that local (and previousPublished) when calling capitan.Emit (replace FieldPublishedCount.Field(t.publishedCount) and FieldUnpublishedCount.Field(t.publishedCount-previousPublished) with FieldPublishedCount.Field(newPublished) and FieldUnpublishedCount.Field(newPublished-previousPublished)), keeping the mutex hold only for the assignment and then unlocking.
114-139:AddNotealways returnsnil— error return is now vestigial.With persistence removed,
AddNote(and by extensionSetContent/SetNote) has no failure path. Theerrorreturn is dead weight that every caller must still handle. I understand removing it would broaden the breaking-change surface, so this may be intentional — just flagging it for awareness. If you plan a follow-up API cleanup, this would be a good candidate.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@thought.go` around lines 114 - 139, The AddNote method currently returns an unused error; remove the vestigial error return by changing the signature of Thought.AddNote to not return error and update its callers to stop checking an error; also update related methods SetContent and SetNote (and any interfaces that declare them) to drop error returns so the API is consistent, then adjust all call sites, tests and any uses of the returned value accordingly; locate the implementation by finding Thought.AddNote (and references to t.notes, t.index.Store, t.UpdatedAt, and capitan.Emit) and update signatures, callers, and docs/tests in one atomic change.
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
go.sumis excluded by!**/*.sum
📒 Files selected for processing (50)
amplify.goanalyze.goapi.goassess.gocatalog.gocatalog_test.gocategorize.gocheckpoint.gocheckpoint_test.goconverge.godecide.godiscern.godiscover.godiscover_test.godocs/1.overview.mddocs/2.learn/1.quickstart.mddocs/2.learn/2.concepts.mddocs/2.learn/3.architecture.mddocs/5.reference/1.api.mdembedder.goembedder_test.gofetch.gofetch_test.goforget.goforget_test.gogo.modmemory.gomock_memory_test.goprioritize.gorecall.gorecall_test.goreflect_test.gorelate.gorelate_test.gorestore.gorestore_test.goseek.goseek_test.gosift.gosignals.gosignals_test.gosurvey.gosurvey_test.gotesting/benchmarks/benchmarks_test.gotesting/helpers.gotesting/helpers_test.gothought.gothought_test.govector.govector_test.go
💤 Files with no reviewable changes (29)
- go.mod
- testing/helpers_test.go
- recall_test.go
- discover_test.go
- forget.go
- fetch_test.go
- forget_test.go
- memory.go
- checkpoint.go
- restore.go
- vector.go
- mock_memory_test.go
- relate.go
- survey_test.go
- vector_test.go
- embedder_test.go
- checkpoint_test.go
- seek_test.go
- recall.go
- discover.go
- catalog_test.go
- catalog.go
- fetch.go
- restore_test.go
- relate_test.go
- signals.go
- embedder.go
- survey.go
- seek.go
🧰 Additional context used
🧬 Code graph analysis (4)
thought_test.go (1)
thought.go (3)
Thought(48-69)New(73-91)NewWithTrace(94-112)
testing/benchmarks/benchmarks_test.go (1)
thought.go (1)
New(73-91)
thought.go (1)
signals.go (4)
ThoughtCreated(9-12)FieldIntent(79-79)FieldTraceID(80-80)NotesPublished(33-36)
testing/helpers.go (1)
thought.go (3)
Thought(48-69)New(73-91)NewWithTrace(94-112)
🔇 Additional comments (28)
categorize.go (1)
122-122: LGTM — context propagated correctly toMarkNotesPublished.converge.go (1)
224-224: LGTM —MarkNotesPublished(ctx)correctly called after all branch notes are merged intot.signals_test.go (2)
140-140: LGTM —context.Background()is correct for the test publish call.
447-447: LGTM — explicitMarkNotesPublishedemits a correlatedNotesPublishedevent sufficient for the trace-ID correlation assertion.reflect_test.go (1)
44-44: LGTM — uses the locally-declaredctxconsistently with the rest of the test function.thought_test.go (2)
9-17: LGTM — clean test helpers usingcontext.Background()appropriately; accessible package-wide since all test files usepackage cogito.
30-32: LGTM — good regression coverage for UUID generation on bothThought.IDandNote.ID.Also applies to: 84-86
amplify.go (1)
208-208: LGTM.assess.go (1)
117-117: LGTM.analyze.go (1)
125-125: LGTM.decide.go (1)
120-120: LGTM — context propagation toMarkNotesPublishedis correct.
ctxis already the request-scoped context inProcess; passing it here enables cancellation propagation and context-aware signal emission in the publishing step.discern.go (1)
134-134: LGTM — context propagation is correct, ordering is intentional.Marking notes published before the routing phase (line 136) ensures routes receive only their own new notes as unpublished context, consistent with the accumulation model.
sift.go (1)
139-139: LGTM.prioritize.go (1)
165-165: LGTM.testing/benchmarks/benchmarks_test.go (1)
16-16: LGTM — API call-site updates are correct.All benchmark functions correctly use the new
cogito.New(ctx, label)signature (single*Thoughtreturn, no error), matching the updatedthought.go.docs/2.learn/3.architecture.md (3)
59-61: LGTM — diagram correctly reflects the simplified primitive set.
68-79: LGTM — architecture and infrastructure diagrams correctly drop the Memory/Embedder layer.
134-134: LGTM — signal description updated.docs/1.overview.md (1)
3-63: LGTM — overview correctly reflects the simplified Thought-Note architecture.docs/2.learn/1.quickstart.md (1)
27-127: LGTM — quickstart examples correctly reflect the simplifiedNew(ctx, intent)API.api.go (1)
1-78: Package documentation cleanly reflects the simplified two-concept architecture.The doc comments are well-organized, accurately describe the remaining primitives, and the provider resolution hierarchy is clearly documented. No issues found.
docs/2.learn/2.concepts.md (1)
39-47: Nice addition documenting Clone behavior.The new "Cloning for Parallel Processing" section is a helpful addition that aligns with the concurrency guidance in
thought.go.testing/helpers.go (1)
13-24: Clean simplification of test helpers.Removing the MockMemory dependency and delegating directly to
cogito.New/cogito.NewWithTraceis a good improvement. The thin wrappers still provide value by encapsulating thecontext.Background()call and keeping test code concise.thought.go (2)
71-112: Constructor simplification looks good.
NewandNewWithTraceare clean, emit the right signals, and the removal of the error return is consistent with the removal of persistence. No issues.
277-329: Clone correctly deep-copies notes and rebuilds the index.Metadata maps are properly deep-copied. The removal of Embedding from the clone logic is consistent with the Note struct changes.
docs/5.reference/1.api.md (3)
232-240:GetProvideris correctly documented. The function exists inprovider.goand matches the documented signaturefunc GetProvider() Provider.
154-177: Documentation signatures are accurate. All Reflect API methods (NewReflect,WithPrompt,WithProvider,WithUnpublishedOnly) and Reset API methods (NewReset,WithSystemMessage,WithPreserveNote) match their implementations.
220-229: Documentation signatures are accurate.All pipeline helpers (Sequence, Filter, Switch, Gate, Fallback, Retry, Backoff, Timeout, Concurrent, Race) correctly show
pipz.Identityas the first parameter and match their actual implementations in helpers.go.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs/2.learn/2.concepts.md`:
- Line 6: Frontmatter has a stale "updated" field ("updated: 2025-01-11");
update the updated frontmatter key in this document (the "updated" field in
docs/2.learn/2.concepts.md) to the current date (e.g., 2026-02-22) so the
frontmatter reflects the PR’s revision date.
---
Outside diff comments:
In `@docs/2.learn/3.architecture.md`:
- Around line 143-165: The doc example's MyPrimitive does not implement the real
pipz.Chainable interface because it defines Name() instead of the required
Identity() and Schema() methods; update the example by removing func (p
*MyPrimitive) Name() pipz.Name and adding two methods: func (p *MyPrimitive)
Identity() pipz.Identity that returns an identity built from p.key, and func (p
*MyPrimitive) Schema() pipz.Node that returns the node/schema for the primitive
(matching how other implementations like Decide/Discern/Sift/Prioritize do it)
so MyPrimitive implements pipz.Chainable alongside Process and Close.
In `@docs/5.reference/1.api.md`:
- Line 6: The frontmatter in docs/5.reference/1.api.md has a stale updated field
("updated: 2025-01-11"); update the updated value to the current revision date
by editing the frontmatter entry named updated so it matches the actual doc
revision (replace the "2025-01-11" value with the correct ISO date).
- Around line 19-27: Update the API reference for the Thought struct so the
Session field shows the fully-qualified type used in the codebase: change
Session *Session to Session *zyn.Session in the Thought definition, ensuring the
doc matches the actual implementation and helps users reference the correct
package/type.
In `@prioritize.go`:
- Around line 181-199: resolveItems in type Prioritize currently falls through
to calling t.GetContent with an empty itemsKey when r.items is empty and
r.itemsKey is the zero value, producing an unclear error; add a guard at the
start of resolveItems (or just before Mode 2) to check if r.itemsKey == "" and
return a clear error like "prioritize: no items to rank" (or "prioritize:
itemsKey is empty") so callers get a meaningful message; reference resolveItems,
Prioritize, r.items, r.itemsKey, NewPrioritize and t.GetContent when making the
change.
---
Nitpick comments:
In `@thought.go`:
- Around line 361-375: MarkNotesPublished reads t.publishedCount after releasing
t.mu which risks seeing concurrent changes; capture the updated publishedCount
into a local variable before t.mu.Unlock() (e.g., newPublished :=
t.publishedCount) and use that local (and previousPublished) when calling
capitan.Emit (replace FieldPublishedCount.Field(t.publishedCount) and
FieldUnpublishedCount.Field(t.publishedCount-previousPublished) with
FieldPublishedCount.Field(newPublished) and
FieldUnpublishedCount.Field(newPublished-previousPublished)), keeping the mutex
hold only for the assignment and then unlocking.
- Around line 114-139: The AddNote method currently returns an unused error;
remove the vestigial error return by changing the signature of Thought.AddNote
to not return error and update its callers to stop checking an error; also
update related methods SetContent and SetNote (and any interfaces that declare
them) to drop error returns so the API is consistent, then adjust all call
sites, tests and any uses of the returned value accordingly; locate the
implementation by finding Thought.AddNote (and references to t.notes,
t.index.Store, t.UpdatedAt, and capitan.Emit) and update signatures, callers,
and docs/tests in one atomic change.
There was a problem hiding this comment.
Actionable comments posted: 1
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (5)
docs/1.overview.mddocs/2.learn/1.quickstart.mddocs/2.learn/2.concepts.mddocs/2.learn/3.architecture.mddocs/5.reference/1.api.md
🔇 Additional comments (7)
docs/1.overview.md (2)
3-3: LGTM — all terminology updates are accurate and internally consistent.Description, heading blurb, architecture name, Note description, and Next Steps link all align correctly with the PR's removal of Memory/Embedder/Vector/Catalog concepts.
Also applies to: 12-12, 16-16, 19-19, 62-62
27-27: No changes needed — "capitan" is the correct library name, not a typo. The codebase imports and usesgithub.com/zoobzio/capitanextensively throughout (in thought.go, signals.go, and multiple step files), and the documentation on line 27 is accurate and consistent with the implementation.docs/2.learn/1.quickstart.md (1)
5-6: LGTM!All changed lines are consistent with the PR objectives — provider-only setup, simplified
New(ctx, intent)constructor calls, and the updated "Thought and Note" link.Also applies to: 27-27, 45-45, 48-48, 50-50, 108-108, 127-127
docs/2.learn/3.architecture.md (1)
59-79: LGTM!Diagram removals (Memory/Embedder from infrastructure, Recall/Seek from primitives, Memory from Thought schema), the
NoteAddeddescription change,MarkNotesPublished(ctx)call-site update, and performance-list renumbering are all clean and internally consistent.Also applies to: 134-134, 158-158, 170-171
docs/2.learn/2.concepts.md (1)
24-24: LGTM!
New(ctx, intent)constructor, auto-generated ID documentation, removedNote.Embedding, andMarkNotesPublished(ctx)are all consistent across the PR.Also applies to: 34-34, 55-55, 103-103
docs/5.reference/1.api.md (2)
20-20: LGTM!Constructor simplifications (
New,NewWithTrace),Thought.IDcomment update,TaskIDremoval, andMarkNotesPublished(ctx context.Context)signature are accurate and consistent with the rest of the PR.Also applies to: 33-34, 54-54
154-177: LGTM!Reflection and Session Management reorganisation (
NewReflect(key string)withWithPrompt/WithUnpublishedOnly,NewReset(key string)withWithSystemMessage/WithPreserveNote) is clean and well-structured.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@docs/5.reference/1.api.md`:
- Around line 220-229: Examples pass string literals where a pipz.Identity
struct is required; update all quickstart and README examples that call
functions like Sequence, Filter, Switch, Gate, Fallback, Retry, Backoff,
Timeout, Concurrent, Race etc. to construct identities using
pipz.NewIdentity("name", "<description>") instead of raw strings (e.g., replace
Sequence("ticket-triage", ...) with Sequence(pipz.NewIdentity("ticket-triage",
"<description>"), ...)); ensure every occurrence in docs/quickstart and README
uses pipz.NewIdentity so the signature matches the pipz.Identity parameter.
---
Duplicate comments:
In `@docs/2.learn/2.concepts.md`:
- Around line 3-7: The frontmatter "updated" field was corrected to 2026-02-21;
please ensure the frontmatter key updated uses the ISO date format (YYYY-MM-DD)
and accurately reflects the last edit, and verify the other frontmatter keys
like "description", "author", and "tags" remain current (update their values if
they are stale) so the document metadata is consistent.
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
docs/2.learn/1.quickstart.md (1)
47-77:⚠️ Potential issue | 🟡 MinorAdd missing imports to the Step 2 code example.
The
processTicket()function usespipz.NewIdentity()andfmt.Printf()but the code block (lines 47–77) does not show import statements for eitherpipzorfmt. New users will encounter compilation errors.Add the following imports to the Step 2 example:
📝 Suggested fix
```go +import ( + "fmt" + "github.com/zoobzio/pipz" +) + func processTicket(ctx context.Context, ticketText string) error { // Create a thought thought := cogito.New(ctx, "triage support ticket")🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/2.learn/1.quickstart.md` around lines 47 - 77, The example for processTicket is missing imports which will cause compile errors; add the fmt package and the pipz module import used by pipz.NewIdentity at the top of the code example (i.e., include import "fmt" and import "github.com/zoobzio/pipz") so the processTicket(ctx, ticketText string) function can call fmt.Printf and pipz.NewIdentity without errors.
🧹 Nitpick comments (1)
docs/2.learn/1.quickstart.md (1)
108-108: Spelling inconsistency:"analyse"vs."analyze".The string literal uses British spelling (
"analyse feedback") while the project API consistently uses American spelling (NewAnalyze,NewAnalyze[TicketData]). Aligning to"analyze feedback"keeps the docs consistent with the codebase naming convention.📝 Suggested fix
- thought := cogito.New(ctx, "analyse feedback") + thought := cogito.New(ctx, "analyze feedback")🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/2.learn/1.quickstart.md` at line 108, Spelling inconsistency: change the string literal passed to cogito.New from "analyse feedback" to the American spelling "analyze feedback" to match the project API naming (e.g., NewAnalyze and NewAnalyze[TicketData]); update the example invocation in the docs (cogito.New(...)) so it uses "analyze feedback" for consistency.
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
docs/2.learn/1.quickstart.md
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Outside diff comments:
In `@docs/2.learn/1.quickstart.md`:
- Around line 47-77: The example for processTicket is missing imports which will
cause compile errors; add the fmt package and the pipz module import used by
pipz.NewIdentity at the top of the code example (i.e., include import "fmt" and
import "github.com/zoobzio/pipz") so the processTicket(ctx, ticketText string)
function can call fmt.Printf and pipz.NewIdentity without errors.
---
Nitpick comments:
In `@docs/2.learn/1.quickstart.md`:
- Line 108: Spelling inconsistency: change the string literal passed to
cogito.New from "analyse feedback" to the American spelling "analyze feedback"
to match the project API naming (e.g., NewAnalyze and NewAnalyze[TicketData]);
update the example invocation in the docs (cogito.New(...)) so it uses "analyze
feedback" for consistency.
BREAKING CHANGE: Memory, Embedder, Vector, and Catalog interfaces removed. Users should implement persistence as custom pipz.Chainable[*Thought] primitives.
Summary by CodeRabbit
Breaking Changes
Removed Features
Documentation