loki-mode 11.18.0 → 11.20.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.
Files changed (89) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/dashboard/__init__.py +1 -1
  4. package/docs/CLI-REFERENCE.md +1 -1
  5. package/docs/INSTALLATION.md +1 -1
  6. package/loki-ts/dist/loki.js +2 -2
  7. package/mcp/__init__.py +1 -1
  8. package/memory/embeddings.py +111 -0
  9. package/package.json +2 -2
  10. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  11. package/skills/00-index.md +28 -0
  12. package/skills/agents.md +14 -0
  13. package/skills/artifacts.md +12 -0
  14. package/skills/compound-learning.md +20 -0
  15. package/skills/documentation.md +18 -0
  16. package/skills/extending.md +13 -0
  17. package/skills/factory-operations.md +23 -0
  18. package/skills/github-integration.md +27 -0
  19. package/skills/healing.md +28 -0
  20. package/skills/magic-modules.md +24 -0
  21. package/skills/memory.md +20 -0
  22. package/skills/model-selection.md +34 -0
  23. package/skills/openspec-integration.md +16 -0
  24. package/skills/parallel-workflows.md +44 -0
  25. package/skills/patterns-advanced.md +11 -0
  26. package/skills/production.md +19 -0
  27. package/skills/providers.md +18 -0
  28. package/skills/quality-gates.md +54 -0
  29. package/skills/release-cadence.md +16 -0
  30. package/skills/sdlc-fleet.md +17 -0
  31. package/skills/testing.md +12 -0
  32. package/skills/troubleshooting.md +41 -1
  33. package/web-app/dist/assets/{AdminPage-Ccl4YEiK.js → AdminPage-B-bEZytb.js} +1 -1
  34. package/web-app/dist/assets/{Avatar-CNr3zMt9.js → Avatar-AVq-BBUz.js} +1 -1
  35. package/web-app/dist/assets/{Badge-BvHGigQF.js → Badge-BGp6pTWA.js} +1 -1
  36. package/web-app/dist/assets/{Button-BPOUvGtk.js → Button-BOg2qFMK.js} +1 -1
  37. package/web-app/dist/assets/{CockpitPage-CaQew8Gv.js → CockpitPage-XIwAzBEn.js} +1 -1
  38. package/web-app/dist/assets/{ComparePage-BR3EinOa.js → ComparePage-1xndNmeA.js} +1 -1
  39. package/web-app/dist/assets/{ErrorBoundary-_w7Oyx3U.js → ErrorBoundary-Be-tq62u.js} +1 -1
  40. package/web-app/dist/assets/{EvidenceReceiptPanel-CzMl43Ae.js → EvidenceReceiptPanel-CLzGyfv0.js} +1 -1
  41. package/web-app/dist/assets/{GitHubIssuesPanel-DG_OioDO.js → GitHubIssuesPanel-Dbmz-k3i.js} +1 -1
  42. package/web-app/dist/assets/{GitHubPRsPanel-B6LqESL1.js → GitHubPRsPanel-D7XMEJcR.js} +1 -1
  43. package/web-app/dist/assets/{HomePage-CNsoKByl.js → HomePage-DGVhPfDg.js} +2 -2
  44. package/web-app/dist/assets/{LoginPage-aP55S_EK.js → LoginPage-DZiBc6jd.js} +1 -1
  45. package/web-app/dist/assets/{MagicPage-CtYd65MA.js → MagicPage-DqL0_Lc6.js} +1 -1
  46. package/web-app/dist/assets/{MetricsPage-4cghRPlD.js → MetricsPage-ChVqKn71.js} +1 -1
  47. package/web-app/dist/assets/{NotFoundPage-BQ1L2OHR.js → NotFoundPage-DappfBO6.js} +1 -1
  48. package/web-app/dist/assets/{ProjectPage-CWZw_DTd.js → ProjectPage-CHbZsIUs.js} +3 -3
  49. package/web-app/dist/assets/{ProjectsPage-CTqLKk01.js → ProjectsPage-B6HTzGg0.js} +1 -1
  50. package/web-app/dist/assets/{SettingsPage-W7Ntgwvx.js → SettingsPage-C4fA0CFo.js} +1 -1
  51. package/web-app/dist/assets/{ShowcasePage-Bnb-SpWP.js → ShowcasePage-BL_6Nsvm.js} +1 -1
  52. package/web-app/dist/assets/{SystemSettingsPage-DmkyMEEf.js → SystemSettingsPage-D70hAp-u.js} +1 -1
  53. package/web-app/dist/assets/{TeamsPage-BDg_dylr.js → TeamsPage-Dag5RT5f.js} +1 -1
  54. package/web-app/dist/assets/{TemplatesPage-zwUCIEOg.js → TemplatesPage-cp7d1hN7.js} +1 -1
  55. package/web-app/dist/assets/{TerminalOutput-Raof8c5U.js → TerminalOutput-BHcgTkgY.js} +1 -1
  56. package/web-app/dist/assets/{activity-IB3YlI9q.js → activity-DoYq1Z4M.js} +1 -1
  57. package/web-app/dist/assets/{bell-BDzVZvca.js → bell-Dc4idmgk.js} +1 -1
  58. package/web-app/dist/assets/{bot-DsRGUgID.js → bot-WhQrzVl8.js} +1 -1
  59. package/web-app/dist/assets/{check-C7E0WGL4.js → check-S_mzCWxV.js} +1 -1
  60. package/web-app/dist/assets/{chevron-left-D-ICnF5T.js → chevron-left-DHQHGUiI.js} +1 -1
  61. package/web-app/dist/assets/{circle-alert-CZqV3x2-.js → circle-alert-Bc0XFZyt.js} +1 -1
  62. package/web-app/dist/assets/{clock-BIEgg_GJ.js → clock-BdFy2s87.js} +1 -1
  63. package/web-app/dist/assets/{cloud-DRzjdYzI.js → cloud-B23nmmiG.js} +1 -1
  64. package/web-app/dist/assets/{code-xml-BQYPTsLd.js → code-xml-BGDz8B3H.js} +1 -1
  65. package/web-app/dist/assets/{database-gBcDKVfn.js → database-DFhZ-uHK.js} +1 -1
  66. package/web-app/dist/assets/{dollar-sign-Bnsh4Jq8.js → dollar-sign-JcYLq2s0.js} +1 -1
  67. package/web-app/dist/assets/{file-code-corner-BhXnk7-V.js → file-code-corner-CfbFrxzM.js} +1 -1
  68. package/web-app/dist/assets/{file-plus-l1DKdi2E.js → file-plus-CNGwBTPi.js} +1 -1
  69. package/web-app/dist/assets/{globe-D8W2cVH_.js → globe-Dx80kAI0.js} +1 -1
  70. package/web-app/dist/assets/{hammer-DFPCUfHe.js → hammer-BSXFz8qY.js} +1 -1
  71. package/web-app/dist/assets/{index-BMB47fiQ.js → index-CGIhXeB0.js} +3 -3
  72. package/web-app/dist/assets/{layers-Dlu05krU.js → layers-CzZgAtpQ.js} +1 -1
  73. package/web-app/dist/assets/{loader-circle-BGagtH3f.js → loader-circle-D5gsWJnZ.js} +1 -1
  74. package/web-app/dist/assets/{lock-DBl7GNrr.js → lock-B1CRcUxR.js} +1 -1
  75. package/web-app/dist/assets/{package-BsZzFTn1.js → package-B9YObxi2.js} +1 -1
  76. package/web-app/dist/assets/{plus-D1iwT9Vz.js → plus-CiKIplJ-.js} +1 -1
  77. package/web-app/dist/assets/{refresh-cw-WqyzmGbv.js → refresh-cw-DFE5RmgT.js} +1 -1
  78. package/web-app/dist/assets/{rotate-ccw-BiOYJbPr.js → rotate-ccw-DVaCDpoi.js} +1 -1
  79. package/web-app/dist/assets/{scroll-text-r-VNmnk_.js → scroll-text-B189mONr.js} +1 -1
  80. package/web-app/dist/assets/{server-B-gocXVg.js → server-BtEO_lvf.js} +1 -1
  81. package/web-app/dist/assets/{shield-alert-CU9Diuka.js → shield-alert-BQQIizhH.js} +1 -1
  82. package/web-app/dist/assets/{thumbs-up-Ds9MPsEN.js → thumbs-up-CMkSaDGZ.js} +1 -1
  83. package/web-app/dist/assets/{trash-2-CUqmSInK.js → trash-2-CaevwAvU.js} +1 -1
  84. package/web-app/dist/assets/{trending-down-CIvvdZtN.js → trending-down-ZAVX1hIK.js} +1 -1
  85. package/web-app/dist/assets/{trending-up-CXVZ5vkw.js → trending-up-Cu0vmuAX.js} +1 -1
  86. package/web-app/dist/assets/{upload-DiB_d7Yc.js → upload-l80dpaxu.js} +1 -1
  87. package/web-app/dist/assets/{usePolling-DNrz_v7v.js → usePolling-CqxddWrH.js} +1 -1
  88. package/web-app/dist/assets/{user-CSnRzMEQ.js → user-CPG0fF2X.js} +1 -1
  89. package/web-app/dist/index.html +1 -1
@@ -1,5 +1,21 @@
1
1
  # OpenSpec Integration
2
2
 
3
+ <!-- TOC:START (generated by scripts/skill-toc.sh; do not edit) -->
4
+ ## Contents
5
+
6
+ - [When This Module Applies](#when-this-module-applies)
7
+ - [Delta-Aware Development Rules](#delta-aware-development-rules)
8
+ - [ADDED Requirements](#added-requirements)
9
+ - [MODIFIED Requirements](#modified-requirements)
10
+ - [REMOVED Requirements](#removed-requirements)
11
+ - [Task Execution](#task-execution)
12
+ - [Scenario Verification](#scenario-verification)
13
+ - [Source Mapping](#source-mapping)
14
+ - [Complexity Levels](#complexity-levels)
15
+ - [Output Files Reference](#output-files-reference)
16
+ - [Common Mistakes](#common-mistakes)
17
+ <!-- TOC:END -->
18
+
3
19
  > **Reference:** OpenSpec delta specs use ADDED/MODIFIED/REMOVED sections to describe changes to existing system behavior. See `.loki/openspec/delta-context.json` for the parsed delta context injected into your prompt.
4
20
 
5
21
  ---
@@ -1,5 +1,49 @@
1
1
  # Parallel Workflows with Git Worktrees
2
2
 
3
+ <!-- TOC:START (generated by scripts/skill-toc.sh; do not edit) -->
4
+ ## Contents
5
+
6
+ - [Why Worktree-Based Parallelism](#why-worktree-based-parallelism)
7
+ - [Parallel Work Streams](#parallel-work-streams)
8
+ - [Worktree Management Commands](#worktree-management-commands)
9
+ - [Create Feature Worktree](#create-feature-worktree)
10
+ - [Create Testing Worktree (based on main)](#create-testing-worktree-based-on-main)
11
+ - [Merge Completed Work](#merge-completed-work)
12
+ - [List and Clean Worktrees](#list-and-clean-worktrees)
13
+ - [Orchestrator Workflow](#orchestrator-workflow)
14
+ - [Supervisor / Judge Pattern](#supervisor--judge-pattern)
15
+ - [When the supervisor runs](#when-the-supervisor-runs)
16
+ - [Inputs and outputs](#inputs-and-outputs)
17
+ - [Resource state as input](#resource-state-as-input)
18
+ - [Dynamic Resource-Aware Session Concurrency](#dynamic-resource-aware-session-concurrency)
19
+ - [Env knobs (all read in `autonomy/run.sh`)](#env-knobs-all-read-in-autonomyrunsh)
20
+ - [Honest ceiling: dozens, not thousands](#honest-ceiling-dozens-not-thousands)
21
+ - [Claude Session Per Worktree](#claude-session-per-worktree)
22
+ - [Inter-Stream Communication](#inter-stream-communication)
23
+ - [Signal Files](#signal-files)
24
+ - [Workflow Triggers](#workflow-triggers)
25
+ - [Parallel Testing Strategy](#parallel-testing-strategy)
26
+ - [Continuous Testing Worktree](#continuous-testing-worktree)
27
+ - [Parallel Test Execution](#parallel-test-execution)
28
+ - [Documentation Stream](#documentation-stream)
29
+ - [Auto-Documentation Triggers](#auto-documentation-triggers)
30
+ - [Blog Stream (if site has blog)](#blog-stream-if-site-has-blog)
31
+ - [Worktree State Tracking](#worktree-state-tracking)
32
+ - [Orchestrator State Schema](#orchestrator-state-schema)
33
+ - [Dashboard Integration](#dashboard-integration)
34
+ - [Spawn Parallel Streams Script](#spawn-parallel-streams-script)
35
+ - [Optimistic Concurrency Control](#optimistic-concurrency-control)
36
+ - [The Problem with Locks](#the-problem-with-locks)
37
+ - [Optimistic Concurrency Pattern](#optimistic-concurrency-pattern)
38
+ - [Implementation](#implementation)
39
+ - [When to Use](#when-to-use)
40
+ - [Limitations and Considerations](#limitations-and-considerations)
41
+ - [When NOT to Use Worktrees](#when-not-to-use-worktrees)
42
+ - [Merge Conflict Resolution](#merge-conflict-resolution)
43
+ - [Resource Considerations](#resource-considerations)
44
+ - [Integration with Existing Patterns](#integration-with-existing-patterns)
45
+ <!-- TOC:END -->
46
+
3
47
  > **Research basis:** Claude Code git worktrees pattern, Anthropic "One Feature at a Time" harness, HN production patterns on context isolation.
4
48
 
5
49
  ---
@@ -1,5 +1,16 @@
1
1
  # Advanced Patterns
2
2
 
3
+ <!-- TOC:START (generated by scripts/skill-toc.sh; do not edit) -->
4
+ ## Contents
5
+
6
+ - [Problem Classification with Expert Hints (OptiMind Pattern)](#problem-classification-with-expert-hints-optimind-pattern)
7
+ - [Ensemble Solution Generation (OptiMind Pattern)](#ensemble-solution-generation-optimind-pattern)
8
+ - [Formal State Machines (k8s-valkey-operator Pattern)](#formal-state-machines-k8s-valkey-operator-pattern)
9
+ - [Constitutional AI Self-Critique (Anthropic)](#constitutional-ai-self-critique-anthropic)
10
+ - [Debate-Based Verification (DeepMind)](#debate-based-verification-deepmind)
11
+ - [Code-Only Agent Pattern (rijnard.com)](#code-only-agent-pattern-rijnardcom)
12
+ <!-- TOC:END -->
13
+
3
14
  ## Problem Classification with Expert Hints (OptiMind Pattern)
4
15
 
5
16
  **Classify problems before solving. Apply domain-specific expert hints.**
@@ -1,5 +1,24 @@
1
1
  # Production Patterns
2
2
 
3
+ <!-- TOC:START (generated by scripts/skill-toc.sh; do not edit) -->
4
+ ## Contents
5
+
6
+ - [HN 2025 Production Patterns](#hn-2025-production-patterns)
7
+ - [Proactive Context Management (OpenCode Pattern)](#proactive-context-management-opencode-pattern)
8
+ - [Sub-Agents for Context Isolation](#sub-agents-for-context-isolation)
9
+ - [Git Worktree Isolation (Cursor Pattern)](#git-worktree-isolation-cursor-pattern)
10
+ - [Atomic Checkpoint/Rollback (Cursor Pattern)](#atomic-checkpointrollback-cursor-pattern)
11
+ - [CI/CD Automation (Zencoder Patterns)](#cicd-automation-zencoder-patterns)
12
+ - [CI Failure Analysis and Auto-Resolution](#ci-failure-analysis-and-auto-resolution)
13
+ - [Automated Review Comment Resolution](#automated-review-comment-resolution)
14
+ - [Continuous Dependency Management](#continuous-dependency-management)
15
+ - [Batch Processing (Claude API)](#batch-processing-claude-api)
16
+ - [When to Use Batch API](#when-to-use-batch-api)
17
+ - [Batch API Limits](#batch-api-limits)
18
+ - [Implementation Pattern](#implementation-pattern)
19
+ - [Batch + Prompt Caching](#batch--prompt-caching)
20
+ <!-- TOC:END -->
21
+
3
22
  ## HN 2025 Production Patterns
4
23
 
5
24
  Narrow scope, deterministic outer loops and context engineering live in `references/production-patterns.md` (single source). The sections below cover deployment-side patterns.
@@ -1,5 +1,23 @@
1
1
  # Multi-Provider Support
2
2
 
3
+ <!-- TOC:START (generated by scripts/skill-toc.sh; do not edit) -->
4
+ ## Contents
5
+
6
+ - [Provider Comparison](#provider-comparison)
7
+ - [Provider Selection](#provider-selection)
8
+ - [Any Model, Any Provider (ANTHROPIC_BASE_URL)](#any-model-any-provider-anthropic_base_url)
9
+ - [Keeping the model catalog current](#keeping-the-model-catalog-current)
10
+ - [Claude Code (Default, Full Features)](#claude-code-default-full-features)
11
+ - [OpenAI Codex CLI (Experimental, Degraded Mode)](#openai-codex-cli-experimental-degraded-mode)
12
+ - [Cline CLI (Tier 2 - Near-Full, 12+ Providers)](#cline-cli-tier-2---near-full-12-providers)
13
+ - [Aider (Tier 3 - Degraded, 18+ Providers)](#aider-tier-3---degraded-18-providers)
14
+ - [opencode (Model-Agnostic, 75+ Providers)](#opencode-model-agnostic-75-providers)
15
+ - [Degraded Mode Behavior](#degraded-mode-behavior)
16
+ - [Provider Configuration Files](#provider-configuration-files)
17
+ - [Choosing a Provider](#choosing-a-provider)
18
+ - [Guardrail Parity (engine10)](#guardrail-parity-engine10)
19
+ <!-- TOC:END -->
20
+
3
21
  Loki Mode supports five AI providers for autonomous execution.
4
22
 
5
23
  ## Provider Comparison
@@ -1,5 +1,59 @@
1
1
  # Quality Gates
2
2
 
3
+ <!-- TOC:START (generated by scripts/skill-toc.sh; do not edit) -->
4
+ ## Contents
5
+
6
+ - [The Quality Gates (8 blocking default-on + 3 advisory default-on + 1 opt-in)](#the-quality-gates-8-blocking-default-on--3-advisory-default-on--1-opt-in)
7
+ - [Conditional auditor (not numbered): Backward Compatibility (v6.67.0)](#conditional-auditor-not-numbered-backward-compatibility-v6670)
8
+ - [Gate 7: Documentation Coverage (v6.75.0)](#gate-7-documentation-coverage-v6750)
9
+ - [Gates 5 and 6: Automated Test Integrity](#gates-5-and-6-automated-test-integrity)
10
+ - [Advisory default-on verification gates (LSP, semantic, invariant)](#advisory-default-on-verification-gates-lsp-semantic-invariant)
11
+ - [Migration: semantic and invariant flags were repurposed](#migration-semantic-and-invariant-flags-were-repurposed)
12
+ - [Coverage stays opt-in (the exception)](#coverage-stays-opt-in-the-exception)
13
+ - [v7.5.0 Phase 1 environment flags](#v750-phase-1-environment-flags)
14
+ - [Default-on verification-integrity gates (v7.41.1)](#default-on-verification-integrity-gates-v7411)
15
+ - [Other opt-in environment flags (Release 3)](#other-opt-in-environment-flags-release-3)
16
+ - [Output-token compressor (caveman, default-on, Claude-only)](#output-token-compressor-caveman-default-on-claude-only)
17
+ - [Verified-completion evidence gate (v7.19.1, default-on)](#verified-completion-evidence-gate-v7191-default-on)
18
+ - [Counter-evidence file format (`.loki/state/counter-evidence-<iter>.json`)](#counter-evidence-file-format-lokistatecounter-evidence-iterjson)
19
+ - [Held-out spec evals (v7.28.0, default-on when reserved)](#held-out-spec-evals-v7280-default-on-when-reserved)
20
+ - [Uncertainty-gated escalation (v7.19.2, default-on)](#uncertainty-gated-escalation-v7192-default-on)
21
+ - [Trigger condition](#trigger-condition)
22
+ - [Action](#action)
23
+ - [Knobs](#knobs)
24
+ - [Honest limits](#honest-limits)
25
+ - [Guardrails Execution Modes](#guardrails-execution-modes)
26
+ - [Chain-of-Verification (CoVe) Protocol](#chain-of-verification-cove-protocol)
27
+ - [Core Insight](#core-insight)
28
+ - [The 4-Step CoVe Process](#the-4-step-cove-process)
29
+ - [Step-by-Step Implementation](#step-by-step-implementation)
30
+ - [Factor+Revise Variant (Longform Code Generation)](#factorrevise-variant-longform-code-generation)
31
+ - [Why Factored Execution Matters](#why-factored-execution-matters)
32
+ - [CoVe Integration with Blind Review](#cove-integration-with-blind-review)
33
+ - [Metrics](#metrics)
34
+ - [Velocity-Quality Feedback Loop (CRITICAL)](#velocity-quality-feedback-loop-critical)
35
+ - [Key Findings](#key-findings)
36
+ - [The Trap to Avoid](#the-trap-to-avoid)
37
+ - [Mandatory Quality Checks (Per Task)](#mandatory-quality-checks-per-task)
38
+ - [Metrics to Track](#metrics-to-track)
39
+ - [Specialist Review Pool (v5.30.0)](#specialist-review-pool-v5300)
40
+ - [Selection Rules](#selection-rules)
41
+ - [Adding Your Own Reviewer (extension seam)](#adding-your-own-reviewer-extension-seam)
42
+ - [Dispatch Pattern](#dispatch-pattern)
43
+ - [Rules (unchanged from blind review)](#rules-unchanged-from-blind-review)
44
+ - [Two-Stage Review Protocol](#two-stage-review-protocol)
45
+ - [Why Separate Stages Matter](#why-separate-stages-matter)
46
+ - [Stage 1: Spec Compliance Review](#stage-1-spec-compliance-review)
47
+ - [Stage 2: Code Quality Review](#stage-2-code-quality-review)
48
+ - [Implementation in Loki Mode](#implementation-in-loki-mode)
49
+ - [Common Anti-Pattern](#common-anti-pattern)
50
+ - [Severity-Based Blocking](#severity-based-blocking)
51
+ - [Scale Considerations](#scale-considerations)
52
+ - [Review Intensity Scaling](#review-intensity-scaling)
53
+ - [Judge Agent Integration](#judge-agent-integration)
54
+ - [Cursor's Key Learning](#cursors-key-learning)
55
+ <!-- TOC:END -->
56
+
3
57
  **Never ship code without passing all quality gates.**
4
58
 
5
59
  ## The Quality Gates (8 blocking default-on + 3 advisory default-on + 1 opt-in)
@@ -1,5 +1,21 @@
1
1
  # Release Cadence (skill module)
2
2
 
3
+ <!-- TOC:START (generated by scripts/skill-toc.sh; do not edit) -->
4
+ ## Contents
5
+
6
+ - [1. The gate decision, and why two files appear to disagree](#1-the-gate-decision-and-why-two-files-appear-to-disagree)
7
+ - [1.1 The apparent contradiction, resolved](#11-the-apparent-contradiction-resolved)
8
+ - [2. What the fast tier must contain: the artifact rule](#2-what-the-fast-tier-must-contain-the-artifact-rule)
9
+ - [2.1 The two rules that generalise past packaging](#21-the-two-rules-that-generalise-past-packaging)
10
+ - [3. What the pipeline enforces for you](#3-what-the-pipeline-enforces-for-you)
11
+ - [4. The two ways a release silently publishes nothing](#4-the-two-ways-a-release-silently-publishes-nothing)
12
+ - [4.1 The VERSION bump must be the push HEAD](#41-the-version-bump-must-be-the-push-head)
13
+ - [4.2 Pushing during the window cancels the release's Tests](#42-pushing-during-the-window-cancels-the-releases-tests)
14
+ - [5. After the push: verify provenance, not the version string](#5-after-the-push-verify-provenance-not-the-version-string)
15
+ - [5.1 Confirm a release-critical fix THREE ways, never one](#51-confirm-a-release-critical-fix-three-ways-never-one)
16
+ - [6. The cadence, end to end](#6-the-cadence-end-to-end)
17
+ <!-- TOC:END -->
18
+
3
19
  **Purpose:** the shortest VERIFIED path from idea to published. Shortest and
4
20
  verified are both load-bearing; this repo has shipped fast and shipped nothing
5
21
  at the same time, four times in a row, and the cost was invisible for days.
@@ -1,5 +1,22 @@
1
1
  # SDLC Fleet Pattern (skill module)
2
2
 
3
+ <!-- TOC:START (generated by scripts/skill-toc.sh; do not edit) -->
4
+ ## Contents
5
+
6
+ - [When to invoke this pattern](#when-to-invoke-this-pattern)
7
+ - [The 6 roles](#the-6-roles)
8
+ - [1. Architect (1 agent, Plan subagent_type, model: opus)](#1-architect-1-agent-plan-subagent_type-model-opus)
9
+ - [2. Product Owner (the integrator, NOT a separate agent)](#2-product-owner-the-integrator-not-a-separate-agent)
10
+ - [3. Dev Fleet (3-5 principal engineers in parallel, model: opus)](#3-dev-fleet-3-5-principal-engineers-in-parallel-model-opus)
11
+ - [4. SDET (1-2 agents, model: opus)](#4-sdet-1-2-agents-model-opus)
12
+ - [5. Council Reviewers (3 agents, parallel, model: 2 opus + 1 sonnet)](#5-council-reviewers-3-agents-parallel-model-2-opus--1-sonnet)
13
+ - [6. Real-User QA (1 agent OR the integrator directly)](#6-real-user-qa-1-agent-or-the-integrator-directly)
14
+ - [Parallel-execution rules](#parallel-execution-rules)
15
+ - [Honest acknowledgements pattern](#honest-acknowledgements-pattern)
16
+ - [Reference run: v7.6.0 LSP integration](#reference-run-v760-lsp-integration)
17
+ - [Per-release checklist (always)](#per-release-checklist-always)
18
+ <!-- TOC:END -->
19
+
3
20
  **Established:** v7.7.4 (2026-05-24)
4
21
  **Origin:** user mandate "agent teams with senior most developers, Loki architects, sdet team and council of reviewers exist and coordinate and work in parallel"
5
22
  **Proven by:** v7.6.0 fleet ship (architect + 3 principal engineers + SDET + 3-reviewer council + real-user QA) demonstrated the pattern works end-to-end.
package/skills/testing.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Testing
2
2
 
3
+ <!-- TOC:START (generated by scripts/skill-toc.sh; do not edit) -->
4
+ ## Contents
5
+
6
+ - [Mandatory Testing Rules](#mandatory-testing-rules)
7
+ - [E2E Testing with Playwright MCP](#e2e-testing-with-playwright-mcp)
8
+ - [Property-Based Testing (Kiro Pattern)](#property-based-testing-kiro-pattern)
9
+ - [Event-Driven Hooks (Kiro Pattern)](#event-driven-hooks-kiro-pattern)
10
+ - [Visual Design Input](#visual-design-input)
11
+ - [Test Strategy by Phase](#test-strategy-by-phase)
12
+ - [Review-to-Memory Learning](#review-to-memory-learning)
13
+ <!-- TOC:END -->
14
+
3
15
  ## Mandatory Testing Rules
4
16
 
5
17
  1. Write tests FIRST. Commit the test before writing implementation.
@@ -1,5 +1,45 @@
1
1
  # Troubleshooting
2
2
 
3
+ <!-- TOC:START (generated by scripts/skill-toc.sh; do not edit) -->
4
+ ## Contents
5
+
6
+ - [Common Issues & Solutions](#common-issues--solutions)
7
+ - [Red Flags - Never Do These](#red-flags---never-do-these)
8
+ - [Implementation Anti-Patterns](#implementation-anti-patterns)
9
+ - [Review Anti-Patterns](#review-anti-patterns)
10
+ - [System Anti-Patterns](#system-anti-patterns)
11
+ - [Always Do These](#always-do-these)
12
+ - [Rationalization Tables](#rationalization-tables)
13
+ - [Common Agent Rationalizations](#common-agent-rationalizations)
14
+ - [Red Flag Detection Patterns](#red-flag-detection-patterns)
15
+ - [Enforcement Protocol](#enforcement-protocol)
16
+ - [Multi-Tiered Fallback System](#multi-tiered-fallback-system)
17
+ - [Model-Level Fallbacks](#model-level-fallbacks)
18
+ - [Workflow-Level Fallbacks](#workflow-level-fallbacks)
19
+ - [Human Escalation Triggers](#human-escalation-triggers)
20
+ - [Rate Limit Handling](#rate-limit-handling)
21
+ - [Circuit Breaker System](#circuit-breaker-system)
22
+ - [Recovery Procedures](#recovery-procedures)
23
+ - [Context Loss Recovery](#context-loss-recovery)
24
+ - [Rate Limit Recovery](#rate-limit-recovery)
25
+ - [Test Failure Recovery](#test-failure-recovery)
26
+ - [Dead Letter Queue](#dead-letter-queue)
27
+ - [Location](#location)
28
+ - [Schema](#schema)
29
+ - [Processing Protocol](#processing-protocol)
30
+ - [Retry Conditions](#retry-conditions)
31
+ - [Permanent Abandon Criteria](#permanent-abandon-criteria)
32
+ - [Recovery Strategies](#recovery-strategies)
33
+ - [Human Escalation Triggers](#human-escalation-triggers-1)
34
+ - [Agent Workflow for Dead Letter Processing](#agent-workflow-for-dead-letter-processing)
35
+ - [Signal Processing](#signal-processing)
36
+ - [DRIFT_DETECTED Signal](#drift_detected-signal)
37
+ - [HUMAN_REVIEW_NEEDED Signal](#human_review_needed-signal)
38
+ - [Healing Signals (v6.67.0)](#healing-signals-v6670)
39
+ - [Other Workflow Signals](#other-workflow-signals)
40
+ - [Signal Directory Structure](#signal-directory-structure)
41
+ <!-- TOC:END -->
42
+
3
43
  ## Common Issues & Solutions
4
44
 
5
45
  | Issue | Cause | Solution |
@@ -754,4 +794,4 @@ These signals coordinate parallel worktrees (see `skills/parallel-workflows.md`)
754
794
  PLAN_APPROVED # Plan mode approval
755
795
  ```
756
796
 
757
- **Cleanup:** Signals are consumed (deleted) by their processing handler. Only `DRIFT_DETECTED` persists as an append-only log for audit purposes.
797
+ **Cleanup:** Signals are consumed (deleted) by their processing handler. Only `DRIFT_DETECTED` persists as an append-only log for audit purposes.
@@ -1,4 +1,4 @@
1
- import{c as L,r as x,j as e,w as re,Z as ne,m as le,h as ie,p as P,F as ye,U as I,X as ce,L as de,x as oe,M as Ae,T as Z,S as we,l as xe,k as me,y as Ce,E as Fe,a0 as Se,a as U,a2 as he}from"./index-BMB47fiQ.js";import{B as C}from"./Button-BPOUvGtk.js";import{T as $e}from"./trending-up-CXVZ5vkw.js";import{C as z}from"./clock-BIEgg_GJ.js";import{A as Be,U as ue,M as De}from"./Avatar-CNr3zMt9.js";import{A as J}from"./activity-IB3YlI9q.js";import{R as pe}from"./refresh-cw-WqyzmGbv.js";import{G as ze}from"./globe-D8W2cVH_.js";import{C as Le}from"./chevron-left-D-ICnF5T.js";import{C as je}from"./check-C7E0WGL4.js";import{D as Y}from"./dollar-sign-Bnsh4Jq8.js";import{U as Te}from"./user-CSnRzMEQ.js";import{D as Me}from"./database-gBcDKVfn.js";import{L as Ue}from"./lock-DBl7GNrr.js";import{S as Re}from"./scroll-text-r-VNmnk_.js";import{S as Ie}from"./shield-alert-CU9Diuka.js";/**
1
+ import{c as L,r as x,j as e,w as re,Z as ne,m as le,h as ie,p as P,F as ye,U as I,X as ce,L as de,x as oe,M as Ae,T as Z,S as we,l as xe,k as me,y as Ce,E as Fe,a0 as Se,a as U,a2 as he}from"./index-CGIhXeB0.js";import{B as C}from"./Button-BOg2qFMK.js";import{T as $e}from"./trending-up-Cu0vmuAX.js";import{C as z}from"./clock-BdFy2s87.js";import{A as Be,U as ue,M as De}from"./Avatar-AVq-BBUz.js";import{A as J}from"./activity-DoYq1Z4M.js";import{R as pe}from"./refresh-cw-DFE5RmgT.js";import{G as ze}from"./globe-Dx80kAI0.js";import{C as Le}from"./chevron-left-DHQHGUiI.js";import{C as je}from"./check-S_mzCWxV.js";import{D as Y}from"./dollar-sign-JcYLq2s0.js";import{U as Te}from"./user-CPG0fF2X.js";import{D as Me}from"./database-DFhZ-uHK.js";import{L as Ue}from"./lock-B1CRcUxR.js";import{S as Re}from"./scroll-text-B189mONr.js";import{S as Ie}from"./shield-alert-BQQIizhH.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as l,j as s}from"./index-BMB47fiQ.js";/**
1
+ import{c as l,j as s}from"./index-CGIhXeB0.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{j as e}from"./index-BMB47fiQ.js";import{C as r}from"./clock-BIEgg_GJ.js";import{C as a}from"./circle-alert-CZqV3x2-.js";import{C as l}from"./check-C7E0WGL4.js";const i={completed:"bg-[#1FC5A8]/10 text-[#1FC5A8]",running:"bg-[#553DE9]/10 text-[#553DE9]",failed:"bg-[#C45B5B]/10 text-[#C45B5B]",started:"bg-[#D4A03C]/10 text-[#D4A03C]",empty:"bg-[#F8F4F0] text-[#6B6960]",version:"bg-[#553DE9]/10 text-[#553DE9]"};function o({status:t}){switch(t){case"completed":return e.jsx(l,{size:12});case"running":return e.jsxs("span",{className:"relative flex h-2 w-2",children:[e.jsx("span",{className:"animate-ping motion-reduce:animate-none absolute inline-flex h-full w-full rounded-full bg-current opacity-75"}),e.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-current"})]});case"failed":return e.jsx(a,{size:12});case"started":return e.jsx(r,{size:12});default:return null}}function f({status:t,children:n,className:s=""}){return e.jsxs("span",{className:["inline-flex items-center gap-1 rounded-btn px-2.5 py-0.5 text-xs font-semibold",i[t],s].filter(Boolean).join(" "),children:[e.jsx(o,{status:t}),n]})}export{f as B};
1
+ import{j as e}from"./index-CGIhXeB0.js";import{C as r}from"./clock-BdFy2s87.js";import{C as a}from"./circle-alert-Bc0XFZyt.js";import{C as l}from"./check-S_mzCWxV.js";const i={completed:"bg-[#1FC5A8]/10 text-[#1FC5A8]",running:"bg-[#553DE9]/10 text-[#553DE9]",failed:"bg-[#C45B5B]/10 text-[#C45B5B]",started:"bg-[#D4A03C]/10 text-[#D4A03C]",empty:"bg-[#F8F4F0] text-[#6B6960]",version:"bg-[#553DE9]/10 text-[#553DE9]"};function o({status:t}){switch(t){case"completed":return e.jsx(l,{size:12});case"running":return e.jsxs("span",{className:"relative flex h-2 w-2",children:[e.jsx("span",{className:"animate-ping motion-reduce:animate-none absolute inline-flex h-full w-full rounded-full bg-current opacity-75"}),e.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-current"})]});case"failed":return e.jsx(a,{size:12});case"started":return e.jsx(r,{size:12});default:return null}}function f({status:t,children:n,className:s=""}){return e.jsxs("span",{className:["inline-flex items-center gap-1 rounded-btn px-2.5 py-0.5 text-xs font-semibold",i[t],s].filter(Boolean).join(" "),children:[e.jsx(o,{status:t}),n]})}export{f as B};
@@ -1 +1 @@
1
- import{r as p,j as t}from"./index-BMB47fiQ.js";const m={primary:"bg-[#553DE9] text-white hover:bg-[#4432c4] shadow-button rounded-btn",secondary:"border border-[#553DE9] text-[#553DE9] hover:bg-[#E8E4FD] bg-transparent rounded-btn",ghost:"text-[#36342E] hover:bg-[#F8F4F0] rounded-btn",danger:"bg-[#C45B5B]/10 text-[#C45B5B] border border-[#C45B5B]/20 hover:bg-[#C45B5B]/20 rounded-btn"},b={sm:"px-3 py-1.5 text-xs",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"},u={sm:14,md:16,lg:18};function h({size:e}){return t.jsxs("svg",{className:"animate-spin",width:e,height:e,viewBox:"0 0 24 24",fill:"none",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]})}const B=p.forwardRef(({variant:e="primary",size:o="md",icon:n,iconRight:i,loading:r=!1,disabled:a,className:c="",children:l,...x},d)=>{const s=u[o];return t.jsxs("button",{ref:d,disabled:a||r,className:["inline-flex items-center justify-center gap-2 font-medium transition-colors",m[e],b[o],(a||r)&&"opacity-60 cursor-not-allowed",c].filter(Boolean).join(" "),...x,children:[r?t.jsx(h,{size:s}):n?t.jsx(n,{size:s}):null,l,i&&!r&&t.jsx(i,{size:s})]})});B.displayName="Button";export{B};
1
+ import{r as p,j as t}from"./index-CGIhXeB0.js";const m={primary:"bg-[#553DE9] text-white hover:bg-[#4432c4] shadow-button rounded-btn",secondary:"border border-[#553DE9] text-[#553DE9] hover:bg-[#E8E4FD] bg-transparent rounded-btn",ghost:"text-[#36342E] hover:bg-[#F8F4F0] rounded-btn",danger:"bg-[#C45B5B]/10 text-[#C45B5B] border border-[#C45B5B]/20 hover:bg-[#C45B5B]/20 rounded-btn"},b={sm:"px-3 py-1.5 text-xs",md:"px-4 py-2 text-sm",lg:"px-6 py-3 text-base"},u={sm:14,md:16,lg:18};function h({size:e}){return t.jsxs("svg",{className:"animate-spin",width:e,height:e,viewBox:"0 0 24 24",fill:"none",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]})}const B=p.forwardRef(({variant:e="primary",size:o="md",icon:n,iconRight:i,loading:r=!1,disabled:a,className:c="",children:l,...x},d)=>{const s=u[o];return t.jsxs("button",{ref:d,disabled:a||r,className:["inline-flex items-center justify-center gap-2 font-medium transition-colors",m[e],b[o],(a||r)&&"opacity-60 cursor-not-allowed",c].filter(Boolean).join(" "),...x,children:[r?t.jsx(h,{size:s}):n?t.jsx(n,{size:s}):null,l,i&&!r&&t.jsx(i,{size:s})]})});B.displayName="Button";export{B};
@@ -1,4 +1,4 @@
1
- import{c as $,r as l,j as e,G as we,Q as Se,F as Ce,h as Re,T as U,Z as Ee,a as S,V as Me,S as $e,Y as Te,X as Pe,P as ie,i as Ae,g as ze,C as Ie,l as Le,N as I,J as _e,K as De,O as Fe,u as Oe}from"./index-BMB47fiQ.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-_w7Oyx3U.js";import{C as qe,F as Ge,M as Ue,H as Ke,a as We,G as Ve,T as Qe}from"./thumbs-up-Ds9MPsEN.js";import{C as oe}from"./check-C7E0WGL4.js";import{C as Ye}from"./clock-BIEgg_GJ.js";import{D as Xe}from"./dollar-sign-Bnsh4Jq8.js";import{U as Ze}from"./upload-DiB_d7Yc.js";import{L as V}from"./loader-circle-BGagtH3f.js";/**
1
+ import{c as $,r as l,j as e,G as we,Q as Se,F as Ce,h as Re,T as U,Z as Ee,a as S,V as Me,S as $e,Y as Te,X as Pe,P as ie,i as Ae,g as ze,C as Ie,l as Le,N as I,J as _e,K as De,O as Fe,u as Oe}from"./index-CGIhXeB0.js";import{P as K,S as He,E as Be}from"./ErrorBoundary-Be-tq62u.js";import{C as qe,F as Ge,M as Ue,H as Ke,a as We,G as Ve,T as Qe}from"./thumbs-up-CMkSaDGZ.js";import{C as oe}from"./check-S_mzCWxV.js";import{C as Ye}from"./clock-BdFy2s87.js";import{D as Xe}from"./dollar-sign-JcYLq2s0.js";import{U as Ze}from"./upload-l80dpaxu.js";import{L as V}from"./loader-circle-D5gsWJnZ.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as o,j as e}from"./index-BMB47fiQ.js";function f({value:r,prefix:t="",suffix:s=""}){const[u,n]=o.useState(0),c=o.useRef(0);return o.useEffect(()=>{const a=c.current,h=r-a;if(h===0)return;const i=600,d=performance.now();function l(b){const v=b-d,m=Math.min(v/i,1),N=1-Math.pow(1-m,3),p=Math.round(a+h*N);n(p),c.current=p,m<1&&requestAnimationFrame(l)}requestAnimationFrame(l)},[r]),e.jsxs("span",{className:"tabular-nums",children:[t,u.toLocaleString(),s]})}function g(){const[r,t]=o.useState(5),[s,u]=o.useState(30),[n,c]=o.useState(75),a=.4,i=Math.round(r*s*a*4.33),d=Math.round(i*n);return e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-6 shadow-sm",children:[e.jsx("h3",{className:"text-lg font-bold text-[#36342E] mb-1",children:"ROI Calculator"}),e.jsx("p",{className:"text-sm text-[#6B6960] mb-6",children:"Estimate how much your team could save with autonomous development."}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Team size"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[r," developers"]})]}),e.jsx("input",{type:"range",min:1,max:50,value:r,onChange:l=>t(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"1"}),e.jsx("span",{children:"50"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Hours coding per week"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[s,"h"]})]}),e.jsx("input",{type:"range",min:5,max:60,value:s,onChange:l=>u(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"5h"}),e.jsx("span",{children:"60h"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Average hourly rate"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:["$",n,"/hr"]})]}),e.jsx("input",{type:"range",min:25,max:250,step:5,value:n,onChange:l=>c(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"$25"}),e.jsx("span",{children:"$250"})]})]})]}),e.jsxs("div",{className:"mt-6 pt-6 border-t border-[#ECEAE3]",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#553DE9]",children:e.jsx(f,{value:i,suffix:"h"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. hours saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#1FC5A8]",children:e.jsx(f,{value:d,prefix:"$"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. cost saved / month"})]})]}),e.jsxs("div",{className:"mt-4 p-3 rounded-lg bg-[#553DE9]/5 border border-[#553DE9]/10",children:[e.jsxs("p",{className:"text-sm text-[#36342E] text-center",children:["If Loki Mode saved ",Math.round(a*100),"% of coding time, your team could save"," ",e.jsxs("span",{className:"font-bold text-[#553DE9]",children:[i.toLocaleString()," hours"]})," ","and"," ",e.jsxs("span",{className:"font-bold text-[#1FC5A8]",children:["$",d.toLocaleString()]})," ","per month."]}),e.jsxs("p",{className:"mt-2 text-xs text-[#6B6960] text-center",children:["The ",Math.round(a*100),"% is an assumption, not a measurement. Model and API spend is not included."]})]})]})]})}const j=[{feature:"Claude (Opus/Sonnet/Haiku)",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!0},{feature:"GPT-4o / Codex",category:"AI Models",lokiMode:!0,boltNew:!0,replit:!0,lovable:!1},{feature:"5-provider auto-failover",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"8 automated quality gates",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Blind 3-reviewer code review",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Anti-sycophancy checks",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Automated test generation",category:"Quality",lokiMode:!0,boltNew:!1,replit:"Partial",lovable:!1},{feature:"Docker container generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"CI/CD pipeline generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"One-click cloud deploy",category:"Deployment",lokiMode:"Planned",boltNew:!0,replit:!0,lovable:!0},{feature:"Self-hosted (your keys)",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Free tier available",category:"Cost",lokiMode:"Source-available (BUSL-1.1)",boltNew:!0,replit:!0,lovable:!0},{feature:"No vendor lock-in",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"SSO / OIDC authentication",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"RBAC access control",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Audit logging",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Air-gapped deployment",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1}];function y(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function w(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#C45B5B]/40",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function x({value:r}){return typeof r=="string"?e.jsx("span",{className:"text-xs text-[#6B6960] font-medium",children:r}):r?e.jsx(y,{}):e.jsx(w,{})}const k=[{title:"Full Autonomy",description:"Describe what you want. Loki Mode handles planning, coding, testing, and verification automatically.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#553DE9]",children:e.jsx("path",{d:"M13 2L3 14h9l-1 8 10-12h-9l1-8z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Production Quality",description:"8 quality gates, blind code review, and anti-sycophancy checks ensure code that actually works.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Your Infrastructure",description:"Self-hosted, source-available (BUSL-1.1), no data leaves your network. Use your own API keys across 5 providers.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#2F71E3]",children:[e.jsx("rect",{x:"2",y:"2",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("rect",{x:"2",y:"14",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("circle",{cx:"6",cy:"6",r:"1",fill:"currentColor"}),e.jsx("circle",{cx:"6",cy:"18",r:"1",fill:"currentColor"})]})},{title:"Built for Teams",description:"Enterprise auth, RBAC, audit logs, and parallel workflows for teams of any size.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#E93D82]",children:[e.jsx("path",{d:"M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),e.jsx("circle",{cx:"9",cy:"7",r:"4",stroke:"currentColor",strokeWidth:"2"}),e.jsx("path",{d:"M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}];function C(){const r=[...new Set(j.map(t=>t.category))];return e.jsx("div",{className:"min-h-screen bg-[#FAF9F6]",children:e.jsxs("div",{className:"max-w-6xl mx-auto px-6 py-8",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-2xl font-bold text-[#36342E]",children:"Compare"}),e.jsx("p",{className:"text-[#6B6960] mt-1",children:"See how Loki Mode stacks up against other AI development platforms."})]}),e.jsx("div",{className:"bg-white border border-[#ECEAE3] rounded-xl overflow-hidden shadow-sm",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[#ECEAE3]",children:[e.jsx("th",{className:"text-left px-4 py-3 font-medium text-[#6B6960] w-[240px]",children:"Feature"}),e.jsx("th",{className:"text-center px-4 py-3 font-bold text-[#553DE9] bg-[#553DE9]/5 w-[130px]",children:"Loki Mode"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"bolt.new"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Replit"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Lovable"})]})}),e.jsx("tbody",{children:r.map(t=>e.jsxs(e.Fragment,{children:[e.jsx("tr",{className:"bg-[#FAF9F6]",children:e.jsx("td",{colSpan:5,className:"px-4 py-2 text-xs font-bold text-[#939084] uppercase tracking-wider",children:t})},`cat-${t}`),j.filter(s=>s.category===t).map(s=>e.jsxs("tr",{className:"border-b border-[#ECEAE3] last:border-b-0",children:[e.jsx("td",{className:"px-4 py-2.5 text-[#36342E]",children:s.feature}),e.jsx("td",{className:"px-4 py-2.5 text-center bg-[#553DE9]/5",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lokiMode})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.boltNew})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.replit})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lovable})})})]},s.feature))]}))})]})})}),e.jsxs("div",{className:"mt-12",children:[e.jsx("h2",{className:"text-xl font-bold text-[#36342E] mb-6",children:"Why developers choose Loki Mode"}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-5",children:k.map(t=>e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-5 shadow-sm hover:shadow-md transition-shadow",children:[e.jsx("div",{className:"mb-3",children:t.icon}),e.jsx("h3",{className:"text-base font-bold text-[#36342E] mb-1",children:t.title}),e.jsx("p",{className:"text-sm text-[#6B6960]",children:t.description})]},t.title))})]}),e.jsx("div",{className:"mt-12 max-w-xl mx-auto",children:e.jsx(g,{})})]})})}export{C as default};
1
+ import{r as o,j as e}from"./index-CGIhXeB0.js";function f({value:r,prefix:t="",suffix:s=""}){const[u,n]=o.useState(0),c=o.useRef(0);return o.useEffect(()=>{const a=c.current,h=r-a;if(h===0)return;const i=600,d=performance.now();function l(b){const v=b-d,m=Math.min(v/i,1),N=1-Math.pow(1-m,3),p=Math.round(a+h*N);n(p),c.current=p,m<1&&requestAnimationFrame(l)}requestAnimationFrame(l)},[r]),e.jsxs("span",{className:"tabular-nums",children:[t,u.toLocaleString(),s]})}function g(){const[r,t]=o.useState(5),[s,u]=o.useState(30),[n,c]=o.useState(75),a=.4,i=Math.round(r*s*a*4.33),d=Math.round(i*n);return e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-6 shadow-sm",children:[e.jsx("h3",{className:"text-lg font-bold text-[#36342E] mb-1",children:"ROI Calculator"}),e.jsx("p",{className:"text-sm text-[#6B6960] mb-6",children:"Estimate how much your team could save with autonomous development."}),e.jsxs("div",{className:"space-y-5",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Team size"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[r," developers"]})]}),e.jsx("input",{type:"range",min:1,max:50,value:r,onChange:l=>t(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"1"}),e.jsx("span",{children:"50"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Hours coding per week"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:[s,"h"]})]}),e.jsx("input",{type:"range",min:5,max:60,value:s,onChange:l=>u(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"5h"}),e.jsx("span",{children:"60h"})]})]}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("label",{className:"text-sm font-medium text-[#36342E]",children:"Average hourly rate"}),e.jsxs("span",{className:"text-sm font-semibold text-[#553DE9] tabular-nums",children:["$",n,"/hr"]})]}),e.jsx("input",{type:"range",min:25,max:250,step:5,value:n,onChange:l=>c(Number(l.target.value)),className:"w-full h-2 bg-[#ECEAE3] rounded-full appearance-none cursor-pointer accent-[#553DE9]"}),e.jsxs("div",{className:"flex justify-between text-xs text-[#939084] mt-1",children:[e.jsx("span",{children:"$25"}),e.jsx("span",{children:"$250"})]})]})]}),e.jsxs("div",{className:"mt-6 pt-6 border-t border-[#ECEAE3]",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 text-center",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#553DE9]",children:e.jsx(f,{value:i,suffix:"h"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. hours saved / month"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-2xl font-bold text-[#1FC5A8]",children:e.jsx(f,{value:d,prefix:"$"})}),e.jsx("div",{className:"text-xs text-[#6B6960] mt-1",children:"Est. cost saved / month"})]})]}),e.jsxs("div",{className:"mt-4 p-3 rounded-lg bg-[#553DE9]/5 border border-[#553DE9]/10",children:[e.jsxs("p",{className:"text-sm text-[#36342E] text-center",children:["If Loki Mode saved ",Math.round(a*100),"% of coding time, your team could save"," ",e.jsxs("span",{className:"font-bold text-[#553DE9]",children:[i.toLocaleString()," hours"]})," ","and"," ",e.jsxs("span",{className:"font-bold text-[#1FC5A8]",children:["$",d.toLocaleString()]})," ","per month."]}),e.jsxs("p",{className:"mt-2 text-xs text-[#6B6960] text-center",children:["The ",Math.round(a*100),"% is an assumption, not a measurement. Model and API spend is not included."]})]})]})]})}const j=[{feature:"Claude (Opus/Sonnet/Haiku)",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!0},{feature:"GPT-4o / Codex",category:"AI Models",lokiMode:!0,boltNew:!0,replit:!0,lovable:!1},{feature:"5-provider auto-failover",category:"AI Models",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"8 automated quality gates",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Blind 3-reviewer code review",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Anti-sycophancy checks",category:"Quality",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Automated test generation",category:"Quality",lokiMode:!0,boltNew:!1,replit:"Partial",lovable:!1},{feature:"Docker container generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"CI/CD pipeline generation",category:"Deployment",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"One-click cloud deploy",category:"Deployment",lokiMode:"Planned",boltNew:!0,replit:!0,lovable:!0},{feature:"Self-hosted (your keys)",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"Free tier available",category:"Cost",lokiMode:"Source-available (BUSL-1.1)",boltNew:!0,replit:!0,lovable:!0},{feature:"No vendor lock-in",category:"Cost",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1},{feature:"SSO / OIDC authentication",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"RBAC access control",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Audit logging",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!0,lovable:!1},{feature:"Air-gapped deployment",category:"Enterprise",lokiMode:!0,boltNew:!1,replit:!1,lovable:!1}];function y(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M20 6L9 17l-5-5",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})})}function w(){return e.jsx("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",className:"text-[#C45B5B]/40",children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})}function x({value:r}){return typeof r=="string"?e.jsx("span",{className:"text-xs text-[#6B6960] font-medium",children:r}):r?e.jsx(y,{}):e.jsx(w,{})}const k=[{title:"Full Autonomy",description:"Describe what you want. Loki Mode handles planning, coding, testing, and verification automatically.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#553DE9]",children:e.jsx("path",{d:"M13 2L3 14h9l-1 8 10-12h-9l1-8z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Production Quality",description:"8 quality gates, blind code review, and anti-sycophancy checks ensure code that actually works.",icon:e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#1FC5A8]",children:e.jsx("path",{d:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})},{title:"Your Infrastructure",description:"Self-hosted, source-available (BUSL-1.1), no data leaves your network. Use your own API keys across 5 providers.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#2F71E3]",children:[e.jsx("rect",{x:"2",y:"2",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("rect",{x:"2",y:"14",width:"20",height:"8",rx:"2",stroke:"currentColor",strokeWidth:"2"}),e.jsx("circle",{cx:"6",cy:"6",r:"1",fill:"currentColor"}),e.jsx("circle",{cx:"6",cy:"18",r:"1",fill:"currentColor"})]})},{title:"Built for Teams",description:"Enterprise auth, RBAC, audit logs, and parallel workflows for teams of any size.",icon:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",className:"text-[#E93D82]",children:[e.jsx("path",{d:"M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),e.jsx("circle",{cx:"9",cy:"7",r:"4",stroke:"currentColor",strokeWidth:"2"}),e.jsx("path",{d:"M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})]})}];function C(){const r=[...new Set(j.map(t=>t.category))];return e.jsx("div",{className:"min-h-screen bg-[#FAF9F6]",children:e.jsxs("div",{className:"max-w-6xl mx-auto px-6 py-8",children:[e.jsxs("div",{className:"mb-8",children:[e.jsx("h1",{className:"text-2xl font-bold text-[#36342E]",children:"Compare"}),e.jsx("p",{className:"text-[#6B6960] mt-1",children:"See how Loki Mode stacks up against other AI development platforms."})]}),e.jsx("div",{className:"bg-white border border-[#ECEAE3] rounded-xl overflow-hidden shadow-sm",children:e.jsx("div",{className:"overflow-x-auto",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:"border-b border-[#ECEAE3]",children:[e.jsx("th",{className:"text-left px-4 py-3 font-medium text-[#6B6960] w-[240px]",children:"Feature"}),e.jsx("th",{className:"text-center px-4 py-3 font-bold text-[#553DE9] bg-[#553DE9]/5 w-[130px]",children:"Loki Mode"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"bolt.new"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Replit"}),e.jsx("th",{className:"text-center px-4 py-3 font-medium text-[#6B6960] w-[130px]",children:"Lovable"})]})}),e.jsx("tbody",{children:r.map(t=>e.jsxs(e.Fragment,{children:[e.jsx("tr",{className:"bg-[#FAF9F6]",children:e.jsx("td",{colSpan:5,className:"px-4 py-2 text-xs font-bold text-[#939084] uppercase tracking-wider",children:t})},`cat-${t}`),j.filter(s=>s.category===t).map(s=>e.jsxs("tr",{className:"border-b border-[#ECEAE3] last:border-b-0",children:[e.jsx("td",{className:"px-4 py-2.5 text-[#36342E]",children:s.feature}),e.jsx("td",{className:"px-4 py-2.5 text-center bg-[#553DE9]/5",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lokiMode})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.boltNew})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.replit})})}),e.jsx("td",{className:"px-4 py-2.5 text-center",children:e.jsx("div",{className:"flex justify-center",children:e.jsx(x,{value:s.lovable})})})]},s.feature))]}))})]})})}),e.jsxs("div",{className:"mt-12",children:[e.jsx("h2",{className:"text-xl font-bold text-[#36342E] mb-6",children:"Why developers choose Loki Mode"}),e.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-5",children:k.map(t=>e.jsxs("div",{className:"bg-white border border-[#ECEAE3] rounded-xl p-5 shadow-sm hover:shadow-md transition-shadow",children:[e.jsx("div",{className:"mb-3",children:t.icon}),e.jsx("h3",{className:"text-base font-bold text-[#36342E] mb-1",children:t.title}),e.jsx("p",{className:"text-sm text-[#6B6960]",children:t.description})]},t.title))})]}),e.jsx("div",{className:"mt-12 max-w-xl mx-auto",children:e.jsx(g,{})})]})})}export{C as default};
@@ -1,4 +1,4 @@
1
- import{c as o,r as a,j as e,T as n,h as i,p as c}from"./index-BMB47fiQ.js";/**
1
+ import{c as o,r as a,j as e,T as n,h as i,p as c}from"./index-CGIhXeB0.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r as l,a as x,j as e}from"./index-BMB47fiQ.js";const N={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"The server recomputed the integrity hash and it matches, and the gpg signature verified against its keyring.",notProven:"That the code is correct, or that the recorded diff still matches your repo. A receipt records which checks ran, not that the result is right."},unsigned:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Unsigned",proven:"The server recomputed the integrity hash and it matches these receipt bytes.",notProven:"Who produced it. An unsigned receipt is forgeable: whoever controls the builder can rewrite the facts and recompute the hash."},unchecked:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Not checked",proven:"The server recomputed the integrity hash and it matches.",notProven:"Provenance. A signature is present but was not evaluated here, which is not the same as a bad signature."},tampered:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Tampered",proven:"Nothing. The server recomputed the integrity hash and it does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."},failed:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Failed verification",proven:"Nothing. A verification check ran on the server and said no.",notProven:"Anything the receipt claims. Read the reason below."},not_verified:{badge:"border-muted/20 text-muted",dot:"bg-muted/40",label:"Not verified here",proven:"Nothing. No verification result was computed for this receipt here.",notProven:"Integrity or provenance. Run the command below to check it yourself."}};function w(t){const n=t==null?void 0:t.integrity_check,r=t==null?void 0:t.verification;return n?n.status==="tampered"?"tampered":n.status==="failed"?"failed":n.status!=="verified"?"not_verified":n.gpg_ok===!0?"verified":r!=null&&r.attestation||r!=null&&r.gpg_signature?"unchecked":"unsigned":"not_verified"}const v=[{key:"verified",label:"Verified",bar:"bg-success",text:"text-success"},{key:"with_gaps",label:"With gaps",bar:"bg-warning",text:"text-warning"},{key:"not_verified",label:"Not verified",bar:"bg-danger",text:"text-danger"},{key:"unknown",label:"Unknown",bar:"bg-muted/40",text:"text-muted"}];function y({summary:t}){const n=t.total_receipts;return n?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex h-1.5 rounded-full overflow-hidden bg-muted/10",children:v.map(({key:r,bar:s})=>{const i=t[r];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${r}`},r):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:v.map(({key:r,label:s,text:i})=>{const c=t[r];return c?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:c})," ",s.toLowerCase()]},r):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function u({label:t,value:n}){return e.jsxs("div",{className:"flex items-baseline gap-2 text-xs",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:t}),e.jsx("span",{className:"font-mono truncate",title:n,children:n})]})}function k({proof:t}){var m,p,g,f,b;const[n,r]=l.useState(!1),[s,i]=l.useState(null),[c,d]=l.useState(null);l.useEffect(()=>{if(!n||s||c)return;let o=!1;return x.getProof(t.run_id).then(h=>{o||i(h)}).catch(h=>{o||d((h==null?void 0:h.message)||"could not load this receipt")}),()=>{o=!0}},[n,t.run_id,s,c]);const a=N[w(s)],j=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?a.badge:"border-muted/20"}`,children:[e.jsxs("button",{type:"button",className:"w-full flex items-center gap-3 px-3 py-2.5 text-left",onClick:()=>r(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?a.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline?`Recorded: ${t.headline}`:t.run_id}),t.final_verdict&&e.jsxs("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children:["council ",t.final_verdict]}),e.jsx("span",{className:"text-muted text-xs flex-shrink-0",children:n?"−":"+"})]}),n&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-current/10 pt-3",children:[c&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",c]}),!c&&!s&&e.jsx("p",{className:"text-xs text-muted",children:"Loading receipt…"}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{label:"Run",value:s.run_id}),e.jsx(u,{label:"Generated",value:j}),e.jsx(u,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(u,{label:"Cost",value:typeof((m=s.cost)==null?void 0:m.usd)=="number"?`${s.cost.cost_partial===!0?"at least ":""}$${s.cost.usd.toFixed(2)}`:"unknown"}),e.jsx(u,{label:"Files changed",value:typeof((p=s.files_changed)==null?void 0:p.count)=="number"?String(s.files_changed.count):"unknown"}),((g=s.verification)==null?void 0:g.hash)&&e.jsx(u,{label:"Recorded hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${a.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:a.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),a.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),a.notProven]}),(((f=s.integrity_check)==null?void 0:f.reasons)||[]).slice(0,2).map(o=>e.jsx("p",{className:"text-xs opacity-80 mt-1",children:o},o))]}),e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself (also re-derives the diff against your repo):"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(b=s.verification)!=null&&b.attestation?" --jwks <url|file>":""]})]}),t.pr_url&&e.jsx("a",{href:t.pr_url,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-primary underline",children:"View the pull request"})]})]})]})}function P(){const[t,n]=l.useState(null),[r,s]=l.useState(null),[i,c]=l.useState(null);return l.useEffect(()=>{let d=!1;return x.listProofs().then(a=>{d||n(a.proofs||[])}).catch(a=>{d||c((a==null?void 0:a.message)||"could not load receipts")}),x.proofsSummary().then(a=>{d||s(a)}).catch(()=>{}),()=>{d=!0}},[]),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Evidence Receipts"}),e.jsx("p",{className:"text-muted text-xs mt-1",children:"What each build actually checked, recorded so you can verify it yourself."})]}),i&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load receipts: ",i]}),!i&&t===null&&e.jsx("p",{className:"text-xs text-muted",children:"Loading…"}),r&&e.jsx(y,{summary:r}),t!==null&&t.length===0&&e.jsxs("p",{className:"text-xs text-muted",children:["No receipts yet. One is written at the end of each run (set ",e.jsx("code",{className:"font-mono",children:"LOKI_PROOF=0"})," to opt out)."]}),e.jsx("div",{className:"space-y-2",children:t==null?void 0:t.map(d=>e.jsx(k,{proof:d},d.run_id))})]})}export{P as E};
1
+ import{r as l,a as x,j as e}from"./index-CGIhXeB0.js";const N={verified:{badge:"bg-success/10 text-success border-success/20",dot:"bg-success",label:"Verified",proven:"The server recomputed the integrity hash and it matches, and the gpg signature verified against its keyring.",notProven:"That the code is correct, or that the recorded diff still matches your repo. A receipt records which checks ran, not that the result is right."},unsigned:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Unsigned",proven:"The server recomputed the integrity hash and it matches these receipt bytes.",notProven:"Who produced it. An unsigned receipt is forgeable: whoever controls the builder can rewrite the facts and recompute the hash."},unchecked:{badge:"bg-warning/10 text-warning border-warning/20",dot:"bg-warning",label:"Not checked",proven:"The server recomputed the integrity hash and it matches.",notProven:"Provenance. A signature is present but was not evaluated here, which is not the same as a bad signature."},tampered:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Tampered",proven:"Nothing. The server recomputed the integrity hash and it does not match the contents.",notProven:"Anything at all. This receipt was edited after it was written. Do not trust this build."},failed:{badge:"bg-danger/10 text-danger border-danger/20",dot:"bg-danger",label:"Failed verification",proven:"Nothing. A verification check ran on the server and said no.",notProven:"Anything the receipt claims. Read the reason below."},not_verified:{badge:"border-muted/20 text-muted",dot:"bg-muted/40",label:"Not verified here",proven:"Nothing. No verification result was computed for this receipt here.",notProven:"Integrity or provenance. Run the command below to check it yourself."}};function w(t){const n=t==null?void 0:t.integrity_check,r=t==null?void 0:t.verification;return n?n.status==="tampered"?"tampered":n.status==="failed"?"failed":n.status!=="verified"?"not_verified":n.gpg_ok===!0?"verified":r!=null&&r.attestation||r!=null&&r.gpg_signature?"unchecked":"unsigned":"not_verified"}const v=[{key:"verified",label:"Verified",bar:"bg-success",text:"text-success"},{key:"with_gaps",label:"With gaps",bar:"bg-warning",text:"text-warning"},{key:"not_verified",label:"Not verified",bar:"bg-danger",text:"text-danger"},{key:"unknown",label:"Unknown",bar:"bg-muted/40",text:"text-muted"}];function y({summary:t}){const n=t.total_receipts;return n?e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"flex h-1.5 rounded-full overflow-hidden bg-muted/10",children:v.map(({key:r,bar:s})=>{const i=t[r];return i?e.jsx("div",{className:s,style:{width:`${i/n*100}%`},title:`${i} ${r}`},r):null})}),e.jsx("div",{className:"flex flex-wrap gap-x-4 gap-y-1 text-xs",children:v.map(({key:r,label:s,text:i})=>{const c=t[r];return c?e.jsxs("span",{className:i,children:[e.jsx("span",{className:"font-semibold",children:c})," ",s.toLowerCase()]},r):null})}),e.jsxs("p",{className:"text-muted text-xs",children:["Recorded verdicts across ",n," receipt",n===1?"":"s",", not re-verified here."]})]}):null}function u({label:t,value:n}){return e.jsxs("div",{className:"flex items-baseline gap-2 text-xs",children:[e.jsx("span",{className:"text-muted w-28 flex-shrink-0",children:t}),e.jsx("span",{className:"font-mono truncate",title:n,children:n})]})}function k({proof:t}){var m,p,g,f,b;const[n,r]=l.useState(!1),[s,i]=l.useState(null),[c,d]=l.useState(null);l.useEffect(()=>{if(!n||s||c)return;let o=!1;return x.getProof(t.run_id).then(h=>{o||i(h)}).catch(h=>{o||d((h==null?void 0:h.message)||"could not load this receipt")}),()=>{o=!0}},[n,t.run_id,s,c]);const a=N[w(s)],j=t.generated_at?new Date(t.generated_at).toLocaleString():"unknown";return e.jsxs("div",{className:`border rounded-card overflow-hidden ${s?a.badge:"border-muted/20"}`,children:[e.jsxs("button",{type:"button",className:"w-full flex items-center gap-3 px-3 py-2.5 text-left",onClick:()=>r(!n),"aria-expanded":n,children:[e.jsx("span",{className:`w-2 h-2 rounded-full flex-shrink-0 ${s?a.dot:"bg-muted/40"}`}),e.jsx("span",{className:"text-sm font-medium flex-1 truncate",children:t.headline?`Recorded: ${t.headline}`:t.run_id}),t.final_verdict&&e.jsxs("span",{className:"text-xs font-mono uppercase tracking-wider flex-shrink-0 text-muted",children:["council ",t.final_verdict]}),e.jsx("span",{className:"text-muted text-xs flex-shrink-0",children:n?"−":"+"})]}),n&&e.jsxs("div",{className:"px-3 pb-3 space-y-3 border-t border-current/10 pt-3",children:[c&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load this receipt: ",c]}),!c&&!s&&e.jsx("p",{className:"text-xs text-muted",children:"Loading receipt…"}),s&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"space-y-1",children:[e.jsx(u,{label:"Run",value:s.run_id}),e.jsx(u,{label:"Generated",value:j}),e.jsx(u,{label:"Loki version",value:s.loki_version||"unknown"}),e.jsx(u,{label:"Cost",value:typeof((m=s.cost)==null?void 0:m.usd)=="number"?`${s.cost.cost_partial===!0?"at least ":""}$${s.cost.usd.toFixed(2)}`:"unknown"}),e.jsx(u,{label:"Files changed",value:typeof((p=s.files_changed)==null?void 0:p.count)=="number"?String(s.files_changed.count):"unknown"}),((g=s.verification)==null?void 0:g.hash)&&e.jsx(u,{label:"Recorded hash",value:s.verification.hash})]}),e.jsxs("div",{className:`rounded-card border px-3 py-2 ${a.badge}`,children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wider mb-1",children:a.label}),e.jsxs("p",{className:"text-xs mb-1",children:[e.jsx("span",{className:"font-semibold",children:"Proven: "}),a.proven]}),e.jsxs("p",{className:"text-xs opacity-80",children:[e.jsx("span",{className:"font-semibold",children:"Not proven: "}),a.notProven]}),(((f=s.integrity_check)==null?void 0:f.reasons)||[]).slice(0,2).map(o=>e.jsx("p",{className:"text-xs opacity-80 mt-1",children:o},o))]}),e.jsxs("p",{className:"text-xs text-muted",children:["Verify it yourself (also re-derives the diff against your repo):"," ",e.jsxs("code",{className:"font-mono",children:["loki proof verify ",s.run_id,(b=s.verification)!=null&&b.attestation?" --jwks <url|file>":""]})]}),t.pr_url&&e.jsx("a",{href:t.pr_url,target:"_blank",rel:"noreferrer noopener",className:"text-xs text-primary underline",children:"View the pull request"})]})]})]})}function P(){const[t,n]=l.useState(null),[r,s]=l.useState(null),[i,c]=l.useState(null);return l.useEffect(()=>{let d=!1;return x.listProofs().then(a=>{d||n(a.proofs||[])}).catch(a=>{d||c((a==null?void 0:a.message)||"could not load receipts")}),x.proofsSummary().then(a=>{d||s(a)}).catch(()=>{}),()=>{d=!0}},[]),e.jsxs("section",{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold",children:"Evidence Receipts"}),e.jsx("p",{className:"text-muted text-xs mt-1",children:"What each build actually checked, recorded so you can verify it yourself."})]}),i&&e.jsxs("p",{className:"text-xs text-danger",children:["Could not load receipts: ",i]}),!i&&t===null&&e.jsx("p",{className:"text-xs text-muted",children:"Loading…"}),r&&e.jsx(y,{summary:r}),t!==null&&t.length===0&&e.jsxs("p",{className:"text-xs text-muted",children:["No receipts yet. One is written at the end of each run (set ",e.jsx("code",{className:"font-mono",children:"LOKI_PROOF=0"})," to opt out)."]}),e.jsx("div",{className:"space-y-2",children:t==null?void 0:t.map(d=>e.jsx(k,{proof:d},d.run_id))})]})}export{P as E};
@@ -1,4 +1,4 @@
1
- import{c as _,r as o,a as k,j as e,m as B,J as v,N as h,a5 as H,M as L,l as q}from"./index-BMB47fiQ.js";import{B as N}from"./Button-BPOUvGtk.js";import{C as y}from"./thumbs-up-Ds9MPsEN.js";import{R as S}from"./refresh-cw-WqyzmGbv.js";import{C as z}from"./circle-alert-CZqV3x2-.js";import{U as D}from"./user-CSnRzMEQ.js";import{L as G}from"./loader-circle-BGagtH3f.js";import{R as T}from"./rotate-ccw-BiOYJbPr.js";/**
1
+ import{c as _,r as o,a as k,j as e,m as B,J as v,N as h,a5 as H,M as L,l as q}from"./index-CGIhXeB0.js";import{B as N}from"./Button-BOg2qFMK.js";import{C as y}from"./thumbs-up-CMkSaDGZ.js";import{R as S}from"./refresh-cw-DFE5RmgT.js";import{C as z}from"./circle-alert-Bc0XFZyt.js";import{U as D}from"./user-CPG0fF2X.js";import{L as G}from"./loader-circle-D5gsWJnZ.js";import{R as T}from"./rotate-ccw-DVaCDpoi.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1,4 +1,4 @@
1
- import{c as I,r as c,a as b,j as e,G as me,A as ue,S as Z,k as ee,m as pe,h as he,p as fe,X as te,M as be}from"./index-BMB47fiQ.js";import{B as y}from"./Button-BPOUvGtk.js";import{C as ge}from"./chevron-left-D-ICnF5T.js";import{G as P}from"./thumbs-up-Ds9MPsEN.js";import{R as $}from"./refresh-cw-WqyzmGbv.js";import{C as Ne}from"./circle-alert-CZqV3x2-.js";import{L as Q,S as je}from"./ProjectPage-CWZw_DTd.js";import{S as se}from"./shield-alert-CU9Diuka.js";import{F as ye}from"./file-code-corner-BhXnk7-V.js";import{C as V}from"./clock-BIEgg_GJ.js";import{C as re}from"./check-C7E0WGL4.js";import"./ErrorBoundary-_w7Oyx3U.js";import"./TerminalOutput-Raof8c5U.js";import"./lock-DBl7GNrr.js";import"./package-BsZzFTn1.js";import"./file-plus-l1DKdi2E.js";import"./activity-IB3YlI9q.js";import"./scroll-text-r-VNmnk_.js";import"./bot-DsRGUgID.js";import"./loader-circle-BGagtH3f.js";import"./hammer-DFPCUfHe.js";import"./dollar-sign-Bnsh4Jq8.js";import"./globe-D8W2cVH_.js";import"./trash-2-CUqmSInK.js";import"./upload-DiB_d7Yc.js";import"./plus-D1iwT9Vz.js";import"./rotate-ccw-BiOYJbPr.js";import"./code-xml-BQYPTsLd.js";import"./trending-up-CXVZ5vkw.js";import"./layers-Dlu05krU.js";import"./trending-down-CIvvdZtN.js";import"./server-B-gocXVg.js";/**
1
+ import{c as I,r as c,a as b,j as e,G as me,A as ue,S as Z,k as ee,m as pe,h as he,p as fe,X as te,M as be}from"./index-CGIhXeB0.js";import{B as y}from"./Button-BOg2qFMK.js";import{C as ge}from"./chevron-left-DHQHGUiI.js";import{G as P}from"./thumbs-up-CMkSaDGZ.js";import{R as $}from"./refresh-cw-DFE5RmgT.js";import{C as Ne}from"./circle-alert-Bc0XFZyt.js";import{L as Q,S as je}from"./ProjectPage-CHbZsIUs.js";import{S as se}from"./shield-alert-BQQIizhH.js";import{F as ye}from"./file-code-corner-CfbFrxzM.js";import{C as V}from"./clock-BdFy2s87.js";import{C as re}from"./check-S_mzCWxV.js";import"./ErrorBoundary-Be-tq62u.js";import"./TerminalOutput-BHcgTkgY.js";import"./lock-B1CRcUxR.js";import"./package-B9YObxi2.js";import"./file-plus-CNGwBTPi.js";import"./activity-DoYq1Z4M.js";import"./scroll-text-B189mONr.js";import"./bot-WhQrzVl8.js";import"./loader-circle-D5gsWJnZ.js";import"./hammer-BSXFz8qY.js";import"./dollar-sign-JcYLq2s0.js";import"./globe-Dx80kAI0.js";import"./trash-2-CaevwAvU.js";import"./upload-l80dpaxu.js";import"./plus-CiKIplJ-.js";import"./rotate-ccw-DVaCDpoi.js";import"./code-xml-BGDz8B3H.js";import"./trending-up-Cu0vmuAX.js";import"./layers-CzZgAtpQ.js";import"./trending-down-ZAVX1hIK.js";import"./server-BtEO_lvf.js";/**
2
2
  * @license lucide-react v0.577.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.