sneakoscope 0.7.78 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
1
  import path from 'node:path';
2
2
  import { appendJsonlBounded, nowIso, readJson, readText, writeJsonAtomic, writeTextAtomic, exists } from './fsx.mjs';
3
3
  import { OUTCOME_RUBRIC } from './proof-field.mjs';
4
+ import { RESEARCH_SCOUT_PERSONA_CONTRACT, validateResearchScoutPersonas } from './recallpulse.mjs';
4
5
 
5
6
  export const RESEARCH_PAPER_ARTIFACT = 'research-paper.md';
6
7
  export const RESEARCH_SOURCE_SKILL_ARTIFACT = 'research-source-skill.md';
@@ -16,43 +17,11 @@ export const RESEARCH_PAPER_SECTION_GROUPS = Object.freeze([
16
17
  ['references', 'sources']
17
18
  ]);
18
19
 
19
- export const RESEARCH_SCOUT_COUNCIL = Object.freeze([
20
- {
21
- id: 'einstein',
22
- label: 'Einstein lens',
23
- role: 'first_principles_reframer',
24
- mandate: 'Reframe the problem around invariants, constraints, symmetry, and thought experiments.',
25
- required_outputs: ['eureka_moment', 'assumptions_to_remove', 'invariant_or_simplifying_frame', 'decisive_thought_experiment']
26
- },
27
- {
28
- id: 'feynman',
29
- label: 'Feynman lens',
30
- role: 'explanation_experimentalist',
31
- mandate: 'Reduce the idea to a teachable mechanism, toy example, and cheap empirical probe.',
32
- required_outputs: ['eureka_moment', 'plain_language_mechanism', 'toy_model', 'cheap_probe']
33
- },
34
- {
35
- id: 'turing',
36
- label: 'Turing lens',
37
- role: 'formalization_and_adversarial_cases',
38
- mandate: 'Formalize inputs, outputs, algorithms, computability limits, and adversarial countercases.',
39
- required_outputs: ['eureka_moment', 'formal_definition', 'algorithmic_shape', 'edge_or_adversarial_case']
40
- },
41
- {
42
- id: 'von_neumann',
43
- label: 'von Neumann lens',
44
- role: 'systems_strategy_scout',
45
- mandate: 'Map system dynamics, strategic incentives, scaling behavior, and worst-case interactions.',
46
- required_outputs: ['eureka_moment', 'system_model', 'strategic_or_scaling_risk', 'robustness_condition']
47
- },
48
- {
49
- id: 'skeptic',
50
- label: 'Skeptic lens',
51
- role: 'counterevidence_scout',
52
- mandate: 'Find disconfirming sources, replication risks, base-rate failures, and claims that should be weakened.',
53
- required_outputs: ['eureka_moment', 'counterevidence', 'base_rate_or_failure_mode', 'claim_to_downgrade']
54
- }
55
- ]);
20
+ export const RESEARCH_SCOUT_COUNCIL = Object.freeze(RESEARCH_SCOUT_PERSONA_CONTRACT.map((scout) => Object.freeze({
21
+ ...scout,
22
+ label: scout.display_name,
23
+ required_outputs: scout.required_outputs
24
+ })));
56
25
 
57
26
  export const RESEARCH_SOURCE_LAYERS = Object.freeze([
58
27
  {
@@ -248,7 +217,7 @@ export function researchPlanMarkdown(plan) {
248
217
  if (plan.research_council?.scouts?.length) {
249
218
  lines.push('## Genius Scout Council');
250
219
  lines.push(`Policy: ${plan.research_council.policy}`);
251
- for (const scout of plan.research_council.scouts) lines.push(`- ${scout.id}: ${scout.role} - ${scout.mandate}`);
220
+ for (const scout of plan.research_council.scouts) lines.push(`- ${scout.display_name || scout.label || scout.id}: ${scout.persona || scout.role} - ${scout.mandate} (${scout.persona_boundary || 'persona-inspired lens only'})`);
252
221
  lines.push('');
253
222
  }
254
223
  if (plan.web_research_policy) {
@@ -315,7 +284,8 @@ export function countGeniusOpinionSummaries(text = '') {
315
284
  const lower = String(text || '').toLowerCase();
316
285
  return RESEARCH_SCOUT_COUNCIL.filter((scout) => {
317
286
  const label = String(scout.label || '').toLowerCase();
318
- return lower.includes(String(scout.id || '').toLowerCase()) || (label && lower.includes(label));
287
+ const display = String(scout.display_name || '').toLowerCase();
288
+ return lower.includes(String(scout.id || '').toLowerCase()) || (label && lower.includes(label)) || (display && lower.includes(display));
319
289
  }).length;
320
290
  }
321
291
 
@@ -399,9 +369,15 @@ export function defaultScoutLedger(plan = null) {
399
369
  created_at: nowIso(),
400
370
  scouts: scouts.map((scout) => ({
401
371
  id: scout.id,
372
+ display_name: scout.display_name || scout.label || scout.id,
373
+ historical_inspiration: scout.historical_inspiration || null,
374
+ persona: scout.persona || scout.role,
375
+ persona_boundary: scout.persona_boundary || 'persona-inspired cognitive lens only; do not impersonate the historical person',
402
376
  role: scout.role,
403
377
  mandate: scout.mandate,
404
378
  effort: 'xhigh',
379
+ reasoning_effort: 'xhigh',
380
+ service_tier: scout.service_tier || 'fast',
405
381
  eureka: {
406
382
  exclamation: 'Eureka!',
407
383
  idea: '',
@@ -411,7 +387,8 @@ export function defaultScoutLedger(plan = null) {
411
387
  query_set: [],
412
388
  findings: [],
413
389
  falsifiers: [],
414
- cheap_probes: []
390
+ cheap_probes: [],
391
+ challenge_or_response: ''
415
392
  })),
416
393
  synthesis: {
417
394
  surviving_claims: [],
@@ -532,6 +509,8 @@ export async function evaluateResearchGate(dir) {
532
509
  const scoutLedger = await readJson(path.join(dir, 'scout-ledger.json'), null);
533
510
  const debateLedger = await readJson(path.join(dir, 'debate-ledger.json'), null);
534
511
  const falsificationLedger = await readJson(path.join(dir, 'falsification-ledger.json'), null);
512
+ const geniusSummaryText = geniusSummaryPresent ? await readText(path.join(dir, RESEARCH_GENIUS_SUMMARY_ARTIFACT), '') : '';
513
+ const personaValidation = validateResearchScoutPersonas(scoutLedger || {}, geniusSummaryText);
535
514
  const sourceEntries = Array.isArray(sourceLedger?.sources) ? sourceLedger.sources.length : 0;
536
515
  const counterEvidenceEntries = Array.isArray(sourceLedger?.counterevidence_sources) ? sourceLedger.counterevidence_sources.length : 0;
537
516
  const webSearchPasses = Math.max(Number(gate.web_search_passes || 0), Number(sourceLedger?.web_search_passes || 0));
@@ -571,6 +550,7 @@ export async function evaluateResearchGate(dir) {
571
550
  if (Math.max(Number(gate.independent_scouts || 0), independentScouts) < RESEARCH_SCOUT_COUNCIL.length) reasons.push('independent_scouts_missing');
572
551
  if (Math.max(Number(gate.xhigh_scouts || 0), xhighScouts) < RESEARCH_SCOUT_COUNCIL.length) reasons.push('scout_effort_not_xhigh');
573
552
  if (Math.max(Number(gate.eureka_moments || 0), eurekaMoments) < RESEARCH_SCOUT_COUNCIL.length) reasons.push('eureka_missing');
553
+ if (!personaValidation.ok) reasons.push(...personaValidation.issues.map((issue) => `scout_persona:${issue}`));
574
554
  if (Math.max(Number(gate.scout_findings || 0), scoutFindings) < 4) reasons.push('scout_findings_missing');
575
555
  if (Math.max(Number(gate.debate_participants || 0), debateParticipants) < RESEARCH_SCOUT_COUNCIL.length) reasons.push('debate_participants_missing');
576
556
  if (Math.max(Number(gate.debate_exchanges || 0), debateExchanges) < RESEARCH_SCOUT_COUNCIL.length) reasons.push('debate_exchanges_missing');
@@ -601,6 +581,8 @@ export async function evaluateResearchGate(dir) {
601
581
  independent_scouts: Math.max(Number(gate.independent_scouts || 0), independentScouts),
602
582
  xhigh_scouts: Math.max(Number(gate.xhigh_scouts || 0), xhighScouts),
603
583
  eureka_moments: Math.max(Number(gate.eureka_moments || 0), eurekaMoments),
584
+ scout_persona_contract_ok: personaValidation.ok,
585
+ scout_persona_issues: personaValidation.issues,
604
586
  scout_findings: Math.max(Number(gate.scout_findings || 0), scoutFindings),
605
587
  debate_participants: Math.max(Number(gate.debate_participants || 0), debateParticipants),
606
588
  debate_exchanges: Math.max(Number(gate.debate_exchanges || 0), debateExchanges),
@@ -709,12 +691,18 @@ export async function writeMockResearchResult(dir, plan) {
709
691
  ...defaultScoutLedger(plan),
710
692
  scouts: RESEARCH_SCOUT_COUNCIL.map((scout) => ({
711
693
  id: scout.id,
694
+ display_name: scout.display_name || scout.label,
695
+ historical_inspiration: scout.historical_inspiration || null,
696
+ persona: scout.persona || scout.role,
697
+ persona_boundary: scout.persona_boundary,
712
698
  role: scout.role,
713
699
  mandate: scout.mandate,
714
700
  effort: 'xhigh',
701
+ reasoning_effort: 'xhigh',
702
+ service_tier: scout.service_tier || 'fast',
715
703
  eureka: {
716
704
  exclamation: 'Eureka!',
717
- idea: `${scout.label} spots a non-obvious, testable angle for ${plan.prompt}.`,
705
+ idea: `${scout.display_name || scout.label} spots a non-obvious, testable angle for ${plan.prompt}.`,
718
706
  why_it_matters: 'It forces the run to produce one falsifiable idea before synthesis.',
719
707
  source_ids: ['mock-source-1']
720
708
  },
@@ -722,13 +710,14 @@ export async function writeMockResearchResult(dir, plan) {
722
710
  findings: [
723
711
  {
724
712
  id: `mock-${scout.id}-finding-1`,
725
- claim: `${scout.label} supports a source-cited, falsifiable research gate for ${plan.prompt}.`,
713
+ claim: `${scout.display_name || scout.label} supports a source-cited, falsifiable research gate for ${plan.prompt}.`,
726
714
  source_ids: ['mock-source-1'],
727
715
  status: 'mock_supported'
728
716
  }
729
717
  ],
730
718
  falsifiers: ['A run without cited sources, counterevidence, or cheap probes should fail the research gate.'],
731
- cheap_probes: ['Compare discovery-loop output against a summary-only baseline and count testable insights.']
719
+ cheap_probes: ['Compare discovery-loop output against a summary-only baseline and count testable insights.'],
720
+ challenge_or_response: 'Participated in the mock evidence-bound debate.'
732
721
  })),
733
722
  synthesis: {
734
723
  surviving_claims: ['mock-insight-1'],
@@ -793,8 +782,8 @@ export async function writeMockResearchResult(dir, plan) {
793
782
  '',
794
783
  '## Scout Opinions',
795
784
  ...RESEARCH_SCOUT_COUNCIL.flatMap((scout) => [
796
- `### ${scout.label} (${scout.id})`,
797
- `Final opinion: ${scout.label} wants the run to preserve ${scout.mandate.toLowerCase()} while producing a cited, falsifiable insight.`,
785
+ `### ${scout.display_name || scout.label} (${scout.id})`,
786
+ `Final opinion: ${scout.display_name || scout.label} wants the run to preserve ${scout.mandate.toLowerCase()} while producing a cited, falsifiable insight.`,
798
787
  'Strongest evidence: mock-source-1 plus the layered source ledger.',
799
788
  'Main disagreement: whether formal structure or cheap empirical probes should dominate the first pass.',
800
789
  'Changed mind: accepted that citation coverage, counterevidence, and triangulation are gates before synthesis.',
@@ -850,5 +839,5 @@ export async function writeMockResearchResult(dir, plan) {
850
839
  }
851
840
 
852
841
  export function buildResearchPrompt({ id, mission, plan, cycle, previous }) {
853
- return `You are running SKS Research Mode.\nMISSION: ${id}\nTOPIC: ${mission.prompt}\nCYCLE: ${cycle}\nMODE: Genius Scout Council + frontier discovery loop. Use maximum reasoning depth available under the current Codex profile.\nLONG-RUN REAL-RESEARCH POLICY: Normal Research is allowed to take one or two hours when the question requires it. Do real source gathering and evidence comparison; do not shortcut into mock, fixture, or summary-only output. If live source access is unavailable, write the blocker and keep the gate unpassed.\nNO-QUESTION LOCK: Do not ask the user. Resolve scope from research-plan.json and current project evidence.\nSAFETY: Destructive database operations and unsafe external actions are forbidden. Prefer read-only inspection, local files, and cited public sources.\nPERSONA POLICY: Use Einstein/Feynman/Turing/von Neumann-inspired scout lenses only as cognitive roles. Do not impersonate, roleplay private identity, or speak as the historical people.\nSCOUT EFFORT POLICY: Every Research scout agent must use reasoning_effort=xhigh. Record effort: "xhigh" for every scout in scout-ledger.json. Any lower-effort scout output must keep research-gate.json unpassed.\nEUREKA POLICY: Every scout must literally write "Eureka!" and one non-obvious, source-linked idea before debate.\nDEBATE POLICY: The scouts must debate vigorously but stay evidence-bound. Every scout must challenge or respond at least once, and debate-ledger.json must record the exchanges before synthesis.\nPAPER POLICY: After the report and ledgers, write research-paper.md as a concise manuscript with Abstract, Introduction, Methodology, Findings/Results, Discussion, Limitations/Falsification, Conclusion/Next Experiment, and References.\nSOURCE SKILL POLICY: Create or update ${RESEARCH_SOURCE_SKILL_ARTIFACT} as a route-local source collection skill before synthesis. It must name the selected source layers, query routes, quality fields, blockers, and cross-layer triangulation checks. Do not edit generated .agents/skills during the research run.\nWEB/SOURCE POLICY: Run layered source retrieval across every safely available layer before synthesis: latest public papers, official government or leading-institution data, standards or primary docs, current news including BBC/CNN/GDELT-style sources when relevant, public discourse including X/Twitter and Reddit when available, developer/practitioner sources such as Stack Overflow/Stack Exchange/GitHub, and counterevidence or fact-checking sources. Treat public discourse as signal, not truth. If a layer cannot be searched, record the blocker in source-ledger.json and do not pass the gate.\nRESEARCH PLAN:\n${JSON.stringify(plan, null, 2)}\n\nOBJECTIVE: Produce genuinely useful candidate discoveries: non-obvious hypotheses, mechanisms, predictions, or experiments. Do not merely summarize. Mark uncertainty clearly.\n\nREQUIRED PROCESS:\n1. Source skill first: create ${RESEARCH_SOURCE_SKILL_ARTIFACT} with source layers, query templates, quality fields, blockers, and triangulation rules.\n2. Layered source search: create source-ledger.json with source_layers, queries, source ids, source quality notes, counterevidence sources, triangulation.cross_layer_checks, citation coverage, and blockers.\n3. Independent xhigh scouts: create scout-ledger.json with effort=xhigh, a literal Eureka! idea, findings, source_ids, falsifiers, and cheap_probes for every scout lens.\n4. Debate: create debate-ledger.json with evidence-bound challenge/response exchanges involving every scout before synthesis.\n5. Falsification: create falsification-ledger.json with attacks, missing evidence, source conflicts, and decisive next tests.\n6. Synthesis: write research-report.md and novelty-ledger.json only after cited scout findings, Eureka ideas, debate, cross-layer triangulation, and falsification are recorded.\n7. Paper: write research-paper.md as a paper-style manuscript with source-ledger references and limitations.\n\nREQUIRED OUTPUT FILES in .sneakoscope/missions/${id}/:\n- research-report.md: concise report with framing, source coverage, scout synthesis, debate synthesis, hypotheses, falsification, predictions, and next experiments. Cite source-ledger ids for factual claims.\n- research-paper.md: paper manuscript with Abstract, Introduction, Methodology, Findings/Results, Discussion, Limitations/Falsification, Conclusion/Next Experiment, and References using source-ledger ids.\n- ${RESEARCH_SOURCE_SKILL_ARTIFACT}: route-local source collection skill; it is evidence for the Skill Creator step and must not mutate generated .agents/skills.\n- source-ledger.json: layered web/source queries, source ids, source priority, source quality notes, counterevidence sources, citation coverage, triangulation checks, and blockers.\n- scout-ledger.json: one entry per scout lens with effort, eureka, query_set, findings, source_ids, falsifiers, and cheap_probes.\n- debate-ledger.json: evidence-bound challenge/response exchanges, participants, changed minds, and unresolved conflicts.\n- novelty-ledger.json: entries with claim, novelty, confidence, falsifiability, evidence source ids, falsifiers, next_experiment.\n- falsification-ledger.json: attacks/counterexamples/source conflicts, result, and next_decisive_tests.\n- research-gate.json: set passed only when all ledgers exist, ${RESEARCH_SOURCE_SKILL_ARTIFACT} exists, research-paper.md exists with required paper sections, layered web/source retrieval covered every required source layer, at least one cross-layer triangulation check exists, all scouts have effort=xhigh, all scouts have literal Eureka! ideas, every scout participated in debate, at least one counterevidence source exists, citation coverage is complete, at least one insight survived falsification, at least one testable prediction exists, and unsupported breakthrough claims are zero.\n\nPrevious cycle tail:\n${String(previous || '').slice(-2500)}\n`;
842
+ return `You are running SKS Research Mode.\nMISSION: ${id}\nTOPIC: ${mission.prompt}\nCYCLE: ${cycle}\nMODE: Genius Scout Council + frontier discovery loop. Use maximum reasoning depth available under the current Codex profile.\nLONG-RUN REAL-RESEARCH POLICY: Normal Research is allowed to take one or two hours when the question requires it. Do real source gathering and evidence comparison; do not shortcut into mock, fixture, or summary-only output. If live source access is unavailable, write the blocker and keep the gate unpassed.\nNO-QUESTION LOCK: Do not ask the user. Resolve scope from research-plan.json and current project evidence.\nSAFETY: Destructive database operations and unsafe external actions are forbidden. Prefer read-only inspection, local files, and cited public sources.\nPERSONA POLICY: Use Einstein/Feynman/Turing/von Neumann-inspired scout lenses only as cognitive roles. Do not impersonate, roleplay private identity, or speak as the historical people.\nSCOUT PERSONA POLICY: Every Research scout row must include display_name, persona, persona_boundary, reasoning_effort: "xhigh", service_tier when available, falsifiers, cheap_probes, and challenge_or_response. Persona names are Einstein Scout, Feynman Scout, Turing Scout, von Neumann Scout, and Skeptic Scout; they are cognitive lenses, not impersonations.\nSCOUT EFFORT POLICY: Every Research scout agent must use reasoning_effort=xhigh. Record effort: "xhigh" for every scout in scout-ledger.json. Any lower-effort scout output must keep research-gate.json unpassed.\nEUREKA POLICY: Every scout must literally write "Eureka!" and one non-obvious, source-linked idea before debate.\nDEBATE POLICY: The scouts must debate vigorously but stay evidence-bound. Every scout must challenge or respond at least once, and debate-ledger.json must record the exchanges before synthesis.\nPAPER POLICY: After the report and ledgers, write research-paper.md as a concise manuscript with Abstract, Introduction, Methodology, Findings/Results, Discussion, Limitations/Falsification, Conclusion/Next Experiment, and References.\nSOURCE SKILL POLICY: Create or update ${RESEARCH_SOURCE_SKILL_ARTIFACT} as a route-local source collection skill before synthesis. It must name the selected source layers, query routes, quality fields, blockers, and cross-layer triangulation checks. Do not edit generated .agents/skills during the research run.\nWEB/SOURCE POLICY: Run layered source retrieval across every safely available layer before synthesis: latest public papers, official government or leading-institution data, standards or primary docs, current news including BBC/CNN/GDELT-style sources when relevant, public discourse including X/Twitter and Reddit when available, developer/practitioner sources such as Stack Overflow/Stack Exchange/GitHub, and counterevidence or fact-checking sources. Treat public discourse as signal, not truth. If a layer cannot be searched, record the blocker in source-ledger.json and do not pass the gate.\nRESEARCH PLAN:\n${JSON.stringify(plan, null, 2)}\n\nOBJECTIVE: Produce genuinely useful candidate discoveries: non-obvious hypotheses, mechanisms, predictions, or experiments. Do not merely summarize. Mark uncertainty clearly.\n\nREQUIRED PROCESS:\n1. Source skill first: create ${RESEARCH_SOURCE_SKILL_ARTIFACT} with source layers, query templates, quality fields, blockers, and triangulation rules.\n2. Layered source search: create source-ledger.json with source_layers, queries, source ids, source quality notes, counterevidence sources, triangulation.cross_layer_checks, citation coverage, and blockers.\n3. Independent xhigh scouts: create scout-ledger.json with display_name/persona/persona_boundary, effort=xhigh, reasoning_effort=xhigh, a literal Eureka! idea, findings, source_ids, falsifiers, cheap_probes, and challenge_or_response for every scout lens.\n4. Debate: create debate-ledger.json with evidence-bound challenge/response exchanges involving every scout before synthesis.\n5. Falsification: create falsification-ledger.json with attacks, missing evidence, source conflicts, and decisive next tests.\n6. Synthesis: write research-report.md and novelty-ledger.json only after cited scout findings, Eureka ideas, debate, cross-layer triangulation, and falsification are recorded.\n7. Paper: write research-paper.md as a paper-style manuscript with source-ledger references and limitations.\n\nREQUIRED OUTPUT FILES in .sneakoscope/missions/${id}/:\n- research-report.md: concise report with framing, source coverage, scout synthesis, debate synthesis, hypotheses, falsification, predictions, and next experiments. Cite source-ledger ids for factual claims.\n- research-paper.md: paper manuscript with Abstract, Introduction, Methodology, Findings/Results, Discussion, Limitations/Falsification, Conclusion/Next Experiment, and References using source-ledger ids.\n- ${RESEARCH_SOURCE_SKILL_ARTIFACT}: route-local source collection skill; it is evidence for the Skill Creator step and must not mutate generated .agents/skills.\n- source-ledger.json: layered web/source queries, source ids, source priority, source quality notes, counterevidence sources, citation coverage, triangulation checks, and blockers.\n- scout-ledger.json: one entry per scout lens with display_name, persona, persona_boundary, effort, reasoning_effort, service_tier, eureka, query_set, findings, source_ids, falsifiers, cheap_probes, and challenge_or_response.\n- debate-ledger.json: evidence-bound challenge/response exchanges, participants, changed minds, and unresolved conflicts.\n- novelty-ledger.json: entries with claim, novelty, confidence, falsifiability, evidence source ids, falsifiers, next_experiment.\n- falsification-ledger.json: attacks/counterexamples/source conflicts, result, and next_decisive_tests.\n- research-gate.json: set passed only when all ledgers exist, ${RESEARCH_SOURCE_SKILL_ARTIFACT} exists, research-paper.md exists with required paper sections, layered web/source retrieval covered every required source layer, at least one cross-layer triangulation check exists, all scouts have display_name/persona/persona_boundary, all scouts have effort=xhigh, all scouts have literal Eureka! ideas, every scout participated in debate, at least one counterevidence source exists, citation coverage is complete, at least one insight survived falsification, at least one testable prediction exists, and unsupported breakthrough claims are zero.\n\nPrevious cycle tail:\n${String(previous || '').slice(-2500)}\n`;
854
843
  }
@@ -399,7 +399,7 @@ export const ROUTES = [
399
399
  command: '$Research',
400
400
  mode: 'RESEARCH',
401
401
  route: 'research mission',
402
- description: 'Frontier discovery with xhigh genius-lens scouts, Eureka ideas, vigorous evidence-bound debate, layered public source retrieval, falsification, a paper manuscript, a final genius-opinion summary, and testable predictions.',
402
+ description: 'Frontier discovery with named xhigh persona-lens scouts, Eureka ideas, vigorous evidence-bound debate, layered public source retrieval, falsification, a paper manuscript, a final genius-opinion summary, and testable predictions.',
403
403
  requiredSkills: ['research', 'research-discovery', 'pipeline-runner', REFLECTION_SKILL_NAME, 'honest-mode'],
404
404
  lifecycle: ['research_plan', 'source_skill', 'layered_source_ledger', 'xhigh_scout_council', 'eureka_moments', 'debate_ledger', 'report', 'paper', 'genius_opinion_summary', 'novelty_ledger', 'falsification_ledger', 'research_gate', 'post_route_reflection', 'honest_mode'],
405
405
  context7Policy: 'if_external_docs',
@@ -535,6 +535,7 @@ export const COMMAND_CATALOG = [
535
535
  { name: 'ppt', usage: 'sks ppt build|status <mission-id|latest> [--json]', description: 'Build or inspect $PPT HTML/PDF artifacts from a sealed presentation decision contract.' },
536
536
  { name: 'image-ux-review', usage: 'sks image-ux-review status <mission-id|latest> [--json]', description: 'Inspect $Image-UX-Review gpt-image-2/imagegen annotated UI/UX review artifacts.' },
537
537
  { name: 'context7', usage: 'sks context7 check|setup|tools|resolve|docs|evidence ...', description: 'Check, configure, and call the local Context7 MCP requirement.' },
538
+ { name: 'recallpulse', usage: 'sks recallpulse run|status|eval|governance|checklist <mission-id|latest>', description: 'Run report-only RecallPulse active recall, durable status, proof capsule, evidence envelope, and governance checks.' },
538
539
  { name: 'pipeline', usage: 'sks pipeline status|resume|plan|answer ...', description: 'Inspect the active skill-first route, materialized execution plan, ambiguity gates, and completion gates.' },
539
540
  { name: 'guard', usage: 'sks guard check [--json]', description: 'Check SKS harness self-protection lock, fingerprints, and source-repo exception state.' },
540
541
  { name: 'conflicts', usage: 'sks conflicts check|prompt [--json]', description: 'Detect other Codex harnesses such as OMX/DCodex and print the GPT-5.5 high cleanup prompt.' },