LCJ stands for Lightweight Candidate Journal. Nova uses it as a compact journal for learning-relevant events and candidates: evidence that may become useful, but is not trusted long-term knowledge yet.
LCJ records what happened during real agent work on websites: tool outcomes, observations, repeated blockers, selector drift, navigation patterns, and short learning claims that can be reviewed later.
LCJ feeds ALP. ALP can only suggest, generate, promote, or reject learning when enough real evidence exists. PKS stays reserved for reviewed website knowledge that has passed the learning gates.
Most LCJ evidence appears automatically while normal Nova tools run. Agents and integrators use LCJ directly only when they need memory statistics or want to add an explicit candidate inside a claimed work context.
In short
- LCJ stores learning evidence, not executable guidance.
- Normal tool work creates most LCJ observations automatically.
- Manual candidates require a claimed target context.
- Candidates use the states unverified, verified, or disproven.
- Verified candidates can become promotable only after enough evidence.
- LCJ never replaces current-page confirmation or safety gates.
What LCJ records
LCJ keeps the raw material that later learning decisions need. It records evidence before that evidence becomes handbook-like guidance.
- Tool events LCJ can keep whether a tool succeeded, failed, how long it took, and which website context mattered. This lets later review distinguish a real success from a guessed claim.
-
Observations
Observations describe meaningful signals such as
action_success,action_failure,blocker_dismissed,selector_drift,perceive_signatureortelemetry_confirmed. -
Candidates
A candidate combines
component,claim,statusandconfidence. It says what might be worth learning without making it active knowledge. - Evidence strength Finalize review separates weak, medium, and strong evidence. A verified candidate becomes promotable only when its evidence score reaches the promotion threshold.
-
Statistics
Memory statistics expose LCJ counts, verification rates, curation rates, finalize/outbox health, and rollout-readiness signals through
nova.memory_stats. - Learning history Promotion and feedback events keep the decision path visible, so later agents can understand why a candidate moved forward, stalled, or was rejected.
When this matters
Use LCJ when repeated website work should leave evidence behind: recurring consent dialogs, selectors that fail and recover, repeated form patterns, fragile navigation paths, action outcomes that should be reviewed, or task evidence that may become reusable guidance later.
Knowledge model for agents
For an agent, LCJ answers four questions: where did the evidence happen, what claim is being made, how mature is that claim, and what must be reviewed before it can affect future work?
- Work context
- Manual candidates are tied to a claimed target. Without a current
nova.tab_claimcontext, an agent cannot add LCJ candidates safely. - Observation
- A normalized learning signal from real work, such as a successful action, failure, blocker, drift signal, or page signature.
- Candidate
- A short reusable claim that may become useful after evidence and review. It is still a candidate, not trusted knowledge.
- Component
- The category key in
component. It groups related candidates such as a blocker, navigation pattern, automation lock, or UI behavior. - Status
unverifiedis the default state,verifiedmeans supporting evidence exists, anddisprovenrecords evidence against the claim.- Confidence
- A score from
0.0to1.0. It helps rank the candidate, but it does not make the candidate executable. - Finalize stats
finalizeStatsreports how many LCJ candidates were considered, verified, promotable, or prepared for curated knowledge writes when a work context is finalized.- Memory statistics
nova.memory_statsreads LCJ, finalize, outbox, and runtime learning metrics for a chosen time window.
How agents use LCJ information
LCJ is a journal, not a shortcut. The agent first creates or uses real evidence, then reads or writes small candidate signals, and lets ALP decide what should become durable knowledge.
-
Claim the work context
An agent claims the relevant tab with
nova.tab_claim. This binds manual LCJ candidates to the right target and owner. -
Let normal work create evidence
Browser tools such as
nova.perceive,nova.click_selectorornova.type_selectorproduce outcomes that can become LCJ observations. -
Add explicit candidates sparingly
When a reusable pattern is clear, an agent or integration can call
nova.memory_add_candidatewith a concretecomponentand shortclaim. -
Inspect memory health
nova.memory_statsreturns windowed LCJ counts, verification rates, curation rates, finalize decisions, outbox status, and selected runtime learning health signals. -
Let ALP review the evidence
ALP tools such as
nova.learn_suggest,nova.learn_generateandnova.learn_feedbackturn LCJ evidence into reviewed learning decisions. -
Finalize without turning evidence into action
finalizeStatscan summarize LCJ candidates when a claim context is released. The summary can prepare review or promotion, but it does not execute website actions.
When LCJ evidence applies
LCJ state describes evidence maturity. It can make a pattern visible, but only promoted PKS knowledge may guide future work, and even then only after the current page confirms the situation.
context_missing
- Meaning
- The target is not claimed for the current agent, so manual candidate writes cannot be attributed safely.
- Evidence required
- No active
nova.tab_claimcontext for the target. - Agent behavior
- Claim the tab first, or keep working without adding manual candidates.
- May guide action
- No.
tool event
- Meaning
- A real tool outcome or page signal has been recorded as learning evidence.
- Evidence required
- Tool outcome, context, kind, outcome, severity, and optional selector or candidate key.
- Agent behavior
- Treat as raw evidence. Look for repetition before proposing knowledge.
- May guide action
- No.
unverified
- Meaning
- A reusable claim exists, but it has not been confirmed strongly enough for promotion.
- Evidence required
- Required fields:
targetId,componentandclaim. Defaultconfidence=0.65. - Agent behavior
- Gather more evidence or wait for ALP review.
- May guide action
- No.
verified
- Meaning
- Supporting evidence exists for the claim. The candidate can be considered in finalize and ALP review.
- Evidence required
- Status
verifiedplus supporting tool or resolution evidence. - Agent behavior
- Review the evidence and allow ALP to decide whether promotion is appropriate.
- May guide action
- No.
disproven
- Meaning
- Evidence speaks against the claim, so it should not be promoted as useful knowledge.
- Evidence required
- Status
disprovenor contradicting outcomes. - Agent behavior
- Avoid promotion. Replace only with fresh evidence and a new review path.
- May guide action
- No.
evidenceScore >= 1.45
- Meaning
- A verified candidate has enough combined evidence to be proposed for promotion review.
- Evidence required
- Source evidence, resolution evidence, verification timestamp, high-signal success, recovery from errors, and confidence can raise the score.
- Agent behavior
- Pass through ALP/PKS promotion. Do not apply it directly from LCJ.
- May guide action
- No.
after promotion
- Meaning
- Knowledge has moved beyond LCJ and can appear as reviewed PKS orientation.
- Evidence required
- Promotion or curated write after review, not merely a candidate row.
- Agent behavior
- Use as orientation and confirm the current page before acting.
- May guide action
- Yes, after visible confirmation and normal safety gates.
Failure and guard conditions
These are the hard edges an agent or integration should expect from LCJ-facing MCP tools.
| Condition | Observed signal | Agent behavior |
|---|---|---|
| Unknown argument | nova.memory_add_candidate and nova.memory_stats reject unknown top-level properties. |
Send only the documented fields for the selected tool. |
| No claimed work context | nova.memory_add_candidate returns lcj.context_missing when the target tab is not claimed. |
Claim the tab with nova.tab_claim before adding manual candidates. |
| Missing required candidate fields | targetId, component and claim are required by the published schema. Empty component or claim is rejected. |
Use a concrete target, a compact category key, and a one-line learning claim. |
| Candidate field too long | component is capped at 64 characters; claim is capped at 280 characters. |
Shorten the category or split the claim into a clearer candidate. |
| Invalid candidate status | status must be unverified, verified or disproven. |
Use the closest supported evidence state; do not invent intermediate states. |
| Confidence outside range | confidence must be finite and between 0.0 and 1.0. |
Clamp in the caller before sending, and keep weak claims near the default. |
| Confidence compatibility | Schema-conformant clients should send confidence as a JSON number. Runtime may tolerate numeric strings for agent compatibility. |
Prefer typed JSON values and do not rely on string coercion for new integrations. |
| Memory stats integer outside bounds | windowHours must be 1-720; topComponents, maxSkipReasons, topRoutes, topHosts and topSelectors must be 1-20. |
Lower the requested window or result counts and retry. |
| Memory stats wrong type | Statistics limit fields must be JSON integers. Component filters must be strings or null. | Send typed JSON values, not stringified integers. |
| Finalize stats malformed | finalizeStats must be an object when provided during release/finalize. |
Provide known metric fields as numbers, or omit the object. |
Agent interpretation example
The example shows LCJ as an evidence contract: the agent writes a short candidate, reads the returned identifiers, and still waits for review before treating it as guidance.
Candidate request
{
"tool": "nova.memory_add_candidate",
"arguments": {
"targetId": "active",
"agentId": "default",
"component": "consent-dialog",
"claim": "Consent banner disappears after clicking the footer reject link.",
"status": "unverified",
"confidence": 0.65
}
}
Relevant response fields
{
"structuredContent": {
"ok": true,
"targetId": "tab_12",
"taskId": "claim_4f9d",
"ownerAgentId": "default",
"candidateId": 42,
"created": true,
"status": "unverified",
"confidence": 0.65,
"updatedAtUtc": "2026-05-07T10:30:00.0000000Z"
}
}
Agent interpretation
{
"treatAs": "learning evidence candidate",
"mayExecute": false,
"beforePromotion": "gather repeated evidence and review through ALP",
"beforeUse": "only promoted PKS knowledge may guide action, and only after current-page confirmation"
}
MCP contract
This is the deterministic layer under the explanation. It describes LCJ fields that agents and integrators should read as contract signals, not as free-form documentation prose.
Execution rule: No LCJ field may trigger a website action; LCJ evidence must pass ALP/PKS review and current-page confirmation before it can guide behavior.
| Variable | Type / values | Default | Effect |
|---|---|---|---|
nova.tab_claim |
MCP tool; Args: targetId, agentId, agentRole, ttlMs, debugLabel, reclaimReason | targetId active; agentId default; ttlMs bounded by claim policy | Claims a tab for the current agent context and returns claim state including finalizationToken, leaseMs, ttlMs, and ownership data. |
nova.tab_release |
MCP tool; Args: targetId, agentId, finalizationToken, finalizeDecision, finalizeReasonCode, finalizeReasonText, coverageExhausted, coverageExhaustedReason, finalizeOutboxJobType, finalizeOutboxPayload, finalizeStats | finalizationToken required for finalizeDecision override | Releases or finalizes the claimed context and returns releaseState, releaseAuthorization, hadActiveClaim, released, finalized, and learning/finalize summary fields. |
nova.memory_add_candidate |
MCP tool; Args: targetId, agentId, component, claim, status, confidence | requires claimed target context | Adds or updates a lightweight LCJ candidate for a claimed task/tab. |
targetId |
string; tab id, sandbox id, active | required by schema | Selects the claimed target context for the candidate. |
agentId |
string | default | Identifies the calling agent and must match the claim owner. |
component |
string; max 64 chars | required | Groups the candidate under a compact category key; stored normalized to lowercase. |
claim |
string; max 280 chars | required | One-line reusable learning claim. |
status |
unverified | verified | disproven | unverified | Defines whether the candidate is fresh evidence, supported, or contradicted. |
confidence |
number 0.0-1.0 | 0.65 | Ranks candidate strength without granting execution permission. |
candidateId / created / updatedAtUtc |
integer; boolean; ISO timestamp | returned | Identifies whether the candidate was created or updated and when it changed. |
taskId / ownerAgentId |
string; string | returned | Shows the LCJ work context and owning agent that received the candidate. |
nova.memory_stats |
MCP tool; Args: windowHours, topComponents, maxSkipReasons, topRoutes, topHosts, topSelectors, componentFilter | 24h window; top values 8 | Reads LCJ, finalize, outbox, and runtime learning metrics. |
windowHours |
integer 1-720 | 24 | Lookback window for windowed memory statistics. |
topComponents |
integer 1-20 | 8 | Limits returned LCJ component groups. |
maxSkipReasons |
integer 1-20 | 8 | Limits finalize skip-reason buckets. |
topRoutes |
integer 1-20 | 8 | Limits route groups in runtime learning statistics. |
topHosts |
integer 1-20 | 8 | Limits host groups in runtime learning statistics. |
topSelectors |
integer 1-20 | 8 | Limits selector groups in runtime learning statistics. |
componentFilter |
string | null | null | Filters LCJ candidate and curation aggregates to one normalized component key. |
structuredContent.kpis |
rates and health counters | computed | Summarizes commit, verification, curation, outbox, and runtime readiness rates. |
structuredContent.lcj |
toolEvents*, candidates*, curated*, topComponentsWindow | computed | Reports LCJ event, candidate, verification, disproven, and curation counts. |
structuredContent.finalize |
decisions*, outbox*, skipReasonsWindow | computed | Reports finalize decisions, commit/skip counts, outbox health, and skipped-promotion reasons. |
scrollSmart / clickNavigation / dismissBlockers / screenshotCapture / rolloutDecision |
runtime statistics objects | computed | Shows selected runtime learning health signals that memory statistics expose beside LCJ. |
finalizeStats |
object | optional during release/finalize | Carries LCJ candidate metrics when a claimed context is finalized. Must be an object when provided. |
finalizeStats.candidatesTotal / candidates_total |
integer | optional | Total LCJ candidates considered during finalize planning. |
finalizeStats.candidatesVerified / candidates_verified |
integer | optional | Verified LCJ candidates at finalize time. |
finalizeStats.candidatesPromotable / candidates_promotable |
integer | optional | Verified candidates that looked promotable into long-term memory. |
finalizeStats.curatedUpserts / curated_upserts |
integer | optional | Curated knowledge writes prepared or emitted from verified candidates. |
finalizeStats.evidenceMinScore / evidence_min_score |
number | optional | Lowest evidence score among considered candidates. |
finalizeStats.evidenceAvgScore / evidence_avg_score |
number | optional | Average evidence score across considered candidates. |
Agent Tools
MCP tools for agents. These variables and tool names are intended for agents and integrators. They are not normal user controls in the interface.
| Variable | Meaning |
|---|---|
nova.tab_release |
Releases a claimed tab and can carry finalize statistics for the LCJ work context. |
nova.memory_stats |
Review learning-memory statistics |
nova.memory_add_candidate |
Record an explicit learning candidate |
nova.learn_suggest |
Reads accumulated LCJ observations and ranks learning opportunities for ALP review. |
nova.learn_generate |
Turns reviewed LCJ opportunities into candidate proposals for PKS or domain hints. |
nova.learn_promote |
Move reviewed knowledge toward active use |
nova.learn_feedback |
Shows recent learning and promotion events that came out of LCJ/ALP review. |
nova.tab_claim |
Claims a target tab so manual LCJ candidates can be attributed to the right work context. |