loki-mode 7.7.2 → 7.7.4
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.
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/autonomy/run.sh +70 -0
- package/dashboard/__init__.py +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/loki-ts/dist/loki.js +2 -2
- package/mcp/__init__.py +1 -1
- package/package.json +1 -1
- package/skills/sdlc-fleet.md +145 -0
package/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: loki-mode
|
|
|
3
3
|
description: Multi-agent autonomous startup system. Triggers on "Loki Mode". Takes a spec (PRD, GitHub issue, OpenAPI doc, etc.) to deployed product with minimal human intervention. Requires --dangerously-skip-permissions flag.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Loki Mode v7.7.
|
|
6
|
+
# Loki Mode v7.7.4
|
|
7
7
|
|
|
8
8
|
**You are an autonomous agent. You make decisions. You do not ask questions. You do not stop.**
|
|
9
9
|
|
|
@@ -381,4 +381,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
|
|
|
381
381
|
|
|
382
382
|
---
|
|
383
383
|
|
|
384
|
-
**v7.7.
|
|
384
|
+
**v7.7.4 | [Autonomi](https://www.autonomi.dev/) flagship product | ~260 lines core**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
7.7.
|
|
1
|
+
7.7.4
|
package/autonomy/run.sh
CHANGED
|
@@ -8714,6 +8714,66 @@ except Exception as e:
|
|
|
8714
8714
|
PYEOF
|
|
8715
8715
|
}
|
|
8716
8716
|
|
|
8717
|
+
# v7.7.3 F-3 fix: intelligent USAGE.md regeneration. Called at session end
|
|
8718
|
+
# (after completion-promise fulfilled). Reads the FINAL project state
|
|
8719
|
+
# (file tree + package manifests + recent commits) and asks Claude
|
|
8720
|
+
# (haiku tier) to emit a USAGE.md tailored to the actual stack.
|
|
8721
|
+
#
|
|
8722
|
+
# Best-effort: any failure (no provider, network, parse) returns silently
|
|
8723
|
+
# without disrupting completion. Costs ~$0.01-0.05 per session (one
|
|
8724
|
+
# haiku call). Set LOKI_INTELLIGENT_USAGE=0 to skip entirely.
|
|
8725
|
+
_intelligent_usage_regen() {
|
|
8726
|
+
local target_dir="${TARGET_DIR:-.}"
|
|
8727
|
+
local usage_path="$target_dir/USAGE.md"
|
|
8728
|
+
# Find a working `claude` binary; if absent, bail silently.
|
|
8729
|
+
if ! command -v claude >/dev/null 2>&1; then
|
|
8730
|
+
return 0
|
|
8731
|
+
fi
|
|
8732
|
+
# Snapshot project state. Keep it small (< ~4 KiB) so the prompt
|
|
8733
|
+
# stays cache-stable across sessions.
|
|
8734
|
+
local _tree _manifests _commits _state_prompt
|
|
8735
|
+
_tree=$(cd "$target_dir" && find . -maxdepth 3 -type f \
|
|
8736
|
+
-not -path './node_modules/*' -not -path './.loki/*' \
|
|
8737
|
+
-not -path './.git/*' -not -path './venv/*' -not -path './.venv/*' \
|
|
8738
|
+
-not -path './dist/*' -not -path './build/*' 2>/dev/null | head -30)
|
|
8739
|
+
# Capture package manifests inline so the model sees real scripts.
|
|
8740
|
+
_manifests=""
|
|
8741
|
+
for f in package.json requirements.txt pyproject.toml Cargo.toml go.mod composer.json Gemfile; do
|
|
8742
|
+
if [ -f "$target_dir/$f" ]; then
|
|
8743
|
+
_manifests="${_manifests}=== $f ===\n$(head -50 "$target_dir/$f" 2>/dev/null)\n\n"
|
|
8744
|
+
fi
|
|
8745
|
+
done
|
|
8746
|
+
_commits=$(cd "$target_dir" && git log --oneline -10 2>/dev/null || true)
|
|
8747
|
+
|
|
8748
|
+
log_info "Regenerating USAGE.md from final project state (intelligent mode)..."
|
|
8749
|
+
local _ic_prompt="You are writing a USAGE.md for the project below. Detect the stack from the manifest files; emit a concise (under 100 lines) Markdown doc with sections: ## Prerequisites, ## Install, ## Start, ## Verify (2-3 copy-paste curl/browser/CLI commands with expected output), ## Stop. Use the ACTUAL command names from package.json scripts or pyproject entry points -- never generic placeholders. Output ONLY the Markdown body (no code-fence wrapper, no preamble).
|
|
8750
|
+
|
|
8751
|
+
=== Project tree (max 30 files, 3 levels deep) ===
|
|
8752
|
+
${_tree}
|
|
8753
|
+
|
|
8754
|
+
=== Manifest files ===
|
|
8755
|
+
${_manifests}
|
|
8756
|
+
|
|
8757
|
+
=== Last 10 commits ===
|
|
8758
|
+
${_commits}"
|
|
8759
|
+
|
|
8760
|
+
# Use haiku for cheap, fast generation. --dangerously-skip-permissions
|
|
8761
|
+
# because this is a one-shot non-interactive call.
|
|
8762
|
+
local _ic_out
|
|
8763
|
+
_ic_out=$(printf '%s' "$_ic_prompt" \
|
|
8764
|
+
| timeout 60 claude --dangerously-skip-permissions --model haiku -p - 2>/dev/null \
|
|
8765
|
+
| head -200)
|
|
8766
|
+
# Sanity check: response must look like Markdown (starts with # or ##).
|
|
8767
|
+
if [ -z "$_ic_out" ] || ! printf '%s' "$_ic_out" | head -1 | grep -qE '^#'; then
|
|
8768
|
+
log_info "Intelligent USAGE regen returned non-Markdown or empty; keeping existing USAGE.md."
|
|
8769
|
+
return 0
|
|
8770
|
+
fi
|
|
8771
|
+
printf '%s\n' "$_ic_out" > "$usage_path"
|
|
8772
|
+
log_info "USAGE.md regenerated intelligently from final project state -> $usage_path"
|
|
8773
|
+
return 0
|
|
8774
|
+
}
|
|
8775
|
+
|
|
8776
|
+
|
|
8717
8777
|
# Magic Modules COMPOUND: record successful component patterns (v6.77.0)
|
|
8718
8778
|
# Called at end of each iteration to capture generated/updated components
|
|
8719
8779
|
# as semantic memory patterns via magic.core.memory_bridge.
|
|
@@ -11544,6 +11604,16 @@ if __name__ == "__main__":
|
|
|
11544
11604
|
log_header "TASK COMPLETION CLAIMED (via loki_complete_task)"
|
|
11545
11605
|
fi
|
|
11546
11606
|
log_info "Explicit completion signal detected."
|
|
11607
|
+
# v7.7.3 F-3 fix: intelligent USAGE.md regeneration. The static
|
|
11608
|
+
# USAGE_DOC_INSTRUCTION in build_prompt gets the agent to write
|
|
11609
|
+
# SOMETHING; this hook re-runs a cheap model call with the FINAL
|
|
11610
|
+
# project state to refine that output (or write it if missing).
|
|
11611
|
+
# Default-on per the "no user flag" mandate; set
|
|
11612
|
+
# LOKI_INTELLIGENT_USAGE=0 to disable. Best-effort: failures
|
|
11613
|
+
# never block completion.
|
|
11614
|
+
if [ "${LOKI_INTELLIGENT_USAGE:-1}" != "0" ]; then
|
|
11615
|
+
_intelligent_usage_regen 2>/dev/null || true
|
|
11616
|
+
fi
|
|
11547
11617
|
# Run memory consolidation on successful completion
|
|
11548
11618
|
log_info "Running memory consolidation..."
|
|
11549
11619
|
run_memory_consolidation
|
package/dashboard/__init__.py
CHANGED
package/docs/INSTALLATION.md
CHANGED
package/loki-ts/dist/loki.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var _7=Object.defineProperty;var I7=(K)=>K;function P7(K,$){this[K]=I7.bind(null,$)}var b=(K,$)=>{for(var z in $)_7(K,z,{get:$[z],enumerable:!0,configurable:!0,set:P7.bind($,z)})};var R=(K,$)=>()=>(K&&($=K(K=0)),$);var V1=import.meta.require;var e1={};b(e1,{lokiDir:()=>P,homeLokiDir:()=>k1,findRepoRootForVersion:()=>N1,REPO_ROOT:()=>p});import{resolve as u,dirname as S1}from"path";import{fileURLToPath as L7}from"url";import{existsSync as J1}from"fs";import{homedir as R7}from"os";function E7(){let K=i1;for(let $=0;$<6;$++){if(J1(u(K,"VERSION"))&&J1(u(K,"autonomy/run.sh")))return K;let z=S1(K);if(z===K)break;K=z}return u(i1,"..","..","..")}function N1(K){let $=K;for(let z=0;z<6;z++){if(J1(u($,"VERSION"))&&J1(u($,"autonomy/run.sh")))return $;let Q=S1($);if(Q===$)break;$=Q}return u(K,"..","..","..")}function P(){return process.env.LOKI_DIR??u(process.cwd(),".loki")}function k1(){return u(R7(),".loki")}var i1,p;var y=R(()=>{i1=S1(L7(import.meta.url));p=E7()});import{readFileSync as x7}from"fs";import{resolve as F7,dirname as w7}from"path";import{fileURLToPath as S7}from"url";function G1(){if(n!==null)return n;let K="7.7.
|
|
2
|
+
var _7=Object.defineProperty;var I7=(K)=>K;function P7(K,$){this[K]=I7.bind(null,$)}var b=(K,$)=>{for(var z in $)_7(K,z,{get:$[z],enumerable:!0,configurable:!0,set:P7.bind($,z)})};var R=(K,$)=>()=>(K&&($=K(K=0)),$);var V1=import.meta.require;var e1={};b(e1,{lokiDir:()=>P,homeLokiDir:()=>k1,findRepoRootForVersion:()=>N1,REPO_ROOT:()=>p});import{resolve as u,dirname as S1}from"path";import{fileURLToPath as L7}from"url";import{existsSync as J1}from"fs";import{homedir as R7}from"os";function E7(){let K=i1;for(let $=0;$<6;$++){if(J1(u(K,"VERSION"))&&J1(u(K,"autonomy/run.sh")))return K;let z=S1(K);if(z===K)break;K=z}return u(i1,"..","..","..")}function N1(K){let $=K;for(let z=0;z<6;z++){if(J1(u($,"VERSION"))&&J1(u($,"autonomy/run.sh")))return $;let Q=S1($);if(Q===$)break;$=Q}return u(K,"..","..","..")}function P(){return process.env.LOKI_DIR??u(process.cwd(),".loki")}function k1(){return u(R7(),".loki")}var i1,p;var y=R(()=>{i1=S1(L7(import.meta.url));p=E7()});import{readFileSync as x7}from"fs";import{resolve as F7,dirname as w7}from"path";import{fileURLToPath as S7}from"url";function G1(){if(n!==null)return n;let K="7.7.4";if(typeof K==="string"&&K.length>0)return n=K,n;try{let $=w7(S7(import.meta.url)),z=N1($);n=x7(F7(z,"VERSION"),"utf-8").trim()}catch{n="unknown"}return n}var n=null;var D1=R(()=>{y()});var $0={};b($0,{runOrThrow:()=>N7,run:()=>S,commandVersion:()=>D7,commandExists:()=>D,ShellError:()=>C1});async function S(K,$={}){let z=Bun.spawn({cmd:[...K],stdout:"pipe",stderr:"pipe",env:$.env?{...process.env,...$.env}:process.env,cwd:$.cwd}),Q,X;if($.timeoutMs&&$.timeoutMs>0)Q=setTimeout(()=>{try{z.kill("SIGTERM")}catch{}X=setTimeout(()=>{try{z.kill("SIGKILL")}catch{}},2000)},$.timeoutMs);try{let[H,Z,q]=await Promise.all([new Response(z.stdout).text(),new Response(z.stderr).text(),z.exited]);return{stdout:H,stderr:Z,exitCode:q}}finally{if(Q)clearTimeout(Q);if(X)clearTimeout(X)}}async function N7(K,$={}){let z=await S(K,$);if(z.exitCode!==0)throw new C1(`command failed (${z.exitCode}): ${K.join(" ")}`,z.exitCode,z.stdout,z.stderr);return z}async function D(K){let $=k7(K),z=await S(["sh","-c",`command -v ${$}`],{timeoutMs:5000});if(z.exitCode===0)return z.stdout.trim()||null;return null}function k7(K){if(!/^[A-Za-z0-9._/-]+$/.test(K))throw Error(`refused to shell-escape suspect token: ${K}`);return K}async function D7(K,$="--version"){if(!await D(K))return null;let Q=await S([K,$],{timeoutMs:5000});if(Q.exitCode!==0)return null;return((Q.stdout||Q.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var C1;var c=R(()=>{C1=class C1 extends Error{message;exitCode;stdout;stderr;constructor(K,$,z,Q){super(K);this.message=K;this.exitCode=$;this.stdout=z;this.stderr=Q;this.name="ShellError"}}});function l(K){return C7?"":K}var C7,E,C,x,O6,O,k,F,W;var a=R(()=>{C7=(process.env.NO_COLOR??"").length>0;E=l("\x1B[0;31m"),C=l("\x1B[0;32m"),x=l("\x1B[1;33m"),O6=l("\x1B[0;34m"),O=l("\x1B[0;36m"),k=l("\x1B[1m"),F=l("\x1B[2m"),W=l("\x1B[0m")});import{existsSync as c7}from"fs";async function t(){if(z1!==void 0)return z1;let K="/opt/homebrew/bin/python3.12";if(c7(K))return z1=K,K;let $=await D("python3.12");if($)return z1=$,$;let z=await D("python3");return z1=z,z}async function s(K,$={}){let z=await t();if(!z)return{stdout:"",stderr:"python3 not found",exitCode:127};return S([z,"-c",K],$)}var z1;var Q1=R(()=>{c()});var G0={};b(G0,{runStatus:()=>z5});import{existsSync as N,readFileSync as Z1,readdirSync as H0,statSync as W0}from"fs";import{resolve as w,basename as a7}from"path";async function r7(){if(await D("jq"))return!0;return process.stdout.write(`${E}Error: jq is required but not installed.${W}
|
|
3
3
|
`),process.stdout.write(`Install with:
|
|
4
4
|
`),process.stdout.write(` brew install jq (macOS)
|
|
5
5
|
`),process.stdout.write(` apt install jq (Debian/Ubuntu)
|
|
@@ -550,4 +550,4 @@ Set LOKI_LEGACY_BASH=1 to force the bash CLI for every command.
|
|
|
550
550
|
`),2}default:return process.stderr.write(`Unknown command: ${$}
|
|
551
551
|
`),process.stderr.write(j7),2}}process.on("SIGINT",()=>process.exit(130));process.on("SIGTERM",()=>process.exit(143));var z6=await $6(Bun.argv.slice(2));process.exit(z6);
|
|
552
552
|
|
|
553
|
-
//# debugId=
|
|
553
|
+
//# debugId=3CF8E903E8680F4764756E2164756E21
|
package/mcp/__init__.py
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "loki-mode",
|
|
3
|
-
"version": "7.7.
|
|
3
|
+
"version": "7.7.4",
|
|
4
4
|
"description": "Loki Mode by Autonomi. Multi-agent autonomous SDLC framework. Spec to deployed app: PRD, GitHub issue, OpenAPI/JSON/YAML, or one-line brief. 4 AI providers (Claude Code, OpenAI Codex, Cline, Aider). 11 quality gates.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent",
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# SDLC Fleet Pattern (skill module)
|
|
2
|
+
|
|
3
|
+
**Established:** v7.7.4 (2026-05-24)
|
|
4
|
+
**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
|
+
**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.
|
|
6
|
+
|
|
7
|
+
This skill describes the STANDING pattern for shipping any non-trivial change in Loki Mode. The integrator (Claude Code session) is responsible for orchestrating the roles below. Each role is a Loki Agent call.
|
|
8
|
+
|
|
9
|
+
## When to invoke this pattern
|
|
10
|
+
|
|
11
|
+
Apply this pattern when shipping ANY of:
|
|
12
|
+
|
|
13
|
+
- A new feature touching > 3 files
|
|
14
|
+
- A bug fix touching agent runtime, council, memory, or auto-spawn surfaces
|
|
15
|
+
- A MINOR or MAJOR release
|
|
16
|
+
- A change with cross-route parity implications (bash + Bun + TS)
|
|
17
|
+
- A change the user has marked "critical" or "production-blocking"
|
|
18
|
+
|
|
19
|
+
Skip this pattern (acceptable shortcuts) when:
|
|
20
|
+
|
|
21
|
+
- Single-line typo fix in user-facing strings
|
|
22
|
+
- Pure docs edit (no code change)
|
|
23
|
+
- A revert of a previously-shipped change with no new logic
|
|
24
|
+
- An emergency hotfix where waiting on parallel agents would exceed the production-impact window
|
|
25
|
+
|
|
26
|
+
## The 6 roles
|
|
27
|
+
|
|
28
|
+
### 1. Architect (1 agent, Plan subagent_type, model: opus)
|
|
29
|
+
|
|
30
|
+
**Job:** Design the change end-to-end before any code is written. Produces a written plan saved as `docs/<TOPIC>-PLAN.md`.
|
|
31
|
+
|
|
32
|
+
**Inputs:** the original user directive verbatim + relevant source files + any prior council findings.
|
|
33
|
+
|
|
34
|
+
**Outputs:** a markdown plan with: scope, acceptance criteria, implementation steps, file-level diffs sketch, testing plan, risks + mitigations, NOT-tested honest disclosure.
|
|
35
|
+
|
|
36
|
+
**Output is BINDING** for the dev fleet -- don't change scope without re-architecting.
|
|
37
|
+
|
|
38
|
+
### 2. Product Owner (the integrator, NOT a separate agent)
|
|
39
|
+
|
|
40
|
+
**Job:** Lock scope before implementation. Use `AskUserQuestion` to surface ambiguity to the user. NEVER guess at scope.
|
|
41
|
+
|
|
42
|
+
**Output:** explicit user answer that locks the acceptance criteria.
|
|
43
|
+
|
|
44
|
+
### 3. Dev Fleet (3-5 principal engineers in parallel, model: opus)
|
|
45
|
+
|
|
46
|
+
**Job:** Implement independent slices of the architect's plan IN PARALLEL. Each engineer gets a single self-contained task with explicit file references and binding constraints.
|
|
47
|
+
|
|
48
|
+
**Pattern:** spawn N agents via `Agent` tool with `run_in_background: true` in ONE message (parallel). Each agent gets:
|
|
49
|
+
|
|
50
|
+
- The architect's plan section relevant to their slice
|
|
51
|
+
- A SINGLE deliverable (one fix, one feature, one file)
|
|
52
|
+
- Binding constraints (no version bumps, no commits, no emojis, no em dashes, NO destructive operations)
|
|
53
|
+
- Explicit "report back in N words" cap
|
|
54
|
+
|
|
55
|
+
The integrator does NOT delegate synthesis -- they integrate the parallel outputs themselves.
|
|
56
|
+
|
|
57
|
+
### 4. SDET (1-2 agents, model: opus)
|
|
58
|
+
|
|
59
|
+
**Job:** Write tests + capture screenshots. For each shipped feature:
|
|
60
|
+
|
|
61
|
+
- One or more bash / Playwright tests asserting acceptance criteria
|
|
62
|
+
- For UI surfaces: screenshot capture with `chrome --headless --screenshot` or Playwright
|
|
63
|
+
- For backends: curl-based smoke tests
|
|
64
|
+
|
|
65
|
+
**Output:** test files + screenshot artifacts under `artifacts/<release>-screens/`.
|
|
66
|
+
|
|
67
|
+
### 5. Council Reviewers (3 agents, parallel, model: 2 opus + 1 sonnet)
|
|
68
|
+
|
|
69
|
+
**Job:** Independent code review. Binding gate: unanimous APPROVE required to ship.
|
|
70
|
+
|
|
71
|
+
**Pattern:** spawn 3 agents in parallel via `Agent` tool. Each gets:
|
|
72
|
+
|
|
73
|
+
- The full file diff at HEAD
|
|
74
|
+
- Their specialized focus (e.g. "frontend correctness", "backend / integration risk", "release readiness")
|
|
75
|
+
- Strict output format: `VOTE: APPROVE | CONCERN | REJECT` + findings list + reasoning
|
|
76
|
+
|
|
77
|
+
On any CONCERN or REJECT:
|
|
78
|
+
|
|
79
|
+
1. Integrator reads source + validates concern
|
|
80
|
+
2. If valid: dispatch fix agent + RE-RUN entire council on post-fix state
|
|
81
|
+
3. If invalid: refute with evidence + re-spawn ONLY the dissenting reviewer with the refutation
|
|
82
|
+
4. Loop until 3-of-3 APPROVE
|
|
83
|
+
5. "2-of-3 is good enough" is NEVER acceptable
|
|
84
|
+
|
|
85
|
+
### 6. Real-User QA (1 agent OR the integrator directly)
|
|
86
|
+
|
|
87
|
+
**Job:** Install the just-shipped release fresh from npm/bun, run a user-realistic scenario end-to-end, capture screenshots, report any breakage.
|
|
88
|
+
|
|
89
|
+
**Pattern:** after `gh release` confirms, run:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
bun install -g loki-mode@<NEW_VERSION>
|
|
93
|
+
loki --version # confirm new version on PATH
|
|
94
|
+
# Then exercise the new feature in a user-realistic way:
|
|
95
|
+
loki <new-command> ... # the change we just shipped
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Capture:
|
|
99
|
+
- Exit codes
|
|
100
|
+
- Output structure
|
|
101
|
+
- Any unexpected errors / warnings
|
|
102
|
+
- Browser screenshots if UI surface
|
|
103
|
+
|
|
104
|
+
## Parallel-execution rules
|
|
105
|
+
|
|
106
|
+
When spawning multiple agents in the SAME message:
|
|
107
|
+
|
|
108
|
+
- Use `Agent` tool with `run_in_background: true`
|
|
109
|
+
- Send all N tool calls in a SINGLE message (parallel scheduling)
|
|
110
|
+
- Each agent gets a SELF-CONTAINED prompt (no shared context)
|
|
111
|
+
- Each agent gets a SHORT response cap (under 250 words)
|
|
112
|
+
- The integrator INTEGRATES the parallel outputs -- never delegates synthesis
|
|
113
|
+
|
|
114
|
+
Anti-pattern: spawning agents sequentially when work is independent. Always parallel.
|
|
115
|
+
|
|
116
|
+
## Honest acknowledgements pattern
|
|
117
|
+
|
|
118
|
+
Every CHANGELOG entry that ships work via this pattern MUST include:
|
|
119
|
+
|
|
120
|
+
```markdown
|
|
121
|
+
### NOT tested in this release
|
|
122
|
+
|
|
123
|
+
- <each test that was skipped + reason>
|
|
124
|
+
- <any feature shipped without end-to-end real-user repro>
|
|
125
|
+
- <any divergence from architect plan + workaround>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Failing to disclose is fabrication. CLAUDE.md MEMORY.md "Be real, no fabrication, no lying" applies.
|
|
129
|
+
|
|
130
|
+
## Reference run: v7.6.0 LSP integration
|
|
131
|
+
|
|
132
|
+
Demonstrated this pattern works:
|
|
133
|
+
|
|
134
|
+
1. **Architect** (Plan agent): designed Merge-3 in `docs/MERGE3-PLAN.md`
|
|
135
|
+
2. **Product Owner** (integrator + AskUserQuestion): user chose merge scope
|
|
136
|
+
3. **Dev Fleet** (3 principal engineers in parallel): Engineer A fixed memory PYTHONPATH; Engineer B added USAGE.md auto-gen across bash + TS; Engineer C added Memory drill-down UI
|
|
137
|
+
4. **SDET** (Explore + Playwright): captured 20+ UI screenshots, ran 24-scenario CLI permutation test
|
|
138
|
+
5. **Council** (2 Opus + 1 Sonnet): 2 rounds; round 1 had 2 CONCERN-major; fixes applied; round 2 unanimous APPROVE
|
|
139
|
+
6. **Real-user QA**: fresh `bun install -g loki-mode@7.7.0` + ran on a different stack (Python Flask) than dev test + verified USAGE.md auto-generated + Memory drill-down rendered in a real browser
|
|
140
|
+
|
|
141
|
+
Result: 4 releases shipped that day with all 8 GitHub workflows SUCCESS on each.
|
|
142
|
+
|
|
143
|
+
## Per-release checklist (always)
|
|
144
|
+
|
|
145
|
+
See `artifacts/ROADMAP-v7.6.2-v7.7.0.md` "Per-release CLAUDE.md checklist" section for the binding 14-step checklist (architect plan, 14 version bumps, CHANGELOG, pre-publish validation, council, local-ci, individual staging, push, workflow validation, distribution validation, real-user smoke test, UI screenshot regression, cleanup).
|