PRD-108 Implementation — Shared Memory Field
Branch: ralph/prd-82b-mission-intelligence Commit: 674474722 Date: 2026-03-21 Authors: Gerard Kavanagh + Claude
What We Built
A shared semantic vector field where agents query by meaning instead of passing messages through a chain. Every agent in a mission reads from and writes to the same field. Relevance is surfaced by resonance — not by who told whom what.
This kills the telephone game.
Before (message-passing):
Agent A → findings → Agent B → summary → Agent C
If B doesn't mention finding #7, C never sees it.
After (shared field):
Agent A injects 10 findings into the field
Agent B queries, sees findings, injects analysis
Agent C queries "subtopic 7" → finds it directly
No intermediary. No information loss.Architecture
Core Abstraction
core/ports/context.py — SharedContextPort (ABC)
Defines the contract: create_context, inject, query, destroy_context. Any backend can implement it. Today we have two:
RedisSharedContext(PRD-107) — key-value message passingVectorFieldSharedContext(PRD-108) — semantic vector field
Swappable. A/B testable. Same interface, fundamentally different information dynamics.
The Field — modules/context/adapters/vector_field.py
modules/context/adapters/vector_field.pyEach mission gets a Qdrant collection (field_{uuid}). Each piece of knowledge is a point:
Vector
2048-dim embedding (via EmbeddingManager / OpenRouter)
Payload
agent_id, key, value, strength, created_at, last_accessed, access_count, content_hash
Distance
Cosine similarity
Resonance Scoring
When an agent queries the field, results are ranked by resonance, not raw cosine similarity:
Squared cosine amplifies high-similarity matches and suppresses noise
Decayed strength ensures freshness matters
Temporal Decay
Patterns fade over time following exponential decay:
0
1.0000
1.2500
2.0000
1
0.9048
1.1310
1.8097
7
0.4966
0.6207
0.9932
24
0.0907
0.1134
0.1814
48
0.0082
0.0103
0.0165
72
0.0007
—
—
A pattern nobody accesses is effectively dead after 3 days.
Hebbian Reinforcement
"Neurons that fire together wire together."
Each time a pattern is returned in a query, its
access_countincrementsAccess boost:
min(1.0 + access_count × 0.05, 2.0)— max 2× original strengthCo-access bonus: When multiple patterns are retrieved together, each gets +2% per co-pattern — related ideas strengthen each other
Deduplication
Content is hashed (SHA-256). If the same content is injected twice, the existing pattern is reinforced rather than duplicated.
Archival Threshold
Patterns with decayed_strength < 0.05 are filtered from query results. They still exist in the collection but are effectively archived — retrievable only if directly accessed.
Field Stability
A convergence metric for telemetry:
Stability rises as agents reference the same patterns (reinforcement) and falls as old, unreferenced patterns drag down the average.
Integration Points
Mission Coordinator (services/coordinator_service.py)
services/coordinator_service.py)_create_mission_field()— Creates the Qdrant field when a mission starts, storesfield_idinrun.configJSONB_inject_task_output_into_field()— After each task completes, its output is injected into the field for downstream agents_destroy_mission_field()— Cleanup on mission completion/failure_cleanup_terminal_fields()— Tick-based garbage collection
Agent Platform Tools
Three tools agents can call directly during execution:
platform_field_query
Search the field by semantic meaning
platform_field_inject
Add a finding/analysis to the field
platform_field_stability
Check field convergence metrics
Registered via the standard 3-file pattern:
modules/tools/discovery/actions_field.py— ActionDefinition registrationsmodules/tools/discovery/handlers_field.py— Handler implementationsmodules/tools/discovery/platform_executor.py— Dispatch entriesconsumers/chatbot/auto.py— Keyword routing
Configuration (config.py)
config.py)All field parameters are configurable via environment variables:
Test Results
Unit Tests — 57 passed
tests/test_vector_field.py — Mocked Qdrant + EmbeddingManager. Covers:
Decay math (11 tests) — zero age, half-life, cap boundary, scaling
Create/destroy lifecycle (8 tests)
Inject with dedup (9 tests)
Query with resonance scoring (9 tests)
Hebbian reinforcement (7 tests)
Stability measurement (7 tests)
Internal helpers (6 tests)
Integration Stress Tests — 16/16 assertions passed
tests/demo_field_stress.py — Real Qdrant (in-memory mode), real vectors, real math. No mocks.
Test 1: Resonance ranking Python ML pattern ranked in top 2 for "best language for machine learning" query. Go concurrency correctly ranked last.
Test 2: Temporal decay Fresh pattern strength: 1.0000. 24h-old pattern: 0.0907. That's 91% decay — the math works.
Test 3: Hebbian reinforcement Popular pattern (10 accesses): strength 1.50. Lonely pattern (0 accesses, 6h old): strength 0.55. Reinforcement beats decay.
Test 4: Archival threshold 72h-old pattern decayed to 0.000747 — well below the 0.05 threshold. Effectively dead.
Test 5: 50-agent stress 150 patterns (50 agents × 3 findings). 4,000 queries/sec. No degradation.
Test 6: Field stability Empty field: 0.0. 11 fresh patterns: 1.0. Mixed ages (old + new): 0.57. Stability correctly reflects field health.
Test 7: The telephone game proof Agent A injects 10 research findings. Agent B queries, references only findings 0-2, injects analysis. Agent C queries for "subtopic 7" — finds it directly, even though Agent B never mentioned it. This is the entire point. In message-passing, finding #7 would be lost. In the shared field, it's right there.
Integration Demo
tests/demo_field.py — 3-agent EU AI Act compliance scenario. Researcher → Analyst → Writer. Shows resonance ranking, Hebbian reinforcement on accessed patterns, temporal decay table, and stability measurement.
Files Changed/Created
core/ports/__init__.py
Created
Ports package init
core/ports/context.py
Created
SharedContextPort ABC
modules/context/adapters/__init__.py
Created
Adapters package init
modules/context/adapters/vector_field.py
Created
The field implementation (356 lines)
modules/tools/discovery/actions_field.py
Created
3 tool registrations
modules/tools/discovery/handlers_field.py
Created
3 tool handlers (151 lines)
modules/tools/discovery/platform_actions.py
Modified
Register field actions
modules/tools/discovery/platform_executor.py
Modified
Add field handlers to dispatch
consumers/chatbot/auto.py
Modified
Keyword routing for field tools
services/coordinator_service.py
Modified
Field lifecycle in mission coordinator
config.py
Modified
8 new FIELD_* and QDRANT_* config vars
requirements.txt
Modified
Added qdrant-client>=1.12.0
tests/test_vector_field.py
Created
57 unit tests
tests/demo_field.py
Created
Integration demo
tests/demo_field_stress.py
Created
16-assertion stress test
What This Proves
PRD-108's hypothesis: "Agents sharing a continuous semantic field produce higher-quality collaborative output than agents passing discrete messages."
Editorial comment: The implementation and tests support the claim that the mechanism works and that it improves retrieval in the scenarios tested. A stricter phrasing would avoid presenting this as fully proven across all workloads until broader A/B evaluation is complete.
The stress tests confirm the mechanics work:
Relevance surfaces by meaning, not by chain position
Time naturally filters stale information
Frequently-used knowledge persists
Cross-agent visibility is total — no information loss through intermediaries
Performance holds at scale (4,000 qps with 150 patterns)
The telephone game is dead. Agents share a brain.
Editorial comment: Strong line, but rhetorically stronger than the current evidence base. For a more defensible technical document, consider reframing this as: "In the tested scenarios, the shared field substantially reduces information loss from sequential handoff."
What's Next
Deploy Qdrant — Railway service is provisioned, env vars set on API + workers
Push to remote — Code committed locally, ready to push
E2E test — Create a real mission through the API and watch agents use the field
A/B comparison — Same mission, Redis vs Vector Field, measured on context quality and task accuracy
Phase 3 gate — Results determine whether PRDs 110-116 proceed
Last updated

