flowbrain_core 0.1.5
flowbrain_core: ^0.1.5 copied to clipboard
FlowBrain Core — Judgment & Knowledge core for the MakeMind ecosystem. Two cooperating subsystems: Knowledge (5 facades over a 4-layer Fact/Skill/Profile/Philosophy structure plus Ops) and Agent (work [...]
0.1.5 - 2026-06-23 - FlowBrain runtime wiring (spec 12 §2·§3·§3b·§4·§4b) #
Changed (behavior — additive, no API change) #
- §2 — 4-axis ask composition:
AgentRuntime.asknow composes all 4 assigned axes (profile · philosophy · skill · facts), not facts alone (specplatform/12-flowbrain-runtime.md§2). Order: profile (persona) → philosophy (values/prohibitions) → skill → facts. Facts keep rich_factLine; non-facts axes render defensively from their owned-fork payload (live object viatoJson, or JSONMap) so no hidden Knowledge-Subsystem type is imported — 20 items/axis cap. None assigned → prompt identical (regression-safe). - §3 enforcement proven end-to-end (real engine, not stub):
test/agent/25_philosophy_prohibition_enforcement_test.dartwires a realPhilosophyEngineover a seeded ethos store and provesaskactually blocks an output hitting a hard prohibition and delivers a clean one — viaProhibition.forbiddenPatterns(mcp_bundle 0.4.4 + mcp_philosophy 0.1.2's deterministic_detectViolation). This closes the gap that TEST-24's always-block stub masked: the structural evaluator previously caught only two hardcoded NL shapes and silently fell open for every other prohibition. Runtime requirement: mcp_philosophy ≥ 0.1.2 for the deterministic path to actually block (resolved transitively viamcp_knowledgecaret; semantic NL judgment remains an LLM seam — spec §3.1). - §3 — Philosophy work-time intervention:
AgentRuntime.asknow runs the assigned Philosophy's post-generation gate over the LLM output before delivery — a hard prohibition throwsAgentPhilosophyBlockedException(turn not appended/delivered), soft modifications adjust the text. Opt-in: no assigned philosophy or no engine → skipped (the existing-suite agents are unaffected). Fails open on engine error. (InterventionPoint/PipelineContext/InterventionResultcome frommcp_bundle— flowbrain's own direct dep; no new dependency.)detectTensionsat the fork-evolution boundary is a separate follow-up. - §4 — outcome→knowledge loop (philosophy):
AgentRuntime.reviewnow feeds the reviewer verdict back as a PhilosophyFeedbackEvent→proposeFeedback(pass→positive · fail→negative · revise→mixed). The proposal is human-gated and never auto-applied (facade only emitsEvolutionProposedEvent; gated byenableEvolution). Opt-in (target has assigned philosophy + engine available); fails open.AgentPhilosophyBlockedExceptionadded (agent_exception.dart). (Other axes already accumulate: facts write + profile growth counters; theFeedbackEventwire was the missing outcome→proposal call-site.detectTensionsat fork-evolution = follow-up.) - §4b — skill refinement path:
AgentRuntime.reviewnow, on a deficient verdict (fail/revise), records a skill variation candidate per assigned skill fork viaGrowthTracker.trackVariation(GrowthKind.variation→skillCandidateCountaccumulator +AgentForkEvolvedEvent+ FactGraph timeline). Apassverdict means the skill worked as-is → no candidate. This completes the §4 four-axis loop (philosophy reinforcement + skill refinement + facts/profile already accumulating). Reuses the existing growth mechanism — no new model. Opt-in (target has an assigned skill); fails open. - §3b — Philosophy fork-evolution drift anchor:
AgentRuntime.reviewnow, at the fork-evolution boundary (a review verdict is the outcome that evolves the target's non-philosophy axes), calls the assigned Philosophy'sdetectTensions(MultiLayerContext)over the agent's evolving profile + facts-provenance, emittingAgentForkTensionDetectedEvent(count + max severity + descriptions) when tensions are found. Philosophy is the only axis that governs the other three — this surfaces drift so a host can flag/hold an evolution that would leave the constitution. Opt-in (target has assigned philosophy); advisory (emit, no auto-revert); no-op when the adapter doesn't implementdetectTensions(UnsupportedErrorcaught); fails open. (MultiLayerContext/PhilosophyEvaluationContext/Tensionfrommcp_bundle— direct dep, no new dependency.)AgentForkTensionDetectedEventadded (agent_event.dart). - No public API change (additive). Tests:
test/agent/24_assigned_axes_in_prompt_test.dart(profile compose · philosophy block · opt-in pass-through · fork tension emit · opt-in no-tension) +22_*(facts) + skill-refinement candidate (§4b) + §3 prohibition enforcement (TEST-25, real engine). 150 PASS · analyze 0.
Changed (dependency floor) #
mcp_bundle^0.4.3→^0.4.4— internal-dep latest (0.4.4 hardens the Ethos object-graphfromJsonwith field-named validation). flowbrain_core consumes the ethos via the philosophy port; no new symbol required, constraint kept current.mcp_knowledge^0.2.4→^0.2.5— propagates the §3 prohibition-enforcement guarantee: mcp_knowledge 0.2.5 floorsmcp_philosophy ^0.1.2(deterministicforbiddenPatternsenforcement). Flooring it here ensures flowbrain's resolution actually carries the enforcing engine rather than relying on caret-resolves-to-latest — the §3 gate (TEST-25) is hollow without mcp_philosophy ≥ 0.1.2.
0.1.4 - 2026-06-14 - assigned facts compose into ask prompt #
Changed (behavior — additive, no API change) #
AgentRuntime.asknow composes the agent's assigned facts (set viaassignFacts/bk.agent.assign_facts, stored underAgentAxis.facts) into the system prompt: basesystemPromptfirst, then an## Assigned knowledge (facts)section. Previouslyaskpassed only the basesystemPrompt, so assigned facts never reached the provider — a per-agent-knowledge-scoping gap (agent answered "I don't have that fact"). Facts are read from the agent's eagerOwnedForkpayload (handles liveOwnedForkand persistent JSONMapforms), capped at 50 lines. No assigned facts → prompt identical to before (regression-safe). No public API change. Tests:test/agent/22_assigned_facts_in_prompt_test.dart(in-memory + persistent JSON-KV round-trip).
Changed (dependency floor) #
mcp_bundle^0.4.0→^0.4.3— guaranteesFactRecord.toJson/fromJson. Without it, assigned facts persisted via a persistentKvStoragePortserialize to"Instance of 'FactRecord'"(toString) and the compose above yields nothing — the fix only works end-to-end with serializableFactRecord. (In-memory KV worked regardless.)
0.1.3 #
Added #
AgentFacade.ask/AgentRuntime.askgain an optionalresetContextflag (defaultfalse). Whentrue, the agent's conversation history is cleared before the prompt is composed — for manager agents whose every turn should be treated fresh (bounds context growth, avoids stale prior-turn pollution that weakens the current directive). The post-ask turn is still appended; the reset is one-shot.
Changed (dependency floor) #
mcp_knowledge^0.2.3→^0.2.4— raises the floor so the re-exportedOpsFacadeis guaranteed to carry the behavior-execution methods (runBehavior/resumeBehavior/listBehaviors, added in mcp_knowledge 0.2.4). flowbrain_core's own code is otherwise unchanged; this guarantees the capability for consumers (e.g. brain_kernel) that reach behavior throughsystem.ops. Consumers should bump to^0.1.3.
0.1.2 #
Changed (cascade) #
mcp_bundlecaret bumped from^0.3.2to^0.4.0(mcp_bundle 0.4.0UiSection.pagesspec realignment).mcp_knowledgecaret bumped from^0.2.2to^0.2.3(sibling cascade).
flowbrain_core does not touch UiSection.pages directly — caret-only cascade. Consumers should bump to ^0.1.2.
0.1.1 #
Dependencies #
mcp_bundle: ^0.3.1→^0.3.2— cascade alignment to pick upMcpBundle.factGraphSectionwire (additive — fact instance round-trip slot alongside the existingfactGraphSchematype catalogue).mcp_knowledge: ^0.2.1→^0.2.2— same cascade.
No code changes in flowbrain_core itself.
0.1.0 #
Initial release.
- Knowledge Subsystem — five facades (
facts,skill,profile,philosophy,ops) wrapped frommcp_knowledge0.2.x. Four-layer knowledge structure (L0 FactGraph → L1 Skill → L2 Profile → L3 Philosophy) plus Ops, with default L0 auto-wiring andInfraPorts.inMemory()smoke infrastructure. - Agent Subsystem — flowbrain-native, fully on-package:
- Self-contained agents — own LLM context, own model (
ModelSpec), own forked 4-axis instances. - Three roles via
AgentRole—worker/manager/reviewer. - 4-axis fork assignment from workspace pool or from another already-evolved agent (
PoolForkSource/AgentForkSource) acrossskill·profile·philosophy·facts. agents.ask/agents.streamfor conversation,agents.routefor manager dispatch,agents.reviewfor reviewer evaluation.- Growth Tracker records evolution kinds (variation / adjustment / revision / accretion) per agent.
- Conversation Store with
getHistory(limit).
- Self-contained agents — own LLM context, own model (
- Event bus —
system.eventBus.stream(broadcastStream<KnowledgeEvent>); domain-typed agent events (AgentCreatedEvent,AgentDeletedEvent, …). - Stub LLM —
StubLlmPortauto-wired byKnowledgeSystem.withAgents()when no provider is supplied; deterministic short replies for tests / smoke runs. - Public surface — single barrel import
package:flowbrain_core/flowbrain_core.dartexposes:KnowledgeSystem(defaults / stub / withAgents factories)KnowledgeConfig+ 9 sub-configsInfraPorts+ standard infrastructure port interfacesAgentFacade+Agent/AgentReply/AgentRole/AgentAxis/ModelSpec/RoutingDecision/ReviewResult/ReviewVerdict/GrowthKind/ConversationTurn- Philosophy domain helper exceptions and result types
- Examples —
example/flowbrain_example.dart,example/multi_role.dart,example/lifecycle_events.dart. All run end-to-end against the stub LLM with no external services.