Skip to content

v6.2.0-edge.2: Rubrics, record cloning, and typed decisions across agents

Rubrics for scoring any record against published criteria, record cloning with a clone wizard and lineage in Record Changes, and typed decisions (Likelihood, Choice, Score) available to Flow agents, task graphs, Loop agents, Feature Pipelines and duplicate detection. Plus runners for embeddings, images, reranking, speech and video, and fixes to conversation delivery over dead WebSockets, vector index addressing and IS-A save rollback.

Upgrade Notes apply: eleven migrations apply on mj migrate, the release metadata replaces Entity.Configuration on 63 core entities, and GetRecordDependencies needs a server from this release.

Edge builds are prereleases.

MemberJunction 6.x is released under the Business Source License 1.1; 5.x and earlier stay ISC. What the licence grants, and what needs certification, is in the licence section of the v6 upgrade guide.

  • Rubrics: score any record against a published set of weighted criteria (@memberjunction/rubrics-base, @memberjunction/rubrics, @memberjunction/ng-rubrics, @memberjunction/core-entities, @memberjunction/testing-engine): Rubrics have versions, criteria, scales, anchors and bands. Published versions are frozen, and a raw write to a frozen row is refused. Evaluations come from LLM, agent, deterministic or human evaluators, and consensus views combine them. Actions cover evaluating a record, reading a rubric, drafting one and submitting a human score. Explorer gains a Rubrics application, rubric forms and a Rubrics tab on the agent form. Tests and suites can select a rubric through RubricID, with a rubric oracle, mj rubric and mj test promote-criteria. Seven shipped agent rubrics publish at 1.0.0 and bind to their agents. MJ: Test Rubrics is deprecated.
  • Record cloning (@memberjunction/record-cloning-base, @memberjunction/record-cloning, @memberjunction/core-actions): Copy a record together with the related records its clone configuration names, as one transaction. A clone is planned first, the plan carries a hash that execution checks, and per-field rules decide what is prompted for, excluded or reassigned. The Clone Record and Clone Records actions wrap the engine and honor DryRun; batch cloning requires the Clone Records: Batch authorization. Each clone is recorded in the new MJ: Record Clone Logs, and Clone is a Record Process work type.
  • Clone wizard on record forms (@memberjunction/ng-record-clone, @memberjunction/ng-base-forms, @memberjunction/ng-core-entity-forms): A step-by-step clone panel and slide-in, and a Clone action on the record toolbar for entities whose clone configuration is enabled. The Entities form gains a Record cloning panel that edits an entity’s clone configuration, validates it and previews a plan for a record.
  • Clone lineage in Record Changes (@memberjunction/core, @memberjunction/generic-database-provider, @memberjunction/sqlserver-dataprovider, @memberjunction/postgresql-dataprovider, @memberjunction/server): A record written by a clone gets a Record Change with Source = 'Clone' and a structured ChangeContext naming the source record and the clone log. Only the server’s cloning engine can set it; GraphQL clients cannot supply one.
  • Record Change comments (@memberjunction/core-entities-server): Record Changes can be annotated. An update may change only Comments, and requires the Record Changes: Annotate authorization as well as Update permission; any other change to an audit row is refused.
  • Typed decisions (@memberjunction/ai-prompts, @memberjunction/ai-openrouter, @memberjunction/core-actions, @memberjunction/server, @memberjunction/graphql-dataprovider): AIDecisionRunner answers Likelihood, Choice and Score questions with model selection, failover and prompt-run telemetry. The Default Decision prompt binds TypeSafe’s Jev model through OpenRouter first and LLM Decision, a chat model behind an MJ prompt, as the fallback. The Run Decision action and the RunDecision GraphQL mutation expose it to flows and to browser code.
  • Decision steps in Flow agents and task graphs (@memberjunction/ai-agents, @memberjunction/task-graph, @memberjunction/ng-flow-editor, @memberjunction/ai-agent-manager): A Decision step makes one decision call, and its outgoing paths route on the answers. An answer below its question’s minConfidence holds the path instead of reading as false, and a Choice fork must cover every option. The Flow Agent Editor authors Decision steps, and Agent Manager’s architect plans and validates them.
  • Decisions inside Loop agents, all off by default (@memberjunction/ai-agents): A master switch, decisionsEnabled, governs every use below; unless it is true, an agent never asks a decision model on its own. Behind it: inline decisions requests, finishIf gates that can end a run early (with an off / shadow / on mode), a check on unintended payload changes, a suggested agent to delegate to before the first prompt, catalog narrowing for agents with many actions or sub-agents, and a decision gate on Memory Manager notes.
  • Decision-based duplicate detection (@memberjunction/ai-vector-dupe, @memberjunction/ng-base-forms): Two reasoning modes, Decision and DecisionThenPrompt. Entities that use them flag likely duplicates on the record form while a new record is being entered; the check never blocks a save or merges. Auto-merge now also requires the candidate’s own verdict to be Merge.
  • Feature Pipeline types (@memberjunction/feature-pipelines, @memberjunction/record-set-processor, @memberjunction/ng-record-process-studio): MJ: Feature Pipeline Types catalogs pipeline types, each naming its driver. A new Decision type evaluates records with typed decisions and can escalate low-confidence records to an LLM pipeline. The pipeline builder gains a type picker and Decision constraint editors.
  • Runners for embeddings, images, reranking, speech and video (@memberjunction/ai-prompts, @memberjunction/ai-reranker, @memberjunction/ai): AIEmbeddingRunner, AIImageGenerationRunner, AIRerankerRunner, AITextToSpeechRunner, AISpeechToTextRunner and AIVideoRunner select a model from a prompt’s bindings, resolve its credential, fail over, and record each call as an AI Prompt Run, as chat prompts already did. Embedding call sites across tagging, vector sync, duplicate detection and search use the new runner, and agent memory reranking now appears in AI run history.
  • Decision reranker (@memberjunction/ai-reranker, @memberjunction/ai-agents): A Decision Reranker model scores candidate notes with typed decisions. Agents can now also rerank examples (rerankExamples, off by default), and a rerank’s cost counts toward the agent run’s totals and limits.
  • Draft emails from agents (@memberjunction/ai-core-plus, @memberjunction/ng-conversations, @memberjunction/ng-explorer-core, @memberjunction/messaging-adapters): A compose:email command opens a pre-filled draft in the user’s own mail client; nothing is sent. The button shows the draft’s recipients. Slack and Teams show a note naming the draft instead.
  • Decision Eval test type (@memberjunction/testing-engine, @memberjunction/integration-test-suite): Measures typed decisions against labels, with a scorecard for agreement, repeatability and calibration. A decision-judge oracle scores a test’s criteria as Likelihood questions.
  • Connect-only GraphQL client (@memberjunction/graphql-dataprovider): ConnectGraphQLClient gives an embed an authenticated client without the full metadata boot.
  • AI model catalog (@memberjunction/aiengine): Adds Claude Sonnet 5.5 and GPT-6.1 Sol, fills missing cost rows, re-rates several Groq, Cerebras and Z.AI models, and retires seven routes their vendors have shut down.
  • Simpler record toolbar (@memberjunction/ng-base-forms): Each user pins up to three actions as buttons, shared across every form; the rest are in a More panel, with Delete set apart. Section and layout controls and the form-variant picker move into a View panel. Both panels are keyboard-reachable. Refresh, Clone, Lists, Tags and Attachments now take two clicks unless pinned.
  • View tabs refresh when their entity changes (@memberjunction/ng-explorer-core, @memberjunction/ng-entity-viewer): An open view reloads after a local save or delete, or a server-side change such as a clone, and keeps its page, sort and filters.
  • Business Central accounting connections (@memberjunction/actions-bizapps-accounting): Accounting actions work against a connection made by the Integrations connector, accept a CompanyIntegrationID, and refuse rather than pick the first when more than one connection matches. Connector-style connections authenticate through Entra ID client credentials.
  • Open App schemas on SQL Server (@memberjunction/open-app-engine): App schemas are created owned by the core schema’s owner, so app views can read core tables without per-table grants. Upgrades check the login’s rights on the app schema before changing anything.
  • CodeGen prompts on current models (@memberjunction/codegen-lib, @memberjunction/aiengine): The seven CodeGen AI prompts move to Gemini 3.8 Flash, Gemini 3.5 Flash-Lite and GPT-6 Luna, and model ranks are made consistent within each version lineage.
  • Realtime sessions use the run’s API keys (@memberjunction/ai, @memberjunction/ai-agents): A realtime voice session started from an agent run resolves its vendor key against the run’s keys before the platform’s.
  • No third-party CDN requests at bootstrap (@memberjunction/ng-artifacts): ArtifactsModule no longer preloads React and Babel from unpkg when constructed. Explorer preloads them after login.
  • mj agent init pins its release (@memberjunction/cli): A scaffolded workspace installs the CLI’s own version, and provisioning failures are reported instead of hidden.
  • Agent replies no longer hang on a WebSocket that dies without closing (@memberjunction/graphql-dataprovider, @memberjunction/ng-conversations, @memberjunction/server, @memberjunction/redis-provider): A message sent over an unstable connection could spin forever while its answer had already been saved. The client now detects a silent socket within about 14 seconds and reconnects, reconciles messages over HTTP, and shows when a reply is stalled. Status updates reach the browser across server replicas through Redis, and a background job closes conversation messages left in progress by a run that already ended.
  • Vector indexes are addressed by their provider-side name (@memberjunction/ai-engine-base, @memberjunction/ai-vector-sync, @memberjunction/ai-vector-dupe, @memberjunction/search-engine): Vectorization, duplicate detection and search passed the MJ display name, so an index whose label differed from its provider name failed on every upsert and query.
  • Vector search on Simple Vector Service indexes (@memberjunction/search-engine): Searching the shipped default local index failed with a uniqueidentifier conversion error.
  • Vectorizing into a colocated vector database (@memberjunction/ai-vectors): SQL Server 2025 VECTOR and colocated pgvector upserts failed with “requires a host connection” when the syncer was built without a provider.
  • Records created by another process resolve for vectorization (@memberjunction/content-autotagging): A record created after a worker booted was reported missing because a stale engine cache answered for it, so its content could not be embedded.
  • A failed IS-A chain save or delete leaves every level as it was (@memberjunction/core): After a rollback, parent records still read as saved, so a retry updated a row that no longer existed or skipped the parent’s edit.
  • Templates form saves its content (@memberjunction/ng-core-entity-forms): Creating or editing a Template saved the template and silently dropped the content typed into its editor.
  • Rendered text in EntityRecordDocument.DocumentText (@memberjunction/ai-vector-sync): The column held the raw template source instead of the text that was embedded.
  • Date-only values show their stored day (@memberjunction/ng-query-viewer, @memberjunction/ng-record-changes, @memberjunction/ng-timeline, @memberjunction/export-engine): A SQL date read as the previous day west of Greenwich in the query viewer, change history and timeline, and now exports as YYYY-MM-DD.
  • Cohere reranking (@memberjunction/ai-cohere): Every Cohere rerank failed because the driver was not registered under its model’s driver class.
  • Users form shows assigned roles (@memberjunction/ng-core-entity-forms): The Assigned Security Roles panel always showed “0 Roles”.
  • Realtime sessions from magic-link users save their hidden turns (@memberjunction/server, @memberjunction/ai-agents): Tool-execution and artifact-anchor turns were refused because they were written as the system user.
  • CodeGen finishes a config-declared virtual entity in one run (@memberjunction/codegen-lib): Composite keys and foreign keys declared under VirtualEntities were dropped, and keys, relationships and types appeared only after a second run.
  • Memory leaks in realtime sessions and process shutdown (@memberjunction/ai-agents, @memberjunction/code-execution, @memberjunction/ai-agent-harness): Three process-lifetime caches grew with every realtime session or meeting room, and a killed child process was never escalated to SIGKILL.
  • Installer reports a healthy pnpm install as healthy (@memberjunction/installer): The post-CodeGen check failed because pnpm does not link generated entities at the repo root.
  • mj agent init --skip-docker-check starts the stack (@memberjunction/cli): The flag previously treated Docker as unavailable.
  • PostgreSQL migration conversion (@memberjunction/sql-converter, @memberjunction/cli, @memberjunction/codegen-lib): mj migrate convert now converts BIT literals in INSERT … SELECT and COALESCE comparisons, and the PostgreSQL view-regeneration fallback restores dependents of dependents after DROP … CASCADE.
  • Keyboard-operable query splitter and integration entity maps (@memberjunction/ng-dashboards): Both were mouse-only.
  • Eleven migrations apply on mj migrate: Feature Pipeline types; Decision values for entity document reasoning, agent steps and tasks; Record Change clone context; record clone logs; the Rubrics schema and views; and the release metadata sync.
  • Entity.Configuration is replaced on 63 core entities (@memberjunction/core-entities): The release metadata sets it to { "Clone": … } on the entities listed in metadata/entities/.clone-configurations.json, and metadata sync writes the whole field. Any Configuration an administrator added to one of them since 6.1 (for example UI.Form or Attachments settings) is replaced. Check those entities before upgrading and re-apply your settings afterwards, merged with the new Clone key.
  • A database with bizapps-common 5.47 installed cannot upgrade yet (@memberjunction/ai-prompts): MJ core retires the “Job Function and Seniority Derivation” prompt that common also ships, but an earlier 6.2 migration collides with common’s prompt model first. Do not delete common’s prompt model to get past it. Tracked in #4939.
  • GetRecordDependencies needs a server from this release (@memberjunction/server, @memberjunction/graphql-dataprovider): The client now reads PrimaryKey, which older servers do not return. The old CompositeKey field stays as a deprecated alias for older clients.
  • Deploy the server with or before the client (@memberjunction/server, @memberjunction/graphql-dataprovider): The client’s idle window drops to three minutes to match the server’s new 60-second liveness pulse; a new client against an old server times out between pulses.
  • PayloadFeedbackManager.QueryAgent takes a PayloadFeedbackContext (@memberjunction/ai-agents): Its second parameter was an unread conversation record. Pass the step’s reasoning, message and agent ID instead.
  • Conversation-routing builders moved (@memberjunction/ai-core-plus): Import them, and IsAgentAllowed, from @memberjunction/ai-core-plus instead of @memberjunction/ng-conversations.
  • Review regenerated CodeGen output (@memberjunction/codegen-lib): With the CodeGen prompts on new models, apps that regenerate may get different AI-written validators, descriptions and form layouts. Prompts and agents that choose models by rank may also pick a different model.