selftune 0.2.23 → 0.2.24

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.
Files changed (219) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +93 -15
  3. package/apps/local-dashboard/dist/assets/index-DgY2KGP-.css +1 -0
  4. package/apps/local-dashboard/dist/assets/index-Dmx7LPVX.js +15 -0
  5. package/apps/local-dashboard/dist/assets/vendor-react-C5oyHiV1.js +11 -0
  6. package/apps/local-dashboard/dist/assets/{vendor-table-BIiI3YhS.js → vendor-table-Bc_bbKd8.js} +1 -1
  7. package/apps/local-dashboard/dist/assets/vendor-ui-B3BPIYy7.js +1 -0
  8. package/apps/local-dashboard/dist/index.html +5 -5
  9. package/cli/selftune/adapters/codex/install.ts +310 -78
  10. package/cli/selftune/adapters/opencode/install.ts +3 -4
  11. package/cli/selftune/alpha-upload/build-payloads.ts +3 -3
  12. package/cli/selftune/alpha-upload/stage-canonical.ts +17 -11
  13. package/cli/selftune/auto-update.ts +200 -8
  14. package/cli/selftune/canonical-export.ts +55 -25
  15. package/cli/selftune/command-surface.ts +397 -0
  16. package/cli/selftune/contribute/contribute.ts +64 -13
  17. package/cli/selftune/contribution-config.ts +57 -3
  18. package/cli/selftune/contribution-preferences.ts +117 -0
  19. package/cli/selftune/contribution-signals.ts +8 -4
  20. package/cli/selftune/contribution-staging.ts +13 -2
  21. package/cli/selftune/contributions.ts +55 -121
  22. package/cli/selftune/creator-contributions.ts +29 -10
  23. package/cli/selftune/cron/setup.ts +7 -3
  24. package/cli/selftune/dashboard-contract.ts +73 -0
  25. package/cli/selftune/dashboard-server.ts +168 -17
  26. package/cli/selftune/dashboard.ts +350 -17
  27. package/cli/selftune/eval/baseline.ts +21 -5
  28. package/cli/selftune/eval/execution-eval.ts +170 -0
  29. package/cli/selftune/eval/family-overlap.ts +2 -2
  30. package/cli/selftune/eval/hooks-to-evals.ts +228 -82
  31. package/cli/selftune/eval/import-skillsbench.ts +2 -2
  32. package/cli/selftune/eval/invocation-classifier.ts +56 -0
  33. package/cli/selftune/eval/synthetic-evals.ts +5 -3
  34. package/cli/selftune/eval/unit-test-cli.ts +7 -4
  35. package/cli/selftune/evolution/apply-proposal.ts +295 -0
  36. package/cli/selftune/evolution/engines/replay-engine.ts +79 -57
  37. package/cli/selftune/evolution/evolve-body.ts +100 -39
  38. package/cli/selftune/evolution/evolve.ts +244 -52
  39. package/cli/selftune/evolution/rollback.ts +0 -1
  40. package/cli/selftune/evolution/validate-body.ts +68 -42
  41. package/cli/selftune/evolution/validate-host-replay.ts +510 -60
  42. package/cli/selftune/evolution/validate-proposal.ts +11 -150
  43. package/cli/selftune/evolution/validate-routing.ts +43 -41
  44. package/cli/selftune/evolution/validation-contract.ts +91 -0
  45. package/cli/selftune/grading/auto-grade.ts +11 -7
  46. package/cli/selftune/grading/grade-session.ts +10 -16
  47. package/cli/selftune/index.ts +35 -10
  48. package/cli/selftune/ingestors/claude-replay.ts +15 -10
  49. package/cli/selftune/ingestors/codex-wrapper.ts +3 -3
  50. package/cli/selftune/ingestors/opencode-ingest.ts +2 -2
  51. package/cli/selftune/ingestors/pi-ingest.ts +3 -2
  52. package/cli/selftune/init.ts +27 -3
  53. package/cli/selftune/localdb/direct-write.ts +35 -1
  54. package/cli/selftune/localdb/queries/cron.ts +34 -0
  55. package/cli/selftune/localdb/queries/dashboard.ts +834 -0
  56. package/cli/selftune/localdb/queries/evolution.ts +158 -0
  57. package/cli/selftune/localdb/queries/execution.ts +133 -0
  58. package/cli/selftune/localdb/queries/json.ts +18 -0
  59. package/cli/selftune/localdb/queries/monitoring.ts +263 -0
  60. package/cli/selftune/localdb/queries/raw.ts +95 -0
  61. package/cli/selftune/localdb/queries/staging.ts +270 -0
  62. package/cli/selftune/localdb/queries/trust.ts +392 -0
  63. package/cli/selftune/localdb/queries.ts +60 -2288
  64. package/cli/selftune/localdb/schema.ts +21 -0
  65. package/cli/selftune/monitoring/watch.ts +96 -29
  66. package/cli/selftune/normalization.ts +3 -0
  67. package/cli/selftune/observability.ts +4 -2
  68. package/cli/selftune/orchestrate/cli.ts +161 -0
  69. package/cli/selftune/orchestrate/execute.ts +295 -0
  70. package/cli/selftune/orchestrate/finalize.ts +157 -0
  71. package/cli/selftune/orchestrate/locks.ts +40 -0
  72. package/cli/selftune/orchestrate/plan.ts +131 -0
  73. package/cli/selftune/orchestrate/post-run.ts +59 -0
  74. package/cli/selftune/orchestrate/prepare.ts +334 -0
  75. package/cli/selftune/orchestrate/report.ts +182 -0
  76. package/cli/selftune/orchestrate/runtime.ts +120 -0
  77. package/cli/selftune/orchestrate/signals.ts +48 -0
  78. package/cli/selftune/orchestrate.ts +150 -1173
  79. package/cli/selftune/repair/skill-usage.ts +5 -2
  80. package/cli/selftune/routes/overview.ts +5 -2
  81. package/cli/selftune/routes/skill-report.ts +15 -2
  82. package/cli/selftune/schedule.ts +5 -5
  83. package/cli/selftune/status.ts +39 -2
  84. package/cli/selftune/testing-readiness.ts +597 -0
  85. package/cli/selftune/types.ts +44 -4
  86. package/cli/selftune/uninstall.ts +2 -1
  87. package/cli/selftune/utils/canonical-log.ts +1 -9
  88. package/cli/selftune/utils/cli-error.ts +9 -0
  89. package/cli/selftune/utils/llm-call.ts +126 -6
  90. package/cli/selftune/utils/skill-discovery.ts +2 -0
  91. package/cli/selftune/workflows/proposals.ts +184 -0
  92. package/cli/selftune/workflows/skill-scaffold.ts +241 -0
  93. package/cli/selftune/workflows/workflows.ts +100 -26
  94. package/node_modules/@selftune/telemetry-contract/fixtures/complete-push.ts +1 -1
  95. package/node_modules/@selftune/telemetry-contract/fixtures/evidence-only-push.ts +1 -1
  96. package/node_modules/@selftune/telemetry-contract/fixtures/partial-push-no-sessions.ts +1 -1
  97. package/node_modules/@selftune/telemetry-contract/fixtures/partial-push-unresolved-parents.ts +1 -1
  98. package/node_modules/@selftune/telemetry-contract/src/schemas.ts +41 -1
  99. package/node_modules/@selftune/telemetry-contract/src/types.ts +103 -2
  100. package/package.json +25 -9
  101. package/packages/dashboard-core/AGENTS.md +18 -0
  102. package/packages/dashboard-core/README.md +30 -0
  103. package/packages/dashboard-core/index.ts +3 -0
  104. package/packages/dashboard-core/package.json +39 -0
  105. package/packages/dashboard-core/src/chrome/DashboardChrome.tsx +74 -0
  106. package/packages/dashboard-core/src/chrome/DashboardHeader.tsx +200 -0
  107. package/packages/dashboard-core/src/chrome/DashboardSidebar.tsx +219 -0
  108. package/packages/dashboard-core/src/chrome/RuntimeBadge.tsx +46 -0
  109. package/packages/dashboard-core/src/chrome/index.ts +14 -0
  110. package/packages/dashboard-core/src/chrome/types.ts +81 -0
  111. package/packages/dashboard-core/src/chrome/utils.ts +23 -0
  112. package/packages/dashboard-core/src/gates/FeatureGate.tsx +11 -0
  113. package/packages/dashboard-core/src/gates/LockedRoute.tsx +29 -0
  114. package/packages/dashboard-core/src/gates/UpgradeCard.tsx +89 -0
  115. package/packages/dashboard-core/src/gates/index.ts +3 -0
  116. package/packages/dashboard-core/src/host/DashboardHostProvider.tsx +62 -0
  117. package/packages/dashboard-core/src/host/adapter.ts +47 -0
  118. package/packages/dashboard-core/src/host/capabilities.ts +55 -0
  119. package/packages/dashboard-core/src/host/index.ts +3 -0
  120. package/packages/dashboard-core/src/models/analytics.ts +39 -0
  121. package/packages/dashboard-core/src/models/index.ts +4 -0
  122. package/packages/dashboard-core/src/models/overview.ts +98 -0
  123. package/packages/dashboard-core/src/models/runtime.ts +7 -0
  124. package/packages/dashboard-core/src/models/skills.ts +34 -0
  125. package/packages/dashboard-core/src/routes/index.ts +2 -0
  126. package/packages/dashboard-core/src/routes/manifest.test.ts +70 -0
  127. package/packages/dashboard-core/src/routes/manifest.ts +451 -0
  128. package/packages/dashboard-core/src/routes/types.ts +39 -0
  129. package/packages/dashboard-core/src/screens/analytics/AnalyticsScreen.tsx +278 -0
  130. package/packages/dashboard-core/src/screens/analytics/index.ts +1 -0
  131. package/packages/dashboard-core/src/screens/index.ts +37 -0
  132. package/packages/dashboard-core/src/screens/overview/OverviewComparisonSurface.test.ts +101 -0
  133. package/packages/dashboard-core/src/screens/overview/OverviewComparisonSurface.tsx +393 -0
  134. package/packages/dashboard-core/src/screens/overview/OverviewCompositionSurface.test.tsx +113 -0
  135. package/packages/dashboard-core/src/screens/overview/OverviewCompositionSurface.tsx +72 -0
  136. package/packages/dashboard-core/src/screens/overview/OverviewCoreSurface.tsx +71 -0
  137. package/packages/dashboard-core/src/screens/overview/OverviewOnboardingBanner.tsx +90 -0
  138. package/packages/dashboard-core/src/screens/overview/OverviewRunSummary.tsx +40 -0
  139. package/packages/dashboard-core/src/screens/overview/index.ts +16 -0
  140. package/packages/dashboard-core/src/screens/overview/types.ts +13 -0
  141. package/packages/dashboard-core/src/screens/skill-report/SkillReportDailyBreakdownSection.tsx +99 -0
  142. package/packages/dashboard-core/src/screens/skill-report/SkillReportDataQualityTabContent.tsx +35 -0
  143. package/packages/dashboard-core/src/screens/skill-report/SkillReportEvidenceRail.tsx +71 -0
  144. package/packages/dashboard-core/src/screens/skill-report/SkillReportEvidenceSection.tsx +63 -0
  145. package/packages/dashboard-core/src/screens/skill-report/SkillReportEvidenceTabContent.tsx +25 -0
  146. package/packages/dashboard-core/src/screens/skill-report/SkillReportInvocationsSection.tsx +24 -0
  147. package/packages/dashboard-core/src/screens/skill-report/SkillReportMissedQueriesSection.tsx +79 -0
  148. package/packages/dashboard-core/src/screens/skill-report/SkillReportScaffold.tsx +150 -0
  149. package/packages/dashboard-core/src/screens/skill-report/SkillReportSections.test.tsx +224 -0
  150. package/packages/dashboard-core/src/screens/skill-report/SkillReportTabs.test.tsx +76 -0
  151. package/packages/dashboard-core/src/screens/skill-report/SkillReportTabs.tsx +88 -0
  152. package/packages/dashboard-core/src/screens/skill-report/SkillReportTrendSection.tsx +33 -0
  153. package/packages/dashboard-core/src/screens/skill-report/SkillReportTrustBadge.tsx +67 -0
  154. package/packages/dashboard-core/src/screens/skill-report/index.ts +45 -0
  155. package/packages/dashboard-core/src/screens/skills/SkillsLibraryScreen.tsx +162 -0
  156. package/packages/dashboard-core/src/screens/skills/index.ts +6 -0
  157. package/packages/telemetry-contract/fixtures/complete-push.ts +1 -1
  158. package/packages/telemetry-contract/fixtures/evidence-only-push.ts +1 -1
  159. package/packages/telemetry-contract/fixtures/partial-push-no-sessions.ts +1 -1
  160. package/packages/telemetry-contract/fixtures/partial-push-unresolved-parents.ts +1 -1
  161. package/packages/telemetry-contract/src/schemas.ts +41 -1
  162. package/packages/telemetry-contract/src/types.ts +103 -2
  163. package/packages/ui/src/components/EvidenceViewer.tsx +80 -25
  164. package/packages/ui/src/components/OverviewPanels.tsx +67 -26
  165. package/packages/ui/src/primitives/tabs.tsx +7 -6
  166. package/packages/ui/src/types.ts +10 -0
  167. package/skill/SKILL.md +130 -332
  168. package/skill/agents/diagnosis-analyst.md +3 -3
  169. package/skill/agents/evolution-reviewer.md +3 -3
  170. package/skill/agents/integration-guide.md +3 -3
  171. package/skill/agents/pattern-analyst.md +2 -2
  172. package/skill/references/cli-quick-reference.md +89 -0
  173. package/skill/references/creator-playbook.md +131 -0
  174. package/skill/references/examples.md +48 -0
  175. package/skill/references/troubleshooting.md +47 -0
  176. package/skill/references/version-history.md +1 -1
  177. package/skill/selftune.contribute.json +11 -0
  178. package/skill/{Workflows → workflows}/Baseline.md +20 -1
  179. package/skill/{Workflows → workflows}/Contribute.md +23 -10
  180. package/skill/{Workflows → workflows}/Contributions.md +13 -5
  181. package/skill/workflows/CreateTestDeploy.md +170 -0
  182. package/skill/{Workflows → workflows}/CreatorContributions.md +18 -6
  183. package/skill/{Workflows → workflows}/Cron.md +1 -1
  184. package/skill/{Workflows → workflows}/Dashboard.md +20 -0
  185. package/skill/{Workflows → workflows}/Doctor.md +1 -1
  186. package/skill/{Workflows → workflows}/Evals.md +67 -2
  187. package/skill/{Workflows → workflows}/Evolve.md +119 -30
  188. package/skill/{Workflows → workflows}/EvolveBody.md +41 -1
  189. package/skill/{Workflows → workflows}/Grade.md +1 -1
  190. package/skill/{Workflows → workflows}/Initialize.md +8 -4
  191. package/skill/{Workflows → workflows}/Orchestrate.md +13 -3
  192. package/skill/{Workflows → workflows}/Schedule.md +3 -3
  193. package/skill/workflows/SignalsDashboard.md +87 -0
  194. package/skill/{Workflows → workflows}/UnitTest.md +19 -0
  195. package/skill/{Workflows → workflows}/Watch.md +42 -2
  196. package/skill/{Workflows → workflows}/Workflows.md +39 -2
  197. package/apps/local-dashboard/dist/assets/index-CwOtTrUS.css +0 -1
  198. package/apps/local-dashboard/dist/assets/index-f1HQpbeH.js +0 -59
  199. package/apps/local-dashboard/dist/assets/vendor-react-CKkiCskZ.js +0 -11
  200. package/apps/local-dashboard/dist/assets/vendor-ui-jVSaIZey.js +0 -12
  201. /package/skill/{Workflows → workflows}/AlphaUpload.md +0 -0
  202. /package/skill/{Workflows → workflows}/AutoActivation.md +0 -0
  203. /package/skill/{Workflows → workflows}/Badge.md +0 -0
  204. /package/skill/{Workflows → workflows}/Composability.md +0 -0
  205. /package/skill/{Workflows → workflows}/EvolutionMemory.md +0 -0
  206. /package/skill/{Workflows → workflows}/ExportCanonical.md +0 -0
  207. /package/skill/{Workflows → workflows}/Hook.md +0 -0
  208. /package/skill/{Workflows → workflows}/ImportSkillsBench.md +0 -0
  209. /package/skill/{Workflows → workflows}/Ingest.md +0 -0
  210. /package/skill/{Workflows → workflows}/PlatformHooks.md +0 -0
  211. /package/skill/{Workflows → workflows}/Quickstart.md +0 -0
  212. /package/skill/{Workflows → workflows}/Recover.md +0 -0
  213. /package/skill/{Workflows → workflows}/Registry.md +0 -0
  214. /package/skill/{Workflows → workflows}/RepairSkillUsage.md +0 -0
  215. /package/skill/{Workflows → workflows}/Replay.md +0 -0
  216. /package/skill/{Workflows → workflows}/Rollback.md +0 -0
  217. /package/skill/{Workflows → workflows}/Sync.md +0 -0
  218. /package/skill/{Workflows → workflows}/Telemetry.md +0 -0
  219. /package/skill/{Workflows → workflows}/Uninstall.md +0 -0
@@ -300,8 +300,11 @@ function extractSessionSkillUsage(
300
300
 
301
301
  const msg = (entry.message as Record<string, unknown>) ?? entry;
302
302
  const role = (msg.role as string) ?? (entry.role as string) ?? "";
303
- const timestamp =
304
- (entry.timestamp as string) ?? (msg.timestamp as string) ?? lastUserMessage?.timestamp ?? "";
303
+ const timestamp: string =
304
+ optionalString(entry.timestamp) ??
305
+ optionalString(msg.timestamp) ??
306
+ lastUserMessage?.timestamp ??
307
+ "";
305
308
  sessionCwd =
306
309
  optionalString(entry.cwd) ??
307
310
  optionalString(msg.cwd) ??
@@ -24,6 +24,7 @@ import {
24
24
  getSkillTrustSummaries,
25
25
  getSkillsList,
26
26
  } from "../localdb/queries.js";
27
+ import { buildCreatorTestingOverview, listSkillTestingReadiness } from "../testing-readiness.js";
27
28
  import { buildTrustWatchlist } from "../trust-model.js";
28
29
  import { loadWatchedSkills } from "../watchlist.js";
29
30
 
@@ -32,15 +33,16 @@ export function handleOverview(
32
33
  version: string,
33
34
  searchParams?: URLSearchParams,
34
35
  ): Response {
35
- const skills = getSkillsList(db);
36
-
37
36
  // -- Autonomy-first enrichment fields ----------------------------------------
38
37
  const attentionQueue = getAttentionQueue(db);
39
38
  const recentDecisions = getRecentDecisions(db);
40
39
  const trustSummaries = getSkillTrustSummaries(db);
40
+ const testingReadiness = listSkillTestingReadiness(db);
41
+ const skills = getSkillsList(db, testingReadiness);
41
42
  const pendingReviews = attentionQueue.filter((a) => a.category === "needs_review").length;
42
43
 
43
44
  const trustWatchlist = buildTrustWatchlist(trustSummaries);
45
+ const creatorTesting = buildCreatorTestingOverview(testingReadiness);
44
46
  const autonomyStatus = buildAutonomyStatus(
45
47
  db,
46
48
  attentionQueue,
@@ -55,6 +57,7 @@ export function handleOverview(
55
57
  attention_queue: attentionQueue,
56
58
  trust_watchlist: trustWatchlist,
57
59
  recent_decisions: recentDecisions,
60
+ creator_testing: creatorTesting,
58
61
  };
59
62
 
60
63
  // -- Standard overview payload -----------------------------------------------
@@ -17,6 +17,7 @@ import {
17
17
  getSkillReportPayload,
18
18
  safeParseJson,
19
19
  } from "../localdb/queries.js";
20
+ import { getSkillTestingReadiness } from "../testing-readiness.js";
20
21
 
21
22
  export function handleSkillReport(
22
23
  db: Database,
@@ -24,6 +25,7 @@ export function handleSkillReport(
24
25
  searchParams?: URLSearchParams,
25
26
  ): Response {
26
27
  const report = getSkillReportPayload(db, skillName);
28
+ const testing_readiness = getSkillTestingReadiness(db, skillName);
27
29
 
28
30
  // 1. Evolution audit with eval_snapshot
29
31
  const evolution = db
@@ -178,7 +180,14 @@ export function handleSkillReport(
178
180
  report.evidence.length > 0 ||
179
181
  evolution.length > 0 ||
180
182
  pending_proposals.length > 0 ||
181
- invPageRows.length > 0;
183
+ invPageRows.length > 0 ||
184
+ Boolean(
185
+ testing_readiness?.skill_path ||
186
+ testing_readiness?.eval_set_entries ||
187
+ testing_readiness?.unit_test_cases ||
188
+ testing_readiness?.replay_check_count ||
189
+ testing_readiness?.baseline_sample_size,
190
+ );
182
191
  if (!hasData) {
183
192
  return Response.json({ error: "Skill not found" }, { status: 404 });
184
193
  }
@@ -784,7 +793,10 @@ export function handleSkillReport(
784
793
 
785
794
  if (coverage.checks < 5) {
786
795
  trustState = "low_sample";
787
- trustSummary = `Too few operational observations to assess trust — only ${coverage.checks} checks recorded.`;
796
+ trustSummary =
797
+ coverage.checks === 0 && testing_readiness
798
+ ? `No runtime observations yet. Use the creator test loop to bootstrap this skill before trusting live routing.`
799
+ : `Too few operational observations to assess trust — only ${coverage.checks} checks recorded.`;
788
800
  } else if (latestAuditRow?.action === "rolled_back") {
789
801
  trustState = "rolled_back";
790
802
  trustSummary = "Recent evolution was rolled back — review evidence before re-deploying.";
@@ -879,5 +891,6 @@ export function handleSkillReport(
879
891
  evolution_state,
880
892
  data_hygiene,
881
893
  examples,
894
+ testing_readiness,
882
895
  });
883
896
  }
@@ -376,7 +376,7 @@ export function buildInstallPlan(
376
376
  }
377
377
 
378
378
  const systemdDir = join(homeDir, ".config", "systemd", "user");
379
- const definitions = SCHEDULE_ENTRIES.map(buildSystemdDefinition);
379
+ const definitions = SCHEDULE_ENTRIES.map((entry) => buildSystemdDefinition(entry));
380
380
  return {
381
381
  artifacts: definitions.flatMap((definition) => [
382
382
  { path: join(systemdDir, `${definition.baseName}.timer`), content: definition.timerContent },
@@ -531,7 +531,7 @@ export function cliMain(): void {
531
531
 
532
532
  if (values["apply-cron-artifact"]) {
533
533
  try {
534
- applyCronArtifact(values["apply-cron-artifact"]);
534
+ applyCronArtifact(values["apply-cron-artifact"] as string);
535
535
  return;
536
536
  } catch (err) {
537
537
  throw new CLIError(
@@ -567,8 +567,8 @@ For OpenClaw-specific scheduling, see: selftune cron`);
567
567
  if (values.install) {
568
568
  try {
569
569
  const result = installSchedule({
570
- format: values.format,
571
- dryRun: values["dry-run"] ?? false,
570
+ format: typeof values.format === "string" ? values.format : undefined,
571
+ dryRun: values["dry-run"] === true,
572
572
  });
573
573
  if (!result.dryRun && !result.activated) {
574
574
  throw new CLIError(
@@ -601,7 +601,7 @@ For OpenClaw-specific scheduling, see: selftune cron`);
601
601
  }
602
602
  }
603
603
 
604
- const result = formatOutput(values.format);
604
+ const result = formatOutput(typeof values.format === "string" ? values.format : undefined);
605
605
  if (!result.ok) {
606
606
  throw new CLIError(
607
607
  result.error ?? "Invalid schedule format",
@@ -16,6 +16,7 @@ import { getAlphaLinkState, readAlphaIdentity } from "./alpha-identity.js";
16
16
  import { getQueueStats } from "./alpha-upload/queue.js";
17
17
  import { getBaseUrl } from "./auth/device-code.js";
18
18
  import { SELFTUNE_CONFIG_PATH } from "./constants.js";
19
+ import type { SkillTestingReadiness } from "./dashboard-contract.js";
19
20
  import { getDb } from "./localdb/db.js";
20
21
  import { writeCronRunToDb } from "./localdb/direct-write.js";
21
22
  import {
@@ -31,6 +32,7 @@ import {
31
32
  import { computeMonitoringSnapshot, MIN_MONITORING_SKILL_CHECKS } from "./monitoring/watch.js";
32
33
  import { doctor } from "./observability.js";
33
34
  import { deriveTrustBucket, deriveTrustBucketReason } from "./trust-model.js";
35
+ import { buildCreatorTestingOverview, listSkillTestingReadiness } from "./testing-readiness.js";
34
36
  import type {
35
37
  AgentCommandGuidance,
36
38
  AlphaLinkState,
@@ -314,7 +316,35 @@ function formatTrustHighlights(trustSummaries: SkillTrustSummary[] | undefined):
314
316
  return lines;
315
317
  }
316
318
 
317
- export function formatStatus(result: StatusResult, trustSummaries?: SkillTrustSummary[]): string {
319
+ function formatCreatorLoopLines(readinessRows: SkillTestingReadiness[] | undefined): string[] {
320
+ if (!readinessRows || readinessRows.length === 0) return [];
321
+
322
+ const overview = buildCreatorTestingOverview(readinessRows);
323
+ const lines = ["Creator loop"];
324
+ lines.push(` ${overview.summary}`);
325
+
326
+ const counts = overview.counts;
327
+ lines.push(
328
+ ` Generate evals: ${counts.generate_evals} | Unit tests: ${counts.run_unit_tests} | Replay dry-run: ${counts.run_replay_dry_run} | Baseline: ${counts.measure_baseline} | Deploy: ${counts.deploy_candidate} | Watching: ${counts.watch_deployment}`,
329
+ );
330
+
331
+ if (overview.priorities.length > 0) {
332
+ lines.push(" Next:");
333
+ for (const priority of overview.priorities.slice(0, 3)) {
334
+ lines.push(
335
+ ` ${priority.skill_name}: ${priority.next_step.replaceAll("_", " ")} — ${priority.recommended_command}`,
336
+ );
337
+ }
338
+ }
339
+
340
+ return lines;
341
+ }
342
+
343
+ export function formatStatus(
344
+ result: StatusResult,
345
+ trustSummaries?: SkillTrustSummary[],
346
+ testingReadiness?: SkillTestingReadiness[],
347
+ ): string {
318
348
  const noColor = !!process.env.NO_COLOR;
319
349
 
320
350
  const green = noColor ? (s: string) => s : (s: string) => colorize(s, "#788c5d");
@@ -334,6 +364,12 @@ export function formatStatus(result: StatusResult, trustSummaries?: SkillTrustSu
334
364
  lines.push("");
335
365
  }
336
366
 
367
+ const creatorLoopLines = formatCreatorLoopLines(testingReadiness);
368
+ if (creatorLoopLines.length > 0) {
369
+ lines.push(...creatorLoopLines);
370
+ lines.push("");
371
+ }
372
+
337
373
  // Skills table
338
374
  const skillCount = result.skills.length;
339
375
  lines.push(
@@ -588,7 +624,8 @@ export async function cliMain(): Promise<void> {
588
624
 
589
625
  const result = computeStatus(telemetry, skillRecords, queryRecords, auditEntries, doctorResult);
590
626
  const trustSummaries = getSkillTrustSummaries(db);
591
- const output = formatStatus(result, trustSummaries);
627
+ const testingReadiness = listSkillTestingReadiness(db);
628
+ const output = formatStatus(result, trustSummaries, testingReadiness);
592
629
  console.log(output);
593
630
 
594
631
  // Alpha upload status section