8.3 KiB
GroundRecall Migration Plan
This document turns the boundary decisions in deployment-modes.md into an implementation plan.
The goal is not an immediate repo split. The goal is to let GroundRecall become independently deployable and operable without destabilizing ongoing Didactopus learner work.
Current State
Today, GroundRecall exists as a set of modules under src/didactopus/:
groundrecall_importgroundrecall_source_adapters/*groundrecall_lintgroundrecall_review_queuegroundrecall_review_bridgegroundrecall_modelsgroundrecall_storegroundrecall_promotiongroundrecall_querygroundrecall_exportgroundrecall_assistant_exportgroundrecall_assistants/*
This is acceptable as an implementation phase, but it creates two risks:
- generic knowledge-substrate functionality may continue to accrete under
didactopus.main - feature work may silently assume the presence of learner-facing Didactopus components
Migration Goal
Target state:
Didactopusremains the learner-facing applicationGroundRecallbecomes the standalone grounded knowledge substrateGenieHiveremains the model and routing control plane
The package, CLI, and deployment boundaries should eventually reflect that.
Target Ownership
GroundRecall should own
- source ingestion and normalization
- claim/concept/relation/artifact/provenance schemas
- canonical store and snapshots
- lint and review queue generation
- promotion and merge semantics
- assistant-neutral query and export
- assistant adapter export
- sync, merge, and team/shared knowledge operations
Didactopus should own
- learner session flows
- mentor/practice/evaluator/project-advisor workflows
- pack and curriculum-specific review UX
- mastery-ledger and learner evidence experiences
- educational packaging over grounded knowledge
Shared boundary helpers should stay narrow
- provider policy that depends on GenieHive route resolution but serves learner workflows
- review bridges where GroundRecall needs to feed an existing Didactopus review process during the transition
Packaging Direction
Phase 0: Present layout, stricter discipline
Keep the code in src/didactopus/, but use naming and imports that preserve the eventual split.
Rules:
- new generic knowledge features go into
groundrecall_*modules - new learner-facing features go into
didactopuslearner modules - do not add generic knowledge operations to
didactopus.main - treat review bridges as bridges, not permanent core ownership
Phase 1: Explicit namespace inside the repo
Preferred direction:
- move GroundRecall modules under
src/didactopus/groundrecall/
Target structure:
src/didactopus/groundrecall/ingest.pysrc/didactopus/groundrecall/source_adapters/src/didactopus/groundrecall/models.pysrc/didactopus/groundrecall/store.pysrc/didactopus/groundrecall/promotion.pysrc/didactopus/groundrecall/query.pysrc/didactopus/groundrecall/export.pysrc/didactopus/groundrecall/assistants/src/didactopus/groundrecall/sync.pysrc/didactopus/groundrecall/merge.pysrc/didactopus/groundrecall/cli.py
Benefits:
- cleaner conceptual grouping
- easier extraction later
- clearer import discipline
Compatibility path:
- keep thin wrapper modules at old import paths during transition
- deprecate wrappers only after tests and docs have moved
Phase 2: Dual CLI identity
Before any repo split, expose GroundRecall as a first-class CLI namespace.
Desired commands:
python -m didactopus.groundrecall.cli import ...python -m didactopus.groundrecall.cli lint ...python -m didactopus.groundrecall.cli promote ...python -m didactopus.groundrecall.cli query ...python -m didactopus.groundrecall.cli export ...python -m didactopus.groundrecall.cli inspect ...
At that point, didactopus.main should only surface:
- learner-facing commands
- review-workflow commands with educational intent
- possibly a pointer to GroundRecall commands, but not ownership of them
Phase 3: Optional package extraction
Only after sync/merge and standalone use are mature:
- move GroundRecall to its own package or repo if that becomes operationally useful
- keep Didactopus consuming it as a dependency
This step is optional. A clean package boundary inside one repo may be sufficient for a long time.
CLI Migration Plan
Keep under didactopus.main
review- future learner-facing workbench commands
Move toward GroundRecall CLI
- import
- lint
- review queue
- promotion
- canonical query
- canonical export
- assistant export
- sync and merge
Transitional exception
provider-inspect can remain on the Didactopus umbrella CLI for now because:
- it is already useful operationally
- it supports learner-node deployments
- it is not a GroundRecall-specific operation
Longer term, it may also belong on a separate operator surface depending on whether Didactopus becomes the standard local application shell.
Module Mapping
Move first
Current -> target
didactopus.groundrecall_import->didactopus.groundrecall.ingestdidactopus.groundrecall_source_adapters.*->didactopus.groundrecall.source_adapters.*didactopus.groundrecall_models->didactopus.groundrecall.modelsdidactopus.groundrecall_store->didactopus.groundrecall.storedidactopus.groundrecall_promotion->didactopus.groundrecall.promotiondidactopus.groundrecall_query->didactopus.groundrecall.querydidactopus.groundrecall_export->didactopus.groundrecall.exportdidactopus.groundrecall_assistants.*->didactopus.groundrecall.assistants.*
Keep as transitional bridges
didactopus.groundrecall_review_bridge- source adapters that ingest Didactopus-native artifacts
These are legitimate but should be documented as cross-boundary adapters rather than intrinsic ownership proof.
Stay in Didactopus
learner_sessionlearner_session_demomentorpracticeproject_advisor- educational review UX modules
- pack and graph-planning modules
Service Boundary Direction
GroundRecall service candidates
Once needed, a GroundRecall service should focus on:
- canonical knowledge query
- import status and queue inspection
- promotion status
- sync/merge status
- assistant-neutral bundle retrieval
Didactopus service candidates
- learner session orchestration
- learner progress and evaluation
- pack/workbench interactions
GenieHive service candidates
- model and service inspection
- route resolution
- cluster health
Milestones
Milestone 1: Namespace discipline
Done when:
- new generic knowledge work lands only in GroundRecall-oriented modules
didactopus.mainstops growing generic knowledge commands- docs consistently describe GroundRecall as a substrate, not a learner feature
Milestone 2: Internal package reorganization
Done when:
- GroundRecall modules live under an explicit package path
- old flat import paths are wrappers only
- tests target the new package paths
Milestone 3: First-class GroundRecall CLI
Done when:
- import/lint/promote/query/export/inspect are available under one GroundRecall CLI surface
- operator docs no longer require
Didactopusframing for generic knowledge tasks
Milestone 4: Sync and merge maturity
Done when:
- append-only event ingestion exists
- promoted-state merge semantics exist
- team/shared knowledge workflows are practical without learner workflows
Milestone 5: Extraction decision
Done when:
- the project can make an informed choice between:
- one repo, multiple packages
- separate GroundRecall package/repo
Immediate Next Work
Recommended next implementation steps:
- Introduce
didactopus.groundrecallas an internal package namespace. - Add a single GroundRecall umbrella CLI module.
- Keep thin wrapper modules for compatibility.
- Start moving docs and tests to the new namespace.
- Begin implementing sync/merge primitives under GroundRecall rather than under Didactopus learner flows.
Decision Rule For New Work
Before adding a new command, module, or service, ask:
- Would this still be needed if there were no learner session?
- Would a team using only shared knowledge still need it?
- Is the canonical artifact knowledge state or educational interaction?
- Would it still matter if Didactopus UI vanished?
If yes, default toward GroundRecall.