Skip to content

v3.1.0

Choose a tag to compare

@imattau imattau released this 22 Aug 04:27
· 24 commits to master since this release

Added

  • Adaptive memory layer, extended across TypeScript, Rust, and Python:
    • Per-context activation (NodeActivation.context): reinforceNode/
      reinforce_node gain an optional context argument that reinforces an
      independently-decaying, additional lens alongside the global score.
      getContextActivation/get_context_activation reads it back.
    • Inhibition (NodeActivation.inhibition/lastInhibitedAt): a new
      suppressNode/suppress_node primitive with its own decay half-life,
      subtracted from score only at the final read/ranking layer so a
      suppressed node stays re-evaluable rather than permanently invisible.
    • Budgeted, diversity-aware ActivationEngine.workingMemory/
      working_memory: an options form (tokenBudget, costOf,
      diversityLambda, similarityOf) implementing a memory-flavoured
      maximal-marginal-relevance selection, backward compatible with the
      existing (limit, minScore) call shape.
    • Memory classes (episodic/semantic/procedural/entity): a
      per-node memoryClass override falling back to a schema-level
      NodeTypeDefinition.memoryClass default, driving differentiated
      score/importance decay half-lives via ActivationConfig.classHalfLives.
    • Confidence and provenance fields on PolyNode: confidence, source,
      observedAt, derivedFrom, supersedes, contradicts — ordinary,
      optional node fields (not activation state), settable via addNode,
      updateNode, and patchNode (which now also supports these as
      top-level set/unset/increment/compareAndSet paths, not only
      data.*, in all three languages).
    • supersede(id, supersededId, amount?, reason?): a contradiction
      primitive that records supersedes, adds a SUPERSEDED_BY edge, and
      suppresses the superseded node without deleting it.
    • consolidate(node, sourceIds, options?): a consolidation primitive
      that writes a higher-level node with derivedFrom merged from its
      sources, adds CONSOLIDATED_FROM edges, and suppresses the sources.
    • ActivationEngine.recordFeedback(id, wasUseful, learningRate?):
      learned scoring weights — nudges pulse's composite
      semantic/graph/recency/usage weights from outcome feedback instead of
      requiring hand-tuning.
    • Fixed a latent double-decay bug in the TypeScript
      ActivationEngine.effective, found while adding class-resolved
      half-lives: it re-decayed the already-decayed result of
      getActivationState a second time, silently breaking any non-default
      half-life under real elapsed time.
    • See specification/data-model.md sections 1.5–1.10 and
      docs/API.md for full details.

Fixed

  • Restored an edge-id integrity check in the Rust graph's rebuild_edge_index
    (rejecting empty ids) that had been dropped while adding support for
    independent edge IDs.
  • Python DirectoryStorage now implements real sync/sync_dir (fsync),
    bridged from the native storage adapter, so its advertised fsync
    capability is honest.
  • Rust attribute_ranges queries now resolve nested dot-path fields the same
    way attributes does, instead of only matching flat top-level fields.
  • Rust's in-memory GraphQuery index selection now excludes a sparse index
    when the queried value is null, matching PersistedGraphQuery.
  • Rust count_nodes now derives its maxNodesVisited candidate set the same
    way query_nodes does, instead of always falling back to the full store
    size.
  • The TypeScript BinaryStoreAdapter now dedups retried batches by
    transactionId as well as operationId, matching the Rust/Python
    idempotency contract.
  • Rust's SyncServer::submit adds a clientId:seq fallback dedup (evicted
    alongside the ops ring buffer), matching the TypeScript server.
  • Python's SyncServer.receive stops evaluating conflict() for an
    operation authorize() already rejected, matching the TypeScript server.