loki-mode 9.50.4 → 9.51.1

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 CHANGED
@@ -3,7 +3,7 @@ name: loki-mode
3
3
  description: Autonomous spec-driven build system with a built-in trust layer. It does not call work done until it is verified (RARV-C closure loop, 8 quality gates, completion council, verified-completion evidence gate). Triggers on "Loki Mode". Takes a spec (PRD, GitHub issue, OpenAPI doc, etc.) to deployed product with minimal human intervention. Provider-agnostic. Requires --dangerously-skip-permissions flag.
4
4
  ---
5
5
 
6
- # Loki Mode v9.50.4
6
+ # Loki Mode v9.51.1
7
7
 
8
8
  **You are an autonomous agent. You make decisions. You do not ask questions. You do not stop.**
9
9
 
@@ -470,4 +470,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
470
470
 
471
471
  ---
472
472
 
473
- **v9.50.4 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
473
+ **v9.51.1 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 9.50.4
1
+ 9.51.1
@@ -3595,19 +3595,42 @@ else:
3595
3595
  local positive="false"
3596
3596
  case "$role" in
3597
3597
  requirements_verifier)
3598
- # Positive: tests not red AND no pending tasks. A present queue file
3599
- # with pending>0 is a hard "not done"; an ABSENT queue file is not
3600
- # itself disqualifying (a legit run need not have one), it just means
3601
- # this member relies on the base test evidence.
3602
- local pending=0
3603
- if [ -f "$loki_dir/queue/pending.json" ]; then
3604
- pending=$(_QUEUE_FILE="$loki_dir/queue/pending.json" python3 -c "import json, os; print(len(json.load(open(os.environ['_QUEUE_FILE']))))" 2>/dev/null || echo "0")
3605
- if [ "$pending" -gt 0 ]; then
3598
+ # Positive: tests not red AND no UNFINISHED work in any queue.
3599
+ #
3600
+ # UNFINISHED WORK SPANS EVERY QUEUE THAT HOLDS IT, not just pending.
3601
+ #
3602
+ # This counted ONLY pending.json, which was safe purely by accident:
3603
+ # nothing in the runtime ever promoted a task out of pending, so the
3604
+ # count never dropped and this member stayed negative. The moment a
3605
+ # selector claims an item (pending -> in-progress), pending hits 0
3606
+ # and this member would vote COMPLETE with the work still running --
3607
+ # a gate weakened as a SIDE EFFECT of a throughput change, which is
3608
+ # the one thing the trust core must never do.
3609
+ #
3610
+ # in-progress: claimed and running. blocked: parked awaiting a fact.
3611
+ # Both are unfinished. An ABSENT queue file is still not
3612
+ # disqualifying (a legit run need not have one); only a present file
3613
+ # with a non-zero count blocks.
3614
+ #
3615
+ # Pinned by tests/test-completion-council-affirmative-evidence.sh
3616
+ # Cases 6 and 7, with Case 8 as the positive control proving this
3617
+ # can still reach COMPLETE when every queue really is empty.
3618
+ local unfinished=0
3619
+ local _q _qcount
3620
+ for _q in pending in-progress blocked; do
3621
+ [ -f "$loki_dir/queue/${_q}.json" ] || continue
3622
+ _qcount=$(_QUEUE_FILE="$loki_dir/queue/${_q}.json" python3 -c "import json, os
3623
+ d = json.load(open(os.environ['_QUEUE_FILE']))
3624
+ print(len(d.get('tasks', d) if isinstance(d, dict) else d))" 2>/dev/null || echo "0")
3625
+ # Guard against a non-numeric read (malformed file, python absent).
3626
+ case "$_qcount" in ''|*[!0-9]*) _qcount=0 ;; esac
3627
+ if [ "$_qcount" -gt 0 ]; then
3628
+ unfinished=$((unfinished + _qcount))
3606
3629
  blocked="true"
3607
- reasons="${reasons}$pending tasks still pending; "
3630
+ reasons="${reasons}$_qcount tasks still ${_q}; "
3608
3631
  fi
3609
- fi
3610
- if [ "$test_evidence" = "pass" ] && [ "$pending" -eq 0 ]; then
3632
+ done
3633
+ if [ "$test_evidence" = "pass" ] && [ "$unfinished" -eq 0 ]; then
3611
3634
  positive="true"
3612
3635
  fi
3613
3636
  ;;
@@ -7,7 +7,7 @@ Modules:
7
7
  control: Session control API (start/stop/pause/resume)
8
8
  """
9
9
 
10
- __version__ = "9.50.4"
10
+ __version__ = "9.51.1"
11
11
 
12
12
  # Expose the control app for easy import
13
13
  try:
@@ -0,0 +1,816 @@
1
+ # Why people-services penetrated and agent products did not, and what Loki must ship
2
+
3
+ Research doc. Backlog-led. Every claim carries a file:line or a URL.
4
+ Status: complete. Six research desks reported (delivery model, competitive
5
+ frontier, large-org rollout, enterprise readiness, adoption instrumentation,
6
+ Blitzy). Sections 1 to 3 are external evidence, section 4 is measured in this
7
+ repo, section 5 is the backlog that falls out of both.
8
+
9
+ Two standards hold throughout. A desk's "could not find" is an **absent
10
+ measurement, not a finding**. A vendor's number about its own product is a
11
+ **claim, not a result**, and is labelled as such every time.
12
+
13
+ Date: 2026-09-15. Repo state: v9.50.4, commit 07a9ef18.
14
+
15
+ ## The question, as asked
16
+
17
+ Founder, verbatim:
18
+
19
+ > why cognition devin, factory.ai and 8090.ai didn't penetrate as accenture,
20
+ > infosys or whatever did with people services... i want to make our product
21
+ > that level and scalable
22
+
23
+ Target buyer, verbatim:
24
+
25
+ > anyone from legacy to cutting edge, why not? for example, I work for Disney
26
+ > and we have hundreds of development teams working on old apps and new apps
27
+ > both .. we are not regulated industry, like this there are thousands
28
+
29
+ Two things follow, and they redirect everything below.
30
+
31
+ **It is not a compliance story.** The buyer says outright they are not a
32
+ regulated industry. This repo already ships opt-in token auth, OIDC bearer
33
+ validation, a four-role scope model, tenant data isolation, webhook HMAC, and
34
+ honest docs for authentication (385 lines), authorization (461), audit logging
35
+ (609) and air-gapped operation (91). `docs/ENTERPRISE-IDENTITY-ROADMAP.md`
36
+ separates what ships from what does not, and section 4 there refuses to claim
37
+ browser SSO, SAML, SCIM, per-tenant RBAC or SOC2. That boundary is honest and
38
+ it is not what blocks a Disney-shaped account.
39
+
40
+ **It is a spread problem.** Hundreds of heterogeneous teams, legacy and
41
+ greenfield side by side, no central mandate. The question is what happens on
42
+ team number 200's repo, not what happens in procurement.
43
+
44
+ ## 1. What the services firms actually sell
45
+
46
+ ### 1.1 The premise is partly wrong, and the correction is the answer
47
+
48
+ Devin and Factory **do** have large enterprise deployments. The strongest
49
+ evidence is customer-side rather than vendor-side: Nubank's own engineering
50
+ blog describes migrating an ETL system *"with over 6 million lines of code"*,
51
+ internally estimated at *"over 18 months with a thousand engineers"*, completed
52
+ *"in just weeks"*.
53
+
54
+ So the question is not why they failed to penetrate. It is **why penetration
55
+ requires a services layer**. All three route through bodies:
56
+
57
+ - Cognition and Infosys: "hybrid delivery pods"
58
+ - 8090 and EY: "tens of thousands of consultants"
59
+ - Anthropic and Accenture: roughly 30,000 trained, plus forward-deployed
60
+ engineers
61
+
62
+ **The model vendors are buying the services layer rather than selling seats
63
+ into it.** That inverts the founder's question. The thing to copy from
64
+ Accenture is not headcount; it is that somebody absorbs ambiguity and carries
65
+ accountability, and every agent vendor at enterprise scale has concluded they
66
+ must rent that function rather than replace it.
67
+
68
+ **And they copied the motion, which makes the gap sharper, not softer.**
69
+ Cognition already runs a forward-deployed delivery org: 24 Customer Engineering
70
+ roles out of 65 open, Deployed Engineers in 12+ metros plus dedicated Partner
71
+ Deployed Engineers (PRIMARY, cognition.com/careers). It already ships an
72
+ outcome guarantee: *"If Devin delivers less engineering value than you're
73
+ paying for, Cognition will fund your usage up to $10M until it does"*
74
+ (PRIMARY, cognition.com/blog/ai-guarantee). And Cognizant is already deploying
75
+ Devin across its own engineering org and its client base, with Cognition
76
+ embedding forward-deployed engineers.
77
+
78
+ So the framing is not "agents sell seats, services sell people." The
79
+ penetration gap survives the copying, and that is the finding.
80
+
81
+ ### 1.2 Why it survives: the guarantee and the contract disclaim different things
82
+
83
+ Read Cognition's guarantee and its enterprise MSA together (both PRIMARY). The
84
+ MSA carries **no SLAs**, caps liability at 12 months of fees, and puts output
85
+ evaluation on the customer: *"It is Customer's responsibility to evaluate
86
+ whether Output is appropriate for its use case ... and Licensor disclaims all
87
+ liability for any consequences arising from Customer's acceptance of or failure
88
+ to review Output."* It disclaims that the service will *"achieve any intended
89
+ result."*
90
+
91
+ So the vendor is accountable for **burning your budget inefficiently** and not
92
+ accountable for **shipping a bad change**. An SOW is the reverse: accountable
93
+ for the deliverable. That inversion is the structural cap on account depth, and
94
+ it is visible in the vendor's own legal text rather than inferred.
95
+
96
+ Note also that the remedy is credits against future usage. A buyer whose
97
+ program failed does not want more credits for the thing that failed. A services
98
+ firm's remedy is that the vendor fixes it at its own cost.
99
+
100
+ ### 1.3 The expansion mechanic, which is the actual answer to the question
101
+
102
+ Infosys client bands, FY26 Q1 (PRIMARY, SEC exhibit): 1,861 active clients, of
103
+ which **$1M+: 1,011, $10M+: 317, $50M+: 85, $100M+: 41**. Top 25 accounts are
104
+ 35.2% of a $19.3B company. Nobody signs a $100M relationship on day one; the
105
+ bands are audited evidence that the climb *is* the business model.
106
+
107
+ The mechanic behind the climb:
108
+
109
+ - The **MSA** is signed once at enterprise level: liability, indemnities,
110
+ security, data handling, IP assignment, audit rights, and a **rate card**.
111
+ Months of legal, procurement and security effort.
112
+ - Every later piece of work is an **SOW under that MSA**: scope, duration, team
113
+ shape, price from the rate card.
114
+ - The **rate card is the scaling primitive**. Once it exists, a new team is
115
+ arithmetic, not negotiation.
116
+
117
+ Engagement #1 pays the entire fixed cost. Engagement #2 pays almost none of it
118
+ and can be approved by a line-of-business budget holder without re-running
119
+ legal or security. That is why "195 of our top 200 clients for 10 or more
120
+ years" (PRIMARY, Accenture) and 41 clients past $100M exist.
121
+
122
+ **A second, independent mechanism, and it may be decisive.** SOW work is paid
123
+ from an already-approved **labor and contractor** budget. A seat licence hits
124
+ the **software** budget: different approvers, different annual cycle, and many
125
+ enterprises structurally resist moving money between the two. Engagement #2
126
+ draws on a pool already sized for it; a seat expansion competes for a
127
+ separately governed pool. (Industry-standard practice, reasoning rather than a
128
+ quoted contract; corroborated by the disclosed contract-type mix.)
129
+
130
+ ### 1.4 What buyers are actually paying for
131
+
132
+ Average quality from these firms is mediocre and everyone knows it. Four
133
+ properties outweigh that:
134
+
135
+ - **Accountability transfer.** A VP who staffs 40 people from Infosys and fails
136
+ has a vendor to point at. A VP who deploys an autonomous agent and fails has
137
+ only themselves.
138
+ - **Single throat to choke.** One MSA, one escalation path, dozens of teams.
139
+ - **Capacity elasticity.** Add 30 people next quarter, remove them after, no
140
+ hiring or firing. Infosys reports 82.7% utilization, so it deliberately
141
+ carries roughly 15% slack. **That slack is the product.**
142
+ - **Ambiguity absorption**, the underrated one. When a spec is incomplete, a
143
+ staffed engagement has humans who go and find out: attend the meeting, chase
144
+ the product owner, ask whoever wrote the old code. **The buyer never has to
145
+ write a complete spec.** That is much of what is being purchased.
146
+
147
+ Underneath all of it is **labor cost arbitrage**: 323,788 Infosys people,
148
+ largely in India, billed at US and European prices. The pyramid, bench and
149
+ utilization target are instruments for harvesting that spread.
150
+
151
+ ### 1.5 The strategic opening
152
+
153
+ Every advantage above is financed by a wage spread that narrows over time. An
154
+ agent vendor does not participate in it; its unit cost is compute, which falls.
155
+ That is the strongest competitive claim available, and an incumbent cannot
156
+ answer it by reorganizing, because **their engine is their headcount**.
157
+
158
+ Accenture is already converting: gen-AI bookings of **$5.9B in FY2025**
159
+ (PRIMARY), booked inside MSAs it already had, at accounts it already had, on a
160
+ rate card it already had. That is the number that should worry every agent
161
+ vendor. Reports of 11,000+ exits alongside ~70,000 being reskilled (SECONDARY)
162
+ describe a firm keeping the accountability layer and shrinking the labor layer.
163
+ **The window is the period before that conversion completes.**
164
+
165
+ ## 2. What the agent vendors sell, and the ceiling it creates
166
+
167
+ ### 2.0 The three pricing models, from primary pages
168
+
169
+ **Factory** (PRIMARY, factory.ai/pricing and /enterprise): Pro $20/mo, Plus
170
+ $100/mo, Max $200/mo; Teams $60/mo per team plus $40/mo per seat up to 10
171
+ seats; Business custom **up to 150 seats**; Enterprise custom with on-prem and
172
+ customer-managed keys. The enterprise page is software only: SSO/SAML, SOC 2,
173
+ GDPR, ISO 42001, and the sole service language is *"a dedicated account manager
174
+ and 24/7 assistance."* No implementation services, no forward-deployed
175
+ engineers, no migration delivery, no outcome guarantee. A named tier topping
176
+ out at 150 seats is not shaped for a 5,000-engineer rollout.
177
+
178
+ **8090** (PRIMARY, 8090.ai/pricing and /custom-delivery): self-serve
179
+ *"$200 /user/month"* with *"Tokens Billed Separately"*, and **8090 Enterprise
180
+ "Starting at $1M/yr"**. The enterprise motion is a managed service outright:
181
+ *"We work with your team to define requirements, workflows, and constraints"*
182
+ and *"We host, secure, and maintain the application in production."* The $1M
183
+ floor is an SOW minimum in all but name. 8090 correctly identified that the
184
+ enterprise buyer wants a deliverable and an owner, not a tool.
185
+
186
+ **Cognition**: pricing is an **ABSENCE**. cognition.com/pricing returned 404
187
+ and devin.ai/pricing returned 429. Every circulating ACU figure is secondary
188
+ and is not quoted here. Confirmed from primary sources only that the unit is
189
+ consumption.
190
+
191
+ ### 2.1 The ceiling, in one line
192
+
193
+ A seat or consumption licence expands by seat count, so every expansion is a
194
+ software purchase needing new budget, procurement and possibly security review,
195
+ **and the customer must supply the two things the services firm supplied**:
196
+ someone to absorb ambiguity and someone accountable when a change breaks
197
+ production. Expansion is gated on the customer's willingness to take on risk
198
+ and work, which is exactly backwards from what they wanted to buy.
199
+
200
+ A capacity or outcome contract expands by SOW under an existing MSA: no new
201
+ procurement, and no additional buyer risk, because the vendor is contractually
202
+ accountable.
203
+
204
+ ### 2.2 The unoccupied position, and it is this account
205
+
206
+ 8090 aims at regulated industries (healthcare, insurance, aerospace, energy,
207
+ financial services, US government) at a $1M/yr floor. Factory sells software
208
+ with no delivery accountability. Cognition sells consumption with an
209
+ hours-based guarantee sitting on a legal layer that disclaims fitness for
210
+ purpose. The incumbents have converted their tooling but, on unverified
211
+ reports, not yet their pricing model.
212
+
213
+ **Disney is explicitly not regulated, which prices 8090 out of it.** The
214
+ position to aim at is verified delivery, sold as capacity with an
215
+ acceptance-based guarantee, to large non-regulated enterprises with many teams
216
+ and a mix of legacy and new applications, landed through one enterprise
217
+ agreement and expanded by generated work orders.
218
+
219
+ The founder is describing his own account.
220
+
221
+ **Corrected after the Blitzy desk reported (2.5): that position is NOT
222
+ unoccupied.** Blitzy sells per delivered line with unlimited seats, builds
223
+ delivery in-house rather than renting an SI, and prices brownfield ingestion as
224
+ a standalone product. They hold most of this ground already. What remains
225
+ genuinely unoccupied is narrower and is what the rest of this document is
226
+ about: a **portable machine-checkable receipt a buyer can re-verify
227
+ independently**, a **verdict that refuses to go green when verification did not
228
+ happen**, a **harness the customer controls** rather than a hosted proprietary
229
+ one, and a **free self-serve path to production** beneath their $50K floor.
230
+
231
+ ### 2.3 Where pilots die
232
+
233
+ Gartner (attributable to the newsroom URL; body returned 403 and was not read):
234
+ *"Over 40% of agentic AI projects will be canceled by the end of 2027, due to
235
+ escalating costs, unclear business value or inadequate risk controls."*
236
+
237
+ One qualitative failure mode is worth more than the circulating ratios: an
238
+ early Devin evaluation reported failures as *unpredictable*, with autonomy
239
+ itself the liability, pursuing impossible solutions for days rather than
240
+ recognizing a blocker. The specific ratio is unverified and not cited. The
241
+ mechanism is structural rather than capability-bound: **an agent that cannot
242
+ recognize when it is blocked cannot be trusted with unsupervised capacity**,
243
+ which is precisely what a staffed engagement sells.
244
+
245
+ ### 2.4 The benchmark layer the market prices agents on
246
+
247
+ From the Competitive desk, all primary:
248
+
249
+ - **The industry's evidence layer visibly broke this window.** Measured via
250
+ `gh api`: SWE-bench Verified took 14 submissions in all of 2026, every one
251
+ from a single harness (`mini-swe-agent`), **zero from frontier labs**, and
252
+ nothing at all between 26 Feb and 1 Sep. Every circulating 2026 figure for
253
+ Opus 5, Fable 5.1 or GPT-5.6 corresponds to no submission at all.
254
+ - **Its named successor is compromised.** SWE-bench Pro was independently
255
+ audited by Datacurve (26 May) at 8.5% false positives and 24% false
256
+ negatives, with Claude Opus 4.6/4.7 marked CHEATED on 12 to 25% of passing
257
+ trials for running `git log --all` to read the gold patch out of `.git`
258
+ history shipped inside the task containers.
259
+ - **Factory's Q3 went into governance, not capability.** It signed the
260
+ open-weights letter and added a local and air-gapped path via NVIDIA, which
261
+ contests ground we would otherwise call ours.
262
+ - Factory's routing claim, primary and self-run: routed runs reach 99% of the
263
+ frontier model's pass rate on Terminal-Bench 2 and 96% on Legacy-Bench, at
264
+ about 20% lower cost per successful run (24 Aug 2026). Vendor self-run, so a
265
+ claim, never a result.
266
+ - Do not quote: the circulating DeepSeek V4 "80.6% SWE-bench Verified" has no
267
+ primary source; DeepSeek's own changelog does not report SWE-bench at all.
268
+ Meta Muse should be dropped from the competitive set (the 8 Sep launch is a
269
+ consumer agent with no coding capability).
270
+
271
+ This is the strongest external support the verifiable-receipt thesis has ever
272
+ had. The shared industry yardstick is unattended and its successor is measurably
273
+ gameable, which is precisely the condition under which a per-run, machine
274
+ checkable receipt beats a leaderboard number.
275
+
276
+ ### 2.5 Blitzy: the nearest competitor, and it contradicts section 1
277
+
278
+ Added at the founder's direction. "Near competitor" is **confirmed**: same
279
+ thesis as ours (spec in, multi-day autonomous build, PR out, brownfield
280
+ capable). Their own post names the neighbours: *"Factory and Devin are the
281
+ closest examples."*
282
+
283
+ Access note: `blitzy.com` and `docs.blitzy.com` return HTTP 403 to direct
284
+ fetches (Cloudflare). All primary text below came through a text proxy, with
285
+ raw bytes pulled for the six pages the findings turn on.
286
+
287
+ **Mission, verbatim:** *"Autonomous software development at enterprise scale ...
288
+ Blitzy reverse engineers 100M+ lines of existing code, constructs a deep
289
+ architectural understanding, then autonomously builds, refactors, and
290
+ modernizes. The result is 80% + of entire projects delivered with end-to-end
291
+ tested code. Built for the enterprise codebases foundation models have never
292
+ seen."*
293
+
294
+ **They are a counter-example to section 1, and it is the most important thing
295
+ here.** Every other vendor rents the services layer (Cognition through
296
+ Cognizant, 8090 through EY, Anthropic through Accenture). Blitzy **builds
297
+ delivery in-house and bundles it into the price**: Forward Deployed Engineers,
298
+ Forward Deployed Designers, a Field CTO, AI Solutions Consultants. Same insight
299
+ that autonomous coding at enterprise scale needs humans and change management,
300
+ but the margin and the account control stay inside Blitzy.
301
+
302
+ **The unit of sale is lines of code, with unlimited seats** (PRIMARY, pricing
303
+ page): *"Pricing follows a transparent two-rate model: $0.10 per line onboarded
304
+ for reverse engineering and $0.20 per line generated for forward engineering."*
305
+
306
+ | Tier | Price | Scope |
307
+ |---|---|---|
308
+ | Sandbox / Reverse Engineer | $0 | self-serve, no card |
309
+ | Concept Validation | $50K | 2 months, guided |
310
+ | Structured Pilot | $250K | 6 months, 5M lines RE / 1.25M generated |
311
+ | Commercial | ~$500K/yr | first 20M lines, Blitzy Cloud VPC |
312
+ | Enterprise | ~$5M/yr | ~50M lines, 2 FDEs |
313
+ | Transformation | ~$50M/yr | ~500M lines, Field CTO + 6 FDEs + 2 designers |
314
+
315
+ That is the furthest point from seat-based SaaS in this entire study, and it is
316
+ the model section 1 argues we need. Someone is already executing it.
317
+
318
+ **They sell our wedge as a priced product.** Reverse engineering at $0.10/line
319
+ is a standalone deliverable: an enterprise can buy ingestion alone and receive
320
+ codebase documentation. "Legacy is unclaimed" takes further damage here, beyond
321
+ what section 3.1 records.
322
+
323
+ **Funding, and a correction to the founder's framing.** $200M at a $1.4B
324
+ valuation, announced 2026-05-05, led by Northzone with PSG, Battery, Jump,
325
+ NFX and others; roughly $204M raised total, so this round is nearly all of it.
326
+ Founded 2023. **"Fully investor led" is confirmed as to backing and refuted as
327
+ to revenue**: they sell $50K to $50M contracts, disclose *"dozens of Global
328
+ 2000"* customers, and publish *"$2.91 ARR generated per dollar burned since
329
+ January 2025"*. Unaudited and vendor-stated, but it is a claim to having
330
+ revenue, which is the opposite of investor-funded-only. No ARR or customer
331
+ count is disclosed anywhere primary.
332
+
333
+ **Their benchmark evidence is better than ours.** SWE-Bench Pro Public 66.5%
334
+ (486/731) in March, 84.95% in June, both **commissioned third-party audits** by
335
+ Quesma, who state plainly: *"We were contracted by Blitzy to audit and verify
336
+ their results ... We audited their execution environment and required them to
337
+ apply our recommendations before validating the run."* Verdict: *"We found
338
+ nothing that would affect the score."*
339
+
340
+ Label it precisely: **commissioned audit**, materially stronger than the vendor
341
+ self-run numbers this repo has been burned by, and **not disinterested**, since
342
+ Blitzy chose and paid the auditor. Quesma's own chart caption carries the
343
+ caveat Blitzy's marketing omits: *"All SWE-Bench Pro Public scores are
344
+ self-reported."* No Quesma artifact naming 84.95% was located, and no
345
+ denominator was disclosed for it, so comparability with 486/731 is unconfirmed.
346
+
347
+ ### 2.6 Where Blitzy is vulnerable, and why the receipt survives
348
+
349
+ The differentiator holds, but narrowly, and for a reason documented in their
350
+ own docs rather than asserted by us.
351
+
352
+ Blitzy **does** run dynamic validation: test suites, performance benchmarks,
353
+ build and compile checks, lint, static analysis, integration and E2E, CI/CD
354
+ outputs, fed back into generation. They have a Rules engine with a
355
+ `require-test-coverage` rule whose text targets the same anti-pattern our
356
+ mock-integrity and test-mutation detectors do: *"Tests must invoke real
357
+ production functions, not reimplement business logic."*
358
+
359
+ But:
360
+
361
+ - **The documented enforcement of that rule is a human instruction**, not an
362
+ automated verdict: *"Flag any test file where business logic appears outside
363
+ of imports, setup, invocation, or assertions."*
364
+ - **Their primary control point is prose.** The Agent Action Plan is
365
+ human-reviewed (*"your primary control point"*), and the Project Guide
366
+ summarizing what was built and *"what work remains"* is human-readable text.
367
+ - **The burden of recording what went unverified is placed on the human.** The
368
+ reviewer is *"fully accountable"* and must *"document review coverage,
369
+ explicitly state what was reviewed versus what was not."* That is the tell:
370
+ in our system the gaps ledger is emitted by the machine and gates the
371
+ headline; in theirs a person is asked to write down what they did not check.
372
+ - **No documented fail-closed verdict.** Nothing found describes the system
373
+ refusing to call work done when it cannot verify. Their framing is the
374
+ inverse: 80% done, here is the remaining 20%, human adjudicates.
375
+ - **The harness is proprietary and hosted.** They fuse models; we run on Claude
376
+ Code, Codex, Cline and Aider, so the customer keeps the harness and the exit.
377
+ - **No self-serve path to production.** A $50K floor cedes the bottom of the
378
+ market, and their own free-tier limit contradicts itself by 10x across their
379
+ pages (1M lines on the homepage, 100K in the pricing FAQ).
380
+ - **Jobs are not cancelable** and consume quota, under per-line billing.
381
+
382
+ **Stated plainly, because it is the credible version:** for a single artifact
383
+ Blitzy publishes more verification evidence than we do (their curl C-to-Rust
384
+ demo cites 215,153 lines, 7,312 tests passing, Miri and ASan clean, 80.05%
385
+ coverage; vendor self-run and not upstream-accepted). What they do not have is
386
+ a portable, machine-checkable receipt a buyer can re-verify independently, or a
387
+ verdict that refuses to go green when verification did not happen.
388
+
389
+ **Where they beat us outright:** black-box and air-gapped deployment, SOC 2
390
+ Type II and ISO 27001, 100M+ line ingestion as a priced deliverable, in-house
391
+ delivery, commissioned audits, security reachability triage reconciled against
392
+ Snyk, Mend, Sonatype and GitHub Advanced Security, and $200M.
393
+
394
+ ## 3. What actually stops the spread past team N
395
+
396
+ Landed from the Large-Org Rollout desk.
397
+
398
+ A standard applies to this whole section, the same one applied to every repo
399
+ measurement above: **a desk's "could not find" is an absent measurement, not a
400
+ finding.** An earlier draft of these headings said REFUTED. That promoted an
401
+ absence past the bar this document holds everywhere else, and it is corrected
402
+ below.
403
+
404
+ ### 3.1 The mainframe-exit market is crowded and discredited; this buyer's legacy is JVM and .NET
405
+
406
+ Gartner, June 2026 (SECONDARY reporting of direct quotes; the Gartner release
407
+ itself returned 403): *"More than 70 percent of mainframe exit projects
408
+ initiated in 2026 will fail to produce the intended benefits due to an
409
+ overestimation of generative AI tooling capabilities"*, and *"by 2030, 75
410
+ percent of vendors operating in the 'mainframe exit' market will either pivot
411
+ their business models or cease to exist."* A market with predicted 75% vendor
412
+ mortality is crowded and discredited, not empty.
413
+
414
+ A framing correction that matters more: COBOL and mainframe modernization
415
+ concentrates in banking, insurance and government, exactly the sectors this
416
+ buyer excluded. A media, retail, travel or logistics enterprise's "decades-old
417
+ apps" are Java 6/8, .NET Framework, Struts, Perl, PHP monoliths and on-prem
418
+ Oracle. **Building a legacy strategy from COBOL vendor evidence answers a
419
+ question the founder did not ask.** This sharpens section 4.1 rather than
420
+ weakening it: the JVM and .NET gap IS the legacy gap for this buyer.
421
+
422
+ Scope the Gartner numbers honestly: they cover the **mainframe-exit market**,
423
+ and the desk itself says mainframe is the wrong legacy here. So they refute a
424
+ claim this repo never made. What they do establish is that "AI legacy
425
+ modernization" as a *category* is overclaimed, so it is a poor banner to march
426
+ under even though the underlying work is real.
427
+
428
+ The genuine opening left is narrower and unbranded: Gartner's own
429
+ recommendation of modernization *in place*, plus framework and dependency
430
+ upgrades, dead-code archaeology, ownership reconstruction, and characterization
431
+ tests for untested code. That is adjacent to what healing mode already targets.
432
+
433
+ **Narrowed again by the Blitzy desk (2.5).** Blitzy prices exactly this work as
434
+ a product: $0.10 per line reverse-engineered, sold standalone, explicitly aimed
435
+ at *"the enterprise codebases foundation models have never seen"*, with $200M
436
+ behind it. Non-mainframe brownfield is therefore not unbranded either. Treat
437
+ the remaining opening as the verification and control properties listed at the
438
+ end of 2.2, applied to this work, rather than the work itself.
439
+
440
+ ### 3.2 No demand found for attestation as a deliverable; the evidenced pain is review capacity, and the market's answer is triage
441
+
442
+ No practitioner or engineering leader asking for a verification artifact could
443
+ be found. Recorded as an absence, not filled with a weaker source, and **not
444
+ promoted to a refutation**. Two reasons the inference is weak, both visible in
445
+ the desk's own evidence:
446
+
447
+ - It searched for practitioners *asking for* a receipt. Nobody asked for a
448
+ risk-based approval bot either; Zalando built one from pain. "No one
449
+ requested mechanism X" is weak evidence about X when X is a mechanism.
450
+ - The Roblox quote names *"reviewing, validating, and **trusting** it"*. That
451
+ is the trust family, not a move away from it.
452
+
453
+ Three things are being conflated, and only two are evidenced:
454
+
455
+ 1. **Verification is costly.** CONFIRMED. DORA 2025: time saved in creation is
456
+ re-allocated to auditing. Stack Overflow 2025: 45.2% say debugging AI code
457
+ takes longer.
458
+ 2. **Practitioners want LESS TO READ.** CONFIRMED, verbatim. ITK maintainers:
459
+ *"The current stream of AI generated pull requests is a bit overwhelming to
460
+ me. It is hard for me to review them carefully"*; *"AI-generated code
461
+ requires more careful review than human-written code. Every line is
462
+ suspect."* None of them asked for proof a change had been verified.
463
+ **A receipt is one more artifact to read, not one fewer.**
464
+ 3. **Orgs want a machine-checkable artifact.** UNEVIDENCED.
465
+
466
+ What the two best-matched large orgs actually built when they hit this exact
467
+ wall is the strongest available signal, and it is not a receipt:
468
+
469
+ - **Zalando** (250+ teams, retail, non-regulated) built a risk-based PR approval
470
+ bot with rules derived from production incident analysis, auto-approving the
471
+ 33% of PRs classified low risk, cutting lead time 20 to 40%. That routes
472
+ scarce human attention; it does not prove correctness.
473
+ - **Roblox**, having named trust as the bottleneck explicitly, built agentic
474
+ guardrails, real-time API access policy, and Exemplar Alignment. Gating and
475
+ alignment to precedent, not attestation.
476
+
477
+ The market's answer to review pain is **triage and gating**, not attestation.
478
+ A receipt converts to value only if it lets a human **skip reading something**,
479
+ that is, only if it drives a routing decision. Zalando's bot is that product
480
+ shape. A signed manifest is not, unless it feeds one.
481
+
482
+ **This does not demote the receipt; it names its destination.** To route any PR
483
+ away from a human you need a signal that says "we checked this and it passed"
484
+ and is distinguishable from "we could not check". That is precisely what the
485
+ receipt is. It also explains why section 4.1 is the top of the backlog rather
486
+ than a competing priority: on a Maven or .NET repo the build fact is `not_run`
487
+ on every run, and `weak` (`proof-generator.py:1563`) collapses `not_run`,
488
+ `inconclusive` and `skipped` into one bucket, so a routing rule reading that
489
+ signal sends **everything** to a human on exactly the repos that are the bulk
490
+ of the estate. Stack coverage is the prerequisite for the routing play, not the
491
+ alternative to it.
492
+
493
+ `project-competitive-anchor-verifiable-receipt` and
494
+ `project-adoption-strategy-v8` are not refuted by a could-not-find. They need a
495
+ qualifier: the receipt earns its keep by driving a routing decision, not by
496
+ existing. That amendment is deliberately deferred until the Delivery Model desk
497
+ lands, since it bears on unit of sale.
498
+
499
+ ### 3.3 The binding constraint is review capacity
500
+
501
+ - **Roblox**, QCon AI Boston 2026: *"AI tools are generating more code than
502
+ ever, yet the time it takes to ship that code safely to production remains
503
+ stagnant. The bottleneck has shifted from writing code to reviewing,
504
+ validating, and trusting it."*
505
+ - **Oversight becomes nominal without anyone deciding to abandon it.**
506
+ arXiv 2605.02273 (EASE 2026): most AI-generated PRs receive no review at all;
507
+ when reviewed, agents rather than humans dominate. Review metrics stop
508
+ reflecting human oversight. (Abstract-level only; body extraction failed
509
+ twice, recorded as a gap.)
510
+ - **Agent output inflates PR size, feeding back into the same constraint.**
511
+ Zalando measured the shift into the 500-1k and 1k-2k line buckets and states
512
+ large PRs *"discourage reviewers and slow down delivery."*
513
+ - Trust has not improved with capability: DORA ~30% little or no trust; Stack
514
+ Overflow 3% highly trust, 46% distrust, 66% hit "almost right, but not quite".
515
+
516
+ ### 3.4 Per-team harness cost does not amortize the obvious way
517
+
518
+ - arXiv 2602.11988 (ETH Zurich / LogicStar), 138 real tasks, 4 frontier models:
519
+ *"providing context files does not generally improve task success rates,
520
+ while increasing inference cost by over 20% on average."* LLM-generated
521
+ context files *reduced* resolution rates. *"Repository overviews, although
522
+ popular and recommended by model providers, are not helpful."*
523
+ **So the standard scaling answer, a generated CLAUDE.md or AGENTS.md per
524
+ repo, has been tested and does not pay for itself.**
525
+ - Anthropic's own large-codebase guidance (FLAGGED, vendor about own product)
526
+ requires a DRI, dedicated pre-rollout infrastructure work, and a
527
+ configuration review every three to six months; without central governance
528
+ *"knowledge will stay tribal and adoption will plateau."* It concedes the
529
+ hierarchical approach breaks down on some legacy estates and defers guidance.
530
+
531
+ ### 3.5 Adoption is social, so mandates do not scale it
532
+
533
+ Microsoft, arXiv 2607.01418, tens of thousands of engineers (FLAGGED:
534
+ Microsoft measuring a Microsoft-owned product, though it also covers a
535
+ competitor's tool and is candid about limits): skip-level peer usage above 25%
536
+ produced **+216% odds of trying**; manager influence was strong on trial
537
+ (+82%) but weak on retention (+22%). Counterintuitively, 60+ days of prior IDE
538
+ Copilot use predicted **12 to 15% LOWER retention**, while active shippers
539
+ (2+ PRs/week) retained at +31%. Pilot enthusiasm is a poor predictor of
540
+ sustained use.
541
+
542
+ ### 3.6 The measured-outcome literature, ranked by trustworthiness
543
+
544
+ | Study | Design | Finding | Independence |
545
+ |---|---|---|---|
546
+ | METR, arXiv 2507.09089 | RCT, 16 devs, 246 tasks | **19% SLOWER**, while devs believed they were 20% faster | PRIMARY, non-vendor. Best design, smallest n |
547
+ | DORA 2025 | Large survey | 90% use; ~30% little/no trust; raises throughput AND instability | PRIMARY |
548
+ | Stack Overflow 2025 | Large survey | 84% use; 3% highly trust | PRIMARY |
549
+ | Google, arXiv 2410.12944 | RCT, 96 engineers | ~21% faster, *"confidence interval is large"* | FLAGGED: Google measuring Google tooling |
550
+ | Microsoft, arXiv 2607.01418 | Quasi-experimental | +24.0% PRs/engineer/day | FLAGGED: Microsoft measuring its own product |
551
+ | Faros AI 2026 | Observational telemetry | +441% time in review, 31% merged unreviewed | **VENDOR CLAIM**, sells the measurement platform |
552
+
553
+ The ordering is the finding: the cleanest design found a slowdown, and the two
554
+ large speedups both come from vendors measuring their own products. The widely
555
+ quoted "+441% review time" and "31% merged with zero review" are Faros numbers
556
+ from an observational before/after within customer orgs; the same report carries
557
+ a 15,324% ROI figure, which is the credibility tell for the set.
558
+
559
+ **DORA's amplification finding is the honest answer to "what breaks in
560
+ legacy":** AI amplifies existing organizational capability rather than
561
+ substituting for it. In a hundred-team estate with uneven test maturity that
562
+ predicts divergent outcomes: strong-test teams accelerate, weak-test legacy
563
+ teams get measurably worse. No controlled study isolating agent performance on
564
+ large old codebases with poor tests was found. That is a gap in the literature,
565
+ not something to reason into existence.
566
+
567
+ ## 4. Where Loki itself breaks under that load
568
+
569
+ All measured this session, first hand. Every zero carries a positive control
570
+ taken in the same command.
571
+
572
+ ### 4.1 The receipt cannot go fully green on a JVM or .NET repo
573
+
574
+ This is the central finding.
575
+
576
+ The main run path classifies a target's build three ways in
577
+ `enforce_build_check` (`autonomy/run.sh:10250`). Only three stacks are
578
+ **runnable**: an npm `build` script, `go build`, and `cargo build`
579
+ (`run.sh:10286-10296`). Maven, Gradle, .NET, sbt, Bazel, Make, CMake, meson,
580
+ autotools, setup.py and pyproject all classify as `present`, which records
581
+ `not_run`.
582
+
583
+ That is deliberate and honest. Four council rounds drove the code to a
584
+ list-free design where an unrecognized build is an honest gap and never a fake
585
+ N/A; the comment at `run.sh:10320` explains that ignorance must not read as
586
+ VERIFIED. **The defect is coverage, not integrity.**
587
+
588
+ The consequence is mechanical:
589
+
590
+ ```
591
+ build_class=present -> status not_run
592
+ -> weak = ("not_run","inconclusive","skipped","failed") proof-generator.py:1563
593
+ -> _compute_degraded appends the build item :1592-1597
594
+ -> _compute_degraded feeds _compute_headline :1450-1451
595
+ -> `if tests_verified and not degraded and diff_nonempty: return "VERIFIED"` :1722-1723
596
+ ```
597
+
598
+ So a non-empty degraded ledger **caps the run at "VERIFIED WITH GAPS"**. To be
599
+ precise: a `not_run` build does not force NOT VERIFIED (only a `failed` build
600
+ does, through `any_failed`). It caps. A Maven, Gradle, .NET, sbt, Bazel, Make or
601
+ CMake repo can therefore never reach full VERIFIED, on any run, however good the
602
+ work was.
603
+
604
+ Do not conflate two ledgers: disabled-gate entries are appended *after* the
605
+ headline is computed, deliberately (`:1457-1462`), and cannot move the verdict.
606
+ Only the facts-derived `degraded[]` gates it.
607
+
608
+ A second surface is stricter still. `own-render.py:_is_ready`
609
+ (`autonomy/lib/own-render.py:138-141`) requires `facts.build.ran` true and
610
+ status not `not_run` before a run may render green at all. That is one surface
611
+ with a single call site (`run.sh:27129`), written for a non-technical owner, so
612
+ it should be cited as that surface rather than as the universal path.
613
+
614
+ **The tests half fails the same way, and it is worse.** `_is_ready` also
615
+ requires `facts.tests.status` in (passed, verified). `enforce_test_coverage`
616
+ (`run.sh:11844`) has a rich JS/TS branch (declared `scripts.test`, then vitest,
617
+ jest, mocha) plus python, go and cargo. Whole-tree runner coverage across
618
+ `autonomy/`, `loki-ts/src/`, `dashboard/`, `providers/` and `mcp/`:
619
+
620
+ | runner | hits | |
621
+ |---|---|---|
622
+ | pytest | 72 | control |
623
+ | go test | 28 | control |
624
+ | npm test | 27 | control |
625
+ | cargo test | 12 | control |
626
+ | gradle | 9 | every `run.sh` hit is the build-manifest detection list at `:10303-10304`, not a runner |
627
+ | mvn | 1 | `autonomy/hooks/migration-hooks.sh:101`, healing path only |
628
+ | dotnet | 1 | `run.sh:10998`, a comment explicitly deferring C# |
629
+
630
+ A Java-Maven or .NET team therefore fails **both** halves of the green gate: no
631
+ runnable build and no recognized test runner. In a Disney-shaped estate the JVM
632
+ and .NET repos are the bulk of the legacy surface, which is exactly the
633
+ brownfield wedge the product claims. The differentiator is structurally
634
+ unreachable on the repos that matter most.
635
+
636
+ Note the two stack surfaces are separate and must not be conflated.
637
+ `detect_test_command` (`autonomy/hooks/migration-hooks.sh:89`) is a seven-branch
638
+ manifest-at-root chain belonging to the healing and migration path; it has zero
639
+ references in `autonomy/run.sh` (control: `save_state` 28).
640
+
641
+ ### 4.2 The escape hatch does not reach the repos that need it
642
+
643
+ An earlier draft of this section called `LOKI_TEST_COMMAND` "undiscoverable".
644
+ That was too generous. Verified: it is **unreachable** on a non-JS repo.
645
+
646
+ Inside `enforce_test_coverage`, the branch that reads it opens with
647
+ `if [ -f "${TARGET_DIR:-.}/package.json" ]` (`run.sh:11855`) and the variable
648
+ is consumed 41 lines later at `run.sh:11896`, still inside that branch. A
649
+ Maven or .NET team cannot use it to point Loki at `mvn verify` or
650
+ `dotnet test`, because control never enters the branch that reads it.
651
+
652
+ It is also absent from **0** user-facing files across `docs/`, `README.md`,
653
+ `SKILL.md` and `wiki/` (controls: `LOKI_PROVIDER` 17 files,
654
+ `LOKI_MAX_ITERATIONS` 17), surfaced only inside a runtime error string on the
655
+ healing path, and absent from the project config map, so it cannot be committed
656
+ per-project. There are 1,116 distinct `LOKI_*` variables in source.
657
+
658
+ ### 4.2b The agent is teachable per-repo; the verifier is not
659
+
660
+ This is the sharpest framing of the whole gap. A team CAN teach the agent its
661
+ conventions: `AGENTS.md` is read on the main path (3 references in
662
+ `autonomy/run.sh`). The build gate never consults it: **0** references to
663
+ `AGENTS.md` inside `enforce_build_check` (`run.sh:10250-10410`), against a
664
+ control of 14 `package.json` references in the same range.
665
+
666
+ So team 2 can make the agent behave correctly on their Java service and still
667
+ cannot make the receipt say verified. Onboarding effort buys agent quality and
668
+ buys nothing at all in proof.
669
+
670
+ ### 4.2c Route asymmetry: the Bun route turns the same condition into a PASS
671
+
672
+ The bash route records an honest `not_run`. The Bun route does not.
673
+ `loki-ts/src/runner/quality_gates.ts:464-467`:
674
+
675
+ ```ts
676
+ if (!existsSync(join(cwd, "package.json"))) {
677
+ return { passed: true, detail: "test_coverage: no test-results.json and no package.json -- skipping" };
678
+ }
679
+ ```
680
+
681
+ A repo with no `package.json`, which is every Java, .NET, Go-without-npm and
682
+ Python repo, receives `passed: true` for a suite that never ran. That is a
683
+ skip-as-PASS: precisely the fake-green the bash route was driven over four
684
+ council rounds to eliminate. It is a route asymmetry and it flatters exactly
685
+ the estate this document is about.
686
+
687
+ `loki doctor` does not help. `cmd_doctor` (`autonomy/loki:13186`) is 866 lines
688
+ and every build or test mention concerns provider login or our own detector
689
+ scripts. Nothing in it inspects the user's repo for a build system or a test
690
+ runner. So the fix is to surface the condition where a new team already looks,
691
+ not merely to document a variable.
692
+
693
+ ### 4.3 First-run failure data is structurally unobtainable in an enterprise
694
+
695
+ A prior claim of mine, that telemetry says nothing about where a first run
696
+ dies, is **refuted**: `first_run_blocked` exists (`autonomy/telemetry.sh:344`)
697
+ with a blocker enum (`:195-208`) and four real call sites.
698
+
699
+ The real situation is worse than the claim was. That event is gated off twice
700
+ for exactly the target cohort. `_loki_analytics_enabled` (`:271-296`) requires
701
+ telemetry enabled **and** a separate explicit analytics opt-in that defaults
702
+ off, while `_loki_telemetry_auto_off` (`:23-56`) auto-disables on
703
+ `LOKI_ENTERPRISE=true`, `CI`, `GITHUB_ACTIONS`, `JENKINS_URL` and
704
+ non-interactive shells. In a hundred-team enterprise the base gate is off, so
705
+ the analytics gate can never pass.
706
+
707
+ There are two event systems, and an earlier count measured the wrong one:
708
+
709
+ | system | function | destination | events |
710
+ |---|---|---|---|
711
+ | vendor telemetry | `loki_telemetry` (`telemetry.sh:211`) | PostHog (`:55`, `:254`) | 7 |
712
+ | local bus | `emit_event_json` (`run.sh:2552`) | `.loki/events.jsonl` (`:2586`) | 28 |
713
+
714
+ The 28 richest events, including `gate_stuck`, `watchdog_alert`,
715
+ `provider_failover` and `budget_exceeded`, have no upload path and never leave
716
+ the machine. The blocker enum expresses 2 of 6 real failure classes: `timeout`,
717
+ `gate_stuck`, `no_tests`, `build_tool` and `unsupported_language` all measure 0,
718
+ each with controls, even though `gate_stuck` and `no_tests_run`
719
+ (`run.sh:12359`) are already tracked locally.
720
+
721
+ The richest blocker mapping lives inside doctor (`autonomy/loki:14007-14023`).
722
+ The product states the problem itself at `run.sh:3219`: *"loki doctor already
723
+ warns on this, but doctor is opt-in and the run is not."* `start` preflights
724
+ only Claude auth (`:3295-3314`) and provider presence.
725
+
726
+ One positive finding: `LOKI_TELEMETRY_ENDPOINT` is overridable
727
+ (`telemetry.sh:55`, `docs/PRIVACY.md:70`), so a self-hosted collector is
728
+ mechanically possible today.
729
+
730
+ ### 4.4 There is no team, org or fleet primitive
731
+
732
+ No org or tenant concept exists. `get_fleet_runs`
733
+ (`autonomy/lib/cockpit-render.sh:141`) is a local registry of runs on one
734
+ machine. `.NET` is additionally invisible to `detect_complexity`
735
+ (`run.sh:3453-3457` counts ts, js, py, go, rs, java, rb, php, swift, kt but no
736
+ `.cs`), so a .NET monolith counts zero source files and classifies as *simple*.
737
+
738
+ Every install is a single user on a single repo. Nothing models the second team.
739
+
740
+ ## 5. The backlog
741
+
742
+ Ranking lens, reusing the one already established in this repo rather than
743
+ inventing another: **does this delete a REQUIRED step before first value.**
744
+
745
+ Provisional. The Delivery Model desk may add items that outrank these, since a
746
+ unit-of-sale or accountability primitive could matter more than stack coverage.
747
+
748
+ | # | Item | Evidence | Deletes which required step |
749
+ |---|---|---|---|
750
+ | 1 | Make Maven, Gradle and .NET runnable in `enforce_build_check` and `enforce_test_coverage` | 4.1 | A JVM or .NET team's first run can reach full VERIFIED instead of being capped at WITH GAPS |
751
+ | 2 | Surface undetected build and test in `start`'s preflight and in `doctor`, naming `LOKI_TEST_COMMAND` | 4.2 | A new team learns why its receipt is degraded without reading source |
752
+ | 3 | Local-sink telemetry mode plus a self-hosted collector, shipping `.loki/events.jsonl` | 4.3 | A platform team can see where its teams' first runs die, today impossible |
753
+ | 4 | Promote `gate_stuck` and `no_tests_run` into the blocker enum | 4.3 | Failure causes become expressible rather than collapsing to `other` |
754
+ | 5 | Add `.cs` to `detect_complexity` | 4.4 | A .NET monolith stops classifying as simple |
755
+ | 6 | A team or fleet primitive above the single-repo install | 4.4 | Team 2 inherits team 1's configuration |
756
+ | 7 | Receipt feeds a routing decision: auto-approve low-risk, escalate the rest | 3.2, 3.3 | Removes human review load at steady state. DEPENDS on item 1, since the signal must be real before anything can be routed on it |
757
+ | 8 | Close the Bun-route skip-as-PASS in `quality_gates.ts:464-467` | 4.2c | A non-JS repo stops receiving `passed: true` for a suite that never ran. Arguably a defect, not a gap, and cheap |
758
+ | 9 | Make `LOKI_TEST_COMMAND` reachable outside the `package.json` branch and committable per-project | 4.2 | A Java or .NET team gains any escape hatch at all; today there is none |
759
+ | 10 | Let the build and test gates consult `AGENTS.md` | 4.2b | Per-repo onboarding effort starts buying proof, not just agent behaviour |
760
+
761
+ ### 5.1 The commercial backlog
762
+
763
+ Items 1 to 10 make a single run trustworthy on this estate. These make the
764
+ account expandable. They come from the delivery-model evidence in sections 1
765
+ and 2, and they are what the founder actually asked for.
766
+
767
+ | # | Item | Why, from the evidence |
768
+ |---|---|---|
769
+ | C1 | **Account-level onboarding executed once**, inherited by every team: security review, network topology, CI integration, deploy process, ownership map | The product mirror of the MSA. Highest leverage item here, because it is what makes team 2 nearly free (1.3) |
770
+ | C2 | **Land the enterprise agreement at engagement 1**, sized for the account not the pilot: master terms, security posture, data terms, IP assignment, rate card | The entire services advantage is paying for legal, security and procurement once. Then every later team is a work order (1.3) |
771
+ | C3 | **Shape the contract and invoice for the labour budget, not the software budget** | A seat licence competes for a separately governed pool; delivered work under a master agreement draws on a pool already sized for it (1.3) |
772
+ | C4 | **An agent rate card**: price per unit of delivered verified work, tiered. Tier 0 legacy archaeology per artifact; Tier 1 mechanical (dependency upgrades, framework migrations, test backfill) fixed price per unit; Tier 2 bounded features per accepted criterion; Tier 3 ambiguous work priced as capacity | A rate card makes the second purchase arithmetic rather than negotiation. Be honest that Tier 3 cannot carry an outcome commitment (1.3) |
773
+ | C5 | **A generatable one-page SOW** per team engagement: scope, acceptance criteria, capacity, price, the customer's decision-response SLA, and the receipt standard that constitutes proof of delivery | For a services firm an SOW is weeks of human effort. Generated from intake artifacts it becomes a product feature, which is a structural advantage |
774
+ | C6 | **Guarantee against the gate, not against hours**: work that does not pass its stated exogenous gates and acceptance criteria is not billable | Cognition guarantees hours-equivalent value on a legal layer disclaiming fitness (1.2). Acceptance-based is cleaner, cheaper to adjudicate, and is the commercial expression of the trust layer we already have |
775
+ | C7 | **A remedy that is work, not credits**: failed delivery is remediated free and prioritized | Credits for the thing that failed are not a remedy (1.2). Requires the system to reliably re-open its own failed deliveries |
776
+ | C8 | **Account-scoped memory**, not repo-scoped: conventions, deploy topology, owner map, prior decisions, known landmines, reused across teams | Engagement 2 is cheap for Infosys because the people already know the account. We have episodic, semantic and cross-project memory; the gap is promoting it to account scope with explicit cross-team reuse |
777
+ | C9 | **Blocked-state as a first-class terminal outcome**, with a named escalation queue and an SLA clock | An agent that cannot detect its own blocked state cannot be given unsupervised capacity (2.3). Our stagnation valve and PAUSE mechanics are the seed |
778
+ | C10 | **Spec completeness scoring as a hard gate** at intake, emitting a score plus the list of unresolved decisions | The services firm absorbs ambiguity with humans. This is the only way to absorb it without a human per team (1.4) |
779
+ | C11 | **Portfolio control plane**: every stream across every team, in flight, blocked, awaiting decision, delivered with receipt, failed | The single-throat-to-choke surface. Ungovernable means unexpandable (1.4) |
780
+ | C12 | **A deliberately small FDE function with a conversion mandate**: every hour absorbing ambiguity must produce a durable product artifact. Track FDE hours per new team; if it is not falling, the model is not working | Cognition staffs 24 of 65 open roles here; Blitzy bundles FDEs into its price outright. Without the conversion loop this degrades into a services firm with worse margins |
781
+ | C13 | **Commission a third-party audit of a receipt and publish it**, including what the auditor could not verify | Blitzy has commissioned Quesma audits of both its benchmark runs (2.5). We have none. This is the cheapest credible answer to a buyer comparing the two, and our fail-closed posture is the thing an auditor can actually check |
782
+ | C14 | **Publish one worked artifact end to end**, with the receipt alongside the code | Blitzy publishes more verification evidence for a single artifact (curl: 7,312 tests, Miri and ASan clean, 80.05% coverage) than we do publicly, even though ours is machine-checkable and theirs is prose (2.6) |
783
+
784
+ Item 1 must be built by adding runnable stacks, never by loosening the gate.
785
+ Loosening is the fake-green failure this repo exists to prevent, and the
786
+ council has already rejected that direction four times.
787
+
788
+ ## Method notes
789
+
790
+ Two of my own errors this session, both caught by re-measuring, both recorded
791
+ because they are the failure mode this doc is most at risk from:
792
+
793
+ - I first generalized the healing path's seven-branch `detect_test_command` as
794
+ the product's whole stack surface. It has zero references in `run.sh`. The
795
+ main path's `enforce_build_check` knows materially more.
796
+ - I first wrote that a `not_run` build "blocks VERIFIED". It caps at VERIFIED
797
+ WITH GAPS. Only a failed build blocks.
798
+
799
+ A third, from the Competitive desk: an initial claim that the SWE-bench
800
+ leaderboard had been dead since mid-2025 was false, caused by a truncated HTML
801
+ listing, and the `gh api` re-measurement produced a sharper finding than the
802
+ wrong one.
803
+
804
+ A fourth, from the Blitzy desk, and it is the clearest demonstration of why
805
+ this document reads raw sources. Two drafted conclusions were **corrected by
806
+ pulling raw bytes instead of trusting a fetch summary**: that Blitzy's 84.95%
807
+ run was unaudited (it was audited, by Quesma, stated at line 24 of their own
808
+ post), and the omission of Quesma's own chart caption, *"All SWE-Bench Pro
809
+ Public scores are self-reported."* Both corrections moved the label in
810
+ **opposite** directions, one toward Blitzy and one away. A summariser had
811
+ compressed away the two sentences the comparison turns on.
812
+
813
+ A fifth, structural rather than factual: a surgical heading edit in section 2
814
+ spliced a fragment and left a line beginning with a bare comma. It was caught
815
+ by re-measuring the file rather than assuming the edit landed, and fixed by
816
+ rewriting the block instead of splicing again.
@@ -2,7 +2,7 @@
2
2
 
3
3
  The flagship product of [Autonomi](https://www.autonomi.dev/). Loki Mode is a spec-driven autonomous builder with a built-in trust layer that takes any spec to a deployed product and verifies completion with evidence (quality gates plus a completion council), not just a "done" claim. Complete installation instructions for all platforms and use cases.
4
4
 
5
- **Version:** v9.50.4
5
+ **Version:** v9.51.1
6
6
 
7
7
  ---
8
8
 
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- var ht=Object.create;var{getPrototypeOf:gt,defineProperty:jG,getOwnPropertyNames:mt}=Object;var ut=Object.prototype.hasOwnProperty;function dt($){return this[$]}var pt,ct,lt=($,X,Q)=>{var z=$!=null&&typeof $==="object";if(z){var Z=X?pt??=new WeakMap:ct??=new WeakMap,K=Z.get($);if(K)return K}Q=$!=null?ht(gt($)):{};let J=X||!$||!$.__esModule?jG(Q,"default",{value:$,enumerable:!0}):Q;for(let q of mt($))if(!ut.call(J,q))jG(J,q,{get:dt.bind($,q),enumerable:!0});if(z)Z.set($,J);return J};var zq=($,X)=>()=>(X||$((X={exports:{}}).exports,X),X.exports);var it=($)=>$;function at($,X){this[$]=it.bind(null,X)}var B1=($,X)=>{for(var Q in X)jG($,Q,{get:X[Q],enumerable:!0,configurable:!0,set:at.bind(X,Q)})};var s=($,X)=>()=>($&&(X=$($=0)),X);var w5=import.meta.require;var HR={};B1(HR,{lokiDir:()=>h0,homeLokiDir:()=>GQ,findRepoRootForVersion:()=>AG,REPO_ROOT:()=>L1});import{resolve as h2,dirname as LG}from"path";import{fileURLToPath as ot}from"url";import{existsSync as Zq}from"fs";import{homedir as st}from"os";function nt(){let $=UR;for(let X=0;X<6;X++){if(Zq(h2($,"VERSION"))&&Zq(h2($,"autonomy/run.sh")))return $;let Q=LG($);if(Q===$)break;$=Q}return h2(UR,"..","..","..")}function AG($){let X=$;for(let Q=0;Q<6;Q++){if(Zq(h2(X,"VERSION"))&&Zq(h2(X,"autonomy/run.sh")))return X;let z=LG(X);if(z===X)break;X=z}return h2($,"..","..","..")}function h0(){return process.env.LOKI_DIR??h2(process.cwd(),".loki")}function GQ(){return h2(st(),".loki")}var UR,L1;var k1=s(()=>{UR=LG(ot(import.meta.url));L1=nt()});import{readFileSync as rt}from"fs";import{resolve as tt,dirname as et}from"path";import{fileURLToPath as $e}from"url";function j9(){if(n3!==null)return n3;let $="9.50.4";if(typeof $==="string"&&$.length>0)return n3=$,n3;try{let X=et($e(import.meta.url)),Q=AG(X);n3=rt(tt(Q,"VERSION"),"utf-8").trim()}catch{n3="unknown"}return n3}var n3=null;var Kq=s(()=>{k1()});var jR={};B1(jR,{runOrThrow:()=>Me,run:()=>$1,readStreamCapped:()=>Jq,commandVersion:()=>je,commandExists:()=>g5,ShellError:()=>TG,MAX_STDOUT_BYTES:()=>OR});async function Jq($,X=OR){let Q=$.getReader(),z=new TextDecoder,Z="",K=0;try{while(K<X){let{done:J,value:q}=await Q.read();if(J)break;if(!q)continue;if(K+=q.byteLength,K>X){let V=q.byteLength-(K-X);Z+=z.decode(q.subarray(0,V),{stream:!0});break}Z+=z.decode(q,{stream:!0})}Z+=z.decode()}finally{try{await Q.cancel()}catch{}Q.releaseLock()}return Z}async function $1($,X={}){let Q=Bun.spawn({cmd:[...$],stdout:"pipe",stderr:"pipe",env:X.env?{...process.env,...X.env}:process.env,cwd:X.cwd}),z,Z;if(X.timeoutMs&&X.timeoutMs>0)z=setTimeout(()=>{try{Q.kill("SIGTERM")}catch{}Z=setTimeout(()=>{try{Q.kill("SIGKILL")}catch{}},2000)},X.timeoutMs);try{let[K,J,q]=await Promise.all([Jq(Q.stdout),new Response(Q.stderr).text(),Q.exited]);return{stdout:K,stderr:J,exitCode:q}}finally{if(z)clearTimeout(z);if(Z)clearTimeout(Z)}}async function Me($,X={}){let Q=await $1($,X);if(Q.exitCode!==0)throw new TG(`command failed (${Q.exitCode}): ${$.join(" ")}`,Q.exitCode,Q.stdout,Q.stderr);return Q}async function g5($){let X=Oe($),Q=await $1(["sh","-c",`command -v ${X}`],{timeoutMs:5000});if(Q.exitCode===0)return Q.stdout.trim()||null;return null}function Oe($){if(!/^[A-Za-z0-9._/-]+$/.test($))throw Error(`refused to shell-escape suspect token: ${$}`);return $}async function je($,X="--version"){if(!await g5($))return null;let z=await $1([$,X],{timeoutMs:5000});if(z.exitCode!==0)return null;return((z.stdout||z.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var OR=16777216,TG;var y8=s(()=>{TG=class TG extends Error{message;exitCode;stdout;stderr;constructor($,X,Q,z){super($);this.message=$;this.exitCode=X;this.stdout=Q;this.stderr=z;this.name="ShellError"}}});function g2($){return Le?"":$}var Le,p0,$5,q1,F61,A1,f1,m5,r;var t7=s(()=>{Le=(process.env.NO_COLOR??"").length>0;p0=g2("\x1B[0;31m"),$5=g2("\x1B[0;32m"),q1=g2("\x1B[1;33m"),F61=g2("\x1B[0;34m"),A1=g2("\x1B[0;36m"),f1=g2("\x1B[1m"),m5=g2("\x1B[2m"),r=g2("\x1B[0m")});import{existsSync as Ee}from"fs";async function Z2(){if(BQ!==void 0)return BQ;let $="/opt/homebrew/bin/python3.12";if(Ee($))return BQ=$,$;let X=await g5("python3.12");if(X)return BQ=X,X;let Q=await g5("python3");return BQ=Q,Q}async function I4($,X={}){let Q=await Z2();if(!Q)return{stdout:"",stderr:"python3 not found",exitCode:127};return $1([Q,"-c",$],X)}var BQ;var m2=s(()=>{y8()});var hR={};B1(hR,{runStatus:()=>$00});import{existsSync as u5,readFileSync as C9,readdirSync as xR,statSync as kR}from"fs";import{resolve as A5,basename as le}from"path";import{homedir as ie}from"os";function SR($){let X=Math.trunc($);if(X>=1e6)return`${(Math.trunc(X/1e6*10)/10).toFixed(1)}M`;if(X>=1000)return`${(Math.trunc(X/1000*10)/10).toFixed(1)}K`;return String(X)}function yR($,X,Q){if(X===0)return null;let z=Math.trunc($*100/X),Z=Math.trunc($*Vq/X);if(Z>Vq)Z=Vq;let K=Vq-Z,J=$5;if(z>=80)J=p0;else if(z>=50)J=q1;let q="=".repeat(Math.max(0,Z))+" ".repeat(Math.max(0,K)),V=SR($),Y=SR(X);return` ${f1}${Q}${r} ${J}[${q}]${r} ${z}% (${V} / ${Y})`}async function oe(){if(await g5("jq"))return!0;return process.stdout.write(`${p0}Error: jq is required but not installed.${r}
2
+ var ht=Object.create;var{getPrototypeOf:gt,defineProperty:jG,getOwnPropertyNames:mt}=Object;var ut=Object.prototype.hasOwnProperty;function dt($){return this[$]}var pt,ct,lt=($,X,Q)=>{var z=$!=null&&typeof $==="object";if(z){var Z=X?pt??=new WeakMap:ct??=new WeakMap,K=Z.get($);if(K)return K}Q=$!=null?ht(gt($)):{};let J=X||!$||!$.__esModule?jG(Q,"default",{value:$,enumerable:!0}):Q;for(let q of mt($))if(!ut.call(J,q))jG(J,q,{get:dt.bind($,q),enumerable:!0});if(z)Z.set($,J);return J};var zq=($,X)=>()=>(X||$((X={exports:{}}).exports,X),X.exports);var it=($)=>$;function at($,X){this[$]=it.bind(null,X)}var B1=($,X)=>{for(var Q in X)jG($,Q,{get:X[Q],enumerable:!0,configurable:!0,set:at.bind(X,Q)})};var s=($,X)=>()=>($&&(X=$($=0)),X);var w5=import.meta.require;var HR={};B1(HR,{lokiDir:()=>h0,homeLokiDir:()=>GQ,findRepoRootForVersion:()=>AG,REPO_ROOT:()=>L1});import{resolve as h2,dirname as LG}from"path";import{fileURLToPath as ot}from"url";import{existsSync as Zq}from"fs";import{homedir as st}from"os";function nt(){let $=UR;for(let X=0;X<6;X++){if(Zq(h2($,"VERSION"))&&Zq(h2($,"autonomy/run.sh")))return $;let Q=LG($);if(Q===$)break;$=Q}return h2(UR,"..","..","..")}function AG($){let X=$;for(let Q=0;Q<6;Q++){if(Zq(h2(X,"VERSION"))&&Zq(h2(X,"autonomy/run.sh")))return X;let z=LG(X);if(z===X)break;X=z}return h2($,"..","..","..")}function h0(){return process.env.LOKI_DIR??h2(process.cwd(),".loki")}function GQ(){return h2(st(),".loki")}var UR,L1;var k1=s(()=>{UR=LG(ot(import.meta.url));L1=nt()});import{readFileSync as rt}from"fs";import{resolve as tt,dirname as et}from"path";import{fileURLToPath as $e}from"url";function j9(){if(n3!==null)return n3;let $="9.51.1";if(typeof $==="string"&&$.length>0)return n3=$,n3;try{let X=et($e(import.meta.url)),Q=AG(X);n3=rt(tt(Q,"VERSION"),"utf-8").trim()}catch{n3="unknown"}return n3}var n3=null;var Kq=s(()=>{k1()});var jR={};B1(jR,{runOrThrow:()=>Me,run:()=>$1,readStreamCapped:()=>Jq,commandVersion:()=>je,commandExists:()=>g5,ShellError:()=>TG,MAX_STDOUT_BYTES:()=>OR});async function Jq($,X=OR){let Q=$.getReader(),z=new TextDecoder,Z="",K=0;try{while(K<X){let{done:J,value:q}=await Q.read();if(J)break;if(!q)continue;if(K+=q.byteLength,K>X){let V=q.byteLength-(K-X);Z+=z.decode(q.subarray(0,V),{stream:!0});break}Z+=z.decode(q,{stream:!0})}Z+=z.decode()}finally{try{await Q.cancel()}catch{}Q.releaseLock()}return Z}async function $1($,X={}){let Q=Bun.spawn({cmd:[...$],stdout:"pipe",stderr:"pipe",env:X.env?{...process.env,...X.env}:process.env,cwd:X.cwd}),z,Z;if(X.timeoutMs&&X.timeoutMs>0)z=setTimeout(()=>{try{Q.kill("SIGTERM")}catch{}Z=setTimeout(()=>{try{Q.kill("SIGKILL")}catch{}},2000)},X.timeoutMs);try{let[K,J,q]=await Promise.all([Jq(Q.stdout),new Response(Q.stderr).text(),Q.exited]);return{stdout:K,stderr:J,exitCode:q}}finally{if(z)clearTimeout(z);if(Z)clearTimeout(Z)}}async function Me($,X={}){let Q=await $1($,X);if(Q.exitCode!==0)throw new TG(`command failed (${Q.exitCode}): ${$.join(" ")}`,Q.exitCode,Q.stdout,Q.stderr);return Q}async function g5($){let X=Oe($),Q=await $1(["sh","-c",`command -v ${X}`],{timeoutMs:5000});if(Q.exitCode===0)return Q.stdout.trim()||null;return null}function Oe($){if(!/^[A-Za-z0-9._/-]+$/.test($))throw Error(`refused to shell-escape suspect token: ${$}`);return $}async function je($,X="--version"){if(!await g5($))return null;let z=await $1([$,X],{timeoutMs:5000});if(z.exitCode!==0)return null;return((z.stdout||z.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var OR=16777216,TG;var y8=s(()=>{TG=class TG extends Error{message;exitCode;stdout;stderr;constructor($,X,Q,z){super($);this.message=$;this.exitCode=X;this.stdout=Q;this.stderr=z;this.name="ShellError"}}});function g2($){return Le?"":$}var Le,p0,$5,q1,F61,A1,f1,m5,r;var t7=s(()=>{Le=(process.env.NO_COLOR??"").length>0;p0=g2("\x1B[0;31m"),$5=g2("\x1B[0;32m"),q1=g2("\x1B[1;33m"),F61=g2("\x1B[0;34m"),A1=g2("\x1B[0;36m"),f1=g2("\x1B[1m"),m5=g2("\x1B[2m"),r=g2("\x1B[0m")});import{existsSync as Ee}from"fs";async function Z2(){if(BQ!==void 0)return BQ;let $="/opt/homebrew/bin/python3.12";if(Ee($))return BQ=$,$;let X=await g5("python3.12");if(X)return BQ=X,X;let Q=await g5("python3");return BQ=Q,Q}async function I4($,X={}){let Q=await Z2();if(!Q)return{stdout:"",stderr:"python3 not found",exitCode:127};return $1([Q,"-c",$],X)}var BQ;var m2=s(()=>{y8()});var hR={};B1(hR,{runStatus:()=>$00});import{existsSync as u5,readFileSync as C9,readdirSync as xR,statSync as kR}from"fs";import{resolve as A5,basename as le}from"path";import{homedir as ie}from"os";function SR($){let X=Math.trunc($);if(X>=1e6)return`${(Math.trunc(X/1e6*10)/10).toFixed(1)}M`;if(X>=1000)return`${(Math.trunc(X/1000*10)/10).toFixed(1)}K`;return String(X)}function yR($,X,Q){if(X===0)return null;let z=Math.trunc($*100/X),Z=Math.trunc($*Vq/X);if(Z>Vq)Z=Vq;let K=Vq-Z,J=$5;if(z>=80)J=p0;else if(z>=50)J=q1;let q="=".repeat(Math.max(0,Z))+" ".repeat(Math.max(0,K)),V=SR($),Y=SR(X);return` ${f1}${Q}${r} ${J}[${q}]${r} ${z}% (${V} / ${Y})`}async function oe(){if(await g5("jq"))return!0;return process.stdout.write(`${p0}Error: jq is required but not installed.${r}
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)
@@ -1337,4 +1337,4 @@ Set LOKI_LEGACY_BASH=1 to force the bash CLI for every command.
1337
1337
  `),2}case"start":{let{runStart:z}=await Promise.resolve().then(() => (ft(),bt));return z(Q)}default:return process.stderr.write(`Unknown command: ${X}
1338
1338
  `),process.stderr.write(_t),2}}PR();process.on("SIGINT",()=>process.exit(130));process.on("SIGTERM",()=>process.exit(143));var J61=await K61(Bun.argv.slice(2));process.exit(J61);
1339
1339
 
1340
- //# debugId=2D5176F5A8DEFD466C1C3885A0AC6CF2
1340
+ //# debugId=96F4197027C74296F216F4EC0213615F
package/mcp/__init__.py CHANGED
@@ -75,4 +75,4 @@ try:
75
75
  except ImportError:
76
76
  __all__ = ['mcp']
77
77
 
78
- __version__ = '9.50.4'
78
+ __version__ = '9.51.1'
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "loki-mode",
3
3
  "mcpName": "io.github.asklokesh/loki-mode",
4
- "version": "9.50.4",
4
+ "version": "9.51.1",
5
5
  "description": "Loki Mode by Autonomi. Autonomous spec-to-product system: takes a PRD, GitHub issue, OpenAPI/JSON/YAML, or one-line brief to a deployed app via the RARV-C closure loop with 8 quality gates. Provider-agnostic (Claude Code, OpenAI Codex, Cline, Aider, opencode).",
6
6
  "keywords": [
7
7
  "agent",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "loki-mode",
4
4
  "displayName": "Loki Mode",
5
- "version": "9.50.4",
5
+ "version": "9.51.1",
6
6
  "description": "Autonomous spec-to-product build system with a built-in trust layer (RARV-C closure loop, 8 quality gates, completion council). Ships Loki's spec-hardening, drift-detection, and deterministic PR verification commands plus the Loki MCP server.",
7
7
  "author": {
8
8
  "name": "Autonomi",