feat(recovery,context): tier-2 intent-holder arbiter + remaining-delta pinning + surfaced signal events

- recovery: two-tier repair ladder — owner then arbiter (recovery stage recast
  as intent-holder, holds initial intent, reconciles cross-file contract disputes)
  with independent INTENT_ROUTE_BUDGET; RecoveryRoutingTest coverage
- context: remaining-delta checklist pinning (RemainingDelta{Pinning,Entry}Test)
- surface write-only events (session name, quality signals) into stats/browse
- parseToolArguments lenient-Json fallback for bare-key drift
- tools: ChildProcess seam
This commit is contained in:
2026-07-11 23:56:52 +04:00
parent 3d5e05c1fb
commit 15248cae8a
55 changed files with 1932 additions and 231 deletions
@@ -54,6 +54,18 @@ data class TierApprovalStatsDto(
val avgWaitMs: Long,
)
@Serializable
data class QualityStatsDto(
val sourceFetches: Long = 0,
val lowQualityExtractions: Long = 0,
val extractionQualityRate: Double = 1.0,
val retrievedHits: Long = 0,
val droppedHits: Long = 0,
val retrievalPrecision: Double = 1.0,
val briefDriftCount: Long = 0,
val capabilityGapCount: Long = 0,
)
@Serializable
data class StatsReportDto(
val sessionId: String,
@@ -75,6 +87,7 @@ data class StatsReportDto(
val avgApprovalWaitMs: Long = 0,
val perTier: List<TierApprovalStatsDto> = emptyList(),
val failures: FailureMetricsDto = FailureMetricsDto(),
val quality: QualityStatsDto = QualityStatsDto(),
val inferencePct: Double = 0.0,
val toolPct: Double = 0.0,
val approvalWaitPct: Double = 0.0,
@@ -146,6 +159,17 @@ fun renderStats(report: StatsReportDto): String {
"stage: ${f.stageFailures} workflow: ${f.workflowFailures}"
lines += ""
val q = report.quality
lines += "Signal quality"
lines += " extraction: %d fetched, %d low-quality (%.0f%% clean)".format(
Locale.ROOT, q.sourceFetches, q.lowQualityExtractions, q.extractionQualityRate * 100.0,
)
lines += " retrieval: %d kept, %d filtered (%.0f%% precision)".format(
Locale.ROOT, q.retrievedHits, q.droppedHits, q.retrievalPrecision * 100.0,
)
lines += " brief drift: ${q.briefDriftCount} capability gaps: ${q.capabilityGapCount}"
lines += ""
lines += "Time accounting (% of session wall time)"
lines += " inference: %.1f%% tools: %.1f%% approval-wait: %.1f%% other: %.1f%%".format(
Locale.ROOT,