Before you publish
Reference checklist
Use this page as a compact review checklist for a catalog change.
It is a final review aid, not an introduction. Follow Catalog layout in order for first-time authoring, and use the Glossary when a checklist term is unfamiliar.
Identity and names¶
- Public names are lowercase and match the documented length/pattern rules.
- Collection, view, and artifact versions are positive integers.
- Package version is semantic versioning.
- References are exact (
name@1, never justname). - Computed
definition_hashvalues are absent from source.
Collections¶
-
schemais an object JSON Schema and validates the intendedcontent. -
modematches how callers usekey. - Required and optional processor lists do not overlap.
- Every declared field path is under
contentorannotations. - Array field types use exactly one scalar type and are not sortable.
- Search filters/order use field names declared in the collection.
- Breaking changes use a new collection version.
-
answerable: trueis declared on exactly the collections a model may synthesize prose over — interpreted layers, not raw transcripts, snapshots, signals, or saved answers. - Callers of
POST /answerpassentitieswhenever the workspace holds more than one memory scope; omitting it answers over every entity in those collections.
Processors and models¶
- Every model target is
provider:modeland the provider accepts its params. -
embedis a single target with no completion params. - LLM-sourced score processors have
default,model, andprompt;client- andconstant-sourced processors obey their narrower contracts. - JSON processor output schemas are objects.
- JSON processor default outputs validate against their output schema.
- Projected score names are unique and resolve to numeric schema leaves.
- Every processor declares an
inputscope, and it includes every collection that binds it.
Derivations and triggers¶
-
sourcescontains exactly one driver —changes,snapshot, orstale_citations; every source scope references existing collections, versions, types, and statuses. - A
snapshotwindowis declared deliberately, and the run's bounds cover the windowed corpus rather than all history. -
emit.driver_keyis used only where the output key genuinely comes from the driving record, withmax_records: 1and no statickeys. -
emit.dynamic_keysis used only for a bounded independent-block collection and declaresmax_active_keys. -
changesis intentional for incremental work; asnapshotsource's record and token bounds cover its complete selected scope. -
current,record, andviewsources expose only the extra named reads each task needs. -
limitscover the declared tasks and stay within deployment budgets. - Every task has a unique
id, selects an installed task type withuse, and supplies only that task type's typedinputand staticwithconfiguration. - Built-in
searchtasks use exactly one ofqorforeach; custom tasks have validated input/config/output types and no ability to write records directly. - Template references name declared sources, earlier task results, or explicit
entity.*/run.*values. -
emit.fromis one exact typed reference to a task result. - The emission collection and type are the contract you intended; event emission omits
keys. - Keyed partial updates declare
keys; complete replacements also setcomplete: trueand return every key as a value or retraction. - Model-generated replacements that require approval set
review: required; promotion stays explicit. - Emitted drafts use generic
text/content, optionalkey,citations, andretractfields. - Trigger predicates use declared, filterable fields and correctly typed operands.
- Consuming trigger scopes (
write,quiet,changed,retraction) are subsets of the driving source; observational scopes (at,census) reference existing collections. -
attrigger fields are declared filterable datetime scalars, and the derivation reads its dated records through asnapshot,current, orviewsource so they are visible at fire time. - Accumulator metrics name existing scorers or required-annotation leaves; the aggregate and
comparisondirection are intentional. -
quiet.after_s,debounce_s, andcooldown_spacing matches real burst length and run cost. - Automatic trigger graph has no cycles and fits the depth limit.
Views and artifacts¶
- View parameters have the right type, and required parameters have no default.
- Graph views bind an event edge collection and three declared, filterable string role fields; orphan views also bind a keyed node collection.
- Search mode, scope, fields, predicates, and backend capabilities agree.
- Structured sources have
order_by; multi-source queries havefuse. - Artifact blocks choose exactly one of
documentorview. - Block token budgets and global render limits are sufficient.
- Reviewed artifacts specify a candidate processor and complete keys.
- The reviewed derivation emits a complete draft proposal; promotion stays explicit.
- Operators inspect persisted divergence and handle
promotion_staleby rebuilding rather than forcing old state.
Artifact uses and feedback¶
- Every artifact whose outcomes should teach something declares
learning. -
learning.target_blocknames arequireddocumentblock readingstatus: active. -
learning.artifactis an exactname@versionreference to alifecycle: reviewedartifact that maintains the target block's collections. - The package lists the learning-target artifact alongside the artifact that names it.
- The catalog defines a
learning_signalscollection whose schema admits the signal kinds and sources the application submits. -
learning_signalsrequires no processors, so a signal is trigger-eligible the moment it commits. - The candidate derivation's source scope matches the signal entity (
artifact:<name>) and the signal kinds it should act on. - Clients pass a
dedupe_keyscoped to the rated object, so retried feedback is idempotent. -
snapshot: trueis used only where exact historical provenance is genuinely required, and the artifact declares asnapshot:target. -
ARTIFACT_USE_RETENTION_DAYSis at least as long as the real user feedback window. - No processor depends on fetching an
execution_refstarget. - Telemetry attributes carry only the reserved
memseek.*scalars; no prompt, record content, model output, or customer identifier.
Package and release¶
- The package lists every exact collection, processor, trigger, view, artifact, and required search profile it uses.
- Required and optional search profiles do not overlap.
- The uploaded request package matches the manifest file.
- The new package preserves collection contracts needed by existing records.
- The compiled catalog hash and normalized
/collections,/processors,/triggerspayloads were reviewed. -
make checkand the relevant end-to-end flow pass.
Source-of-truth links¶
When this guide and the implementation differ, verify the current release against:
src/memseek/definitions/models.pyfor definition fields and local validation.src/memseek/artifact_uses.pyfor the artifact-use, telemetry, and feedback contracts.src/memseek/derive/schema.pyfor derivation/trigger fields.src/memseek/derive/tasks.pyfor the trusted task task type Interface and built-ins.src/memseek/search/spec.pyfor SearchSpec fields and limits.src/memseek/config.pyfor runtime settings and environment names.examples/crm_profile_catalog/for a complete package.