@codacy/verity-cli 0.29.0-experimental.9760196 → 0.29.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.
package/bin/verity.js CHANGED
@@ -10492,7 +10492,7 @@ var SECURITY_PATTERNS = [
10492
10492
  /Dockerfile/
10493
10493
  ];
10494
10494
  var PROD_SERVICE_URL = "https://ofcamwrjwrkazqvdchko.supabase.co/functions/v1";
10495
- var DEFAULT_SERVICE_URL = "https://wukeddyzpijoegyajtnc.supabase.co/functions/v1".length > 0 ? "https://wukeddyzpijoegyajtnc.supabase.co/functions/v1" : PROD_SERVICE_URL;
10495
+ var DEFAULT_SERVICE_URL = "".length > 0 ? "" : PROD_SERVICE_URL;
10496
10496
  var GITHUB_CLIENT_ID = "Iv23li88HxAi3ZrbYzWh";
10497
10497
  var GITHUB_DEVICE_CODE_URL = "https://github.com/login/device/code";
10498
10498
  var GITHUB_ACCESS_TOKEN_URL = "https://github.com/login/oauth/access_token";
@@ -16919,7 +16919,7 @@ function resolveTaskContext(opts) {
16919
16919
  // src/lib/cli-version.ts
16920
16920
  function cliVersion() {
16921
16921
  try {
16922
- return true ? "0.29.0-experimental.9760196" : "dev";
16922
+ return true ? "0.29.0" : "dev";
16923
16923
  } catch {
16924
16924
  return "dev";
16925
16925
  }
@@ -21518,7 +21518,7 @@ function registerTelemetryCommands(program2) {
21518
21518
  }
21519
21519
 
21520
21520
  // src/cli.ts
21521
- program.name("verity").description("CLI for Verity quality gate service").version("0.29.0-experimental.9760196").option("--token <token>", "Override authentication token").option("--service-url <url>", "Override service URL").option("--verbose", "Log HTTP requests/responses to stderr").hook("preAction", async () => {
21521
+ program.name("verity").description("CLI for Verity quality gate service").version("0.29.0").option("--token <token>", "Override authentication token").option("--service-url <url>", "Override service URL").option("--verbose", "Log HTTP requests/responses to stderr").hook("preAction", async () => {
21522
21522
  setUserNamedServiceUrl(program.opts().serviceUrl);
21523
21523
  try {
21524
21524
  await foldLegacyLocalCredential();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codacy/verity-cli",
3
- "version": "0.29.0-experimental.9760196",
3
+ "version": "0.29.0",
4
4
  "description": "CLI for Verity quality gate service",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "homepage": "https://verity.md",
@@ -15,8 +15,7 @@
15
15
  "data/skills/",
16
16
  "package.json",
17
17
  "README.md",
18
- "LICENSE",
19
- "CHANGELOG.md"
18
+ "LICENSE"
20
19
  ],
21
20
  "engines": {
22
21
  "node": ">=20"
package/CHANGELOG.md DELETED
@@ -1,406 +0,0 @@
1
- # Changelog
2
-
3
- All notable changes to Verity are documented here. This project follows
4
- [Semantic Versioning](https://semver.org/).
5
-
6
- ## [0.29.0] — 2026-08-07
7
-
8
- **Phase 1 of the Road to 1.0: identity and context.** One login now covers every
9
- repository you can write to, and the gate stops guessing about what it reviewed.
10
-
11
- ```bash
12
- npm install -g @codacy/verity-cli
13
- verity login
14
- ```
15
-
16
- Nothing is revoked, and for most people those two commands are the whole migration.
17
- Three cases need one more step — see **[Migrating](#migrating)** at the end.
18
-
19
- ### 🔑 Log in once — for every repository, on every machine
20
-
21
- - **`verity login` is now repo-independent.** One GitHub device flow authenticates
22
- *you*, and the service sweeps your Verity GitHub App installations to grant access
23
- to every repository you can write to. A second repository needs no authentication
24
- at all. Previously this was one device flow **per repository**.
25
- - **Re-running `verity login` refreshes every grant at once** — it is how newly
26
- granted repositories appear, and how repositories you lost access to are revoked.
27
- - **`verity login` works on a machine with nothing configured.** Auth commands now
28
- fall back to the default service URL, and `verity init` drives the login instead of
29
- asking you to configure a URL first.
30
- - **Existing per-repository tokens are upgraded, not broken.** Logging in supersedes
31
- and prunes them; anything it cannot prune is reported rather than silently left in
32
- place.
33
-
34
- ### 👤 A login is a session, not a permanent key
35
-
36
- - **90-day expiry**, reported at login (`This login expires on …`).
37
- - **`verity sessions list`** — every machine you are signed in on, by device name,
38
- with `← this machine`.
39
- - **`verity sessions revoke <id>`**, **`verity logout`**, **`verity logout --others`**
40
- (a lost laptop, from a machine you still control) and **`verity logout --all`**.
41
- - Before this release a login token was invisible and permanent: it could be neither
42
- listed nor revoked, every re-login minted another, and the only recourse was
43
- deleting the user row in the database.
44
- - `verity logout` works even when the service is unreachable: it clears the local
45
- credential and says plainly that the server-side session may survive, rather than
46
- refusing to sign you out.
47
- - A revoked or expired session now reports *"your login expired or was revoked — run
48
- verity login"* and falls back to local analysis, instead of a bare HTTP 401.
49
-
50
- ### 🤖 Service tokens for CI
51
-
52
- - **`verity token create --name ci [--expires <days>]`** mints a project-pinned
53
- machine token for `VERITY_TOKEN`, printed once. **`verity token list`** shows ids and
54
- metadata (never secrets); **`verity token revoke <id>`** removes one.
55
- - Service tokens are **exempt from grant freshness** — a pipeline does not break
56
- because the person who created it went stale or left the company — and are
57
- **revocable by any current writer** of the repository, so a CI credential neither
58
- dies with its minter nor outlives their access.
59
- - `VERITY_TOKEN` from the environment is exempt from credential pinning: it is an
60
- explicit act by whoever set it, and carries no stored record to check against.
61
-
62
- ### 🔒 Security & privacy
63
-
64
- - **The login token is pinned to the backend that issued it.** A
65
- repository's `VERITY.md` is committed, and both the CLI and the hooks resolve their
66
- service URL from it. With a machine-global credential, cloning a hostile repository
67
- and working in it would have POSTed your login token *and* your code delta to
68
- whatever URL that file named, on the next Stop hook. The credential now records the
69
- service that minted it and **refuses** to travel anywhere else — refused, not
70
- downgraded, because stripping the auth header would still ship the request body.
71
- The Stop hook degrades to local static analysis, so "unauthenticated still
72
- analyzes" is preserved.
73
- - **No secret is written into your repository any more.** `.verity/credentials`
74
- inside the repo is no longer written or read for auth — the first `verity` command
75
- folds any leftover file into `~/.verity/credentials` and deletes it. That global
76
- store is now the single secret store, and the installer re-applies `chmod 600` on
77
- **every** run, correcting older installs that left it world-readable.
78
- - **Your token is out of `.claude/settings.local.json` too.** The OTLP telemetry block
79
- used to contain it verbatim; it now references an `otelHeadersHelper` that resolves
80
- the token at session start. Re-run `verity telemetry install` once to pick this up.
81
- - **Control characters in a git remote are rejected** before the remote becomes a
82
- request header, and a `VERITY.md` label line yields only its **first** URL.
83
- - **The offline cache keeps metadata, never code.** Both offline writers persisted
84
- the code-bearing request body "for later upload" — an upload that was never built,
85
- and the only other reader deletes the files after 7 days. They now record what you
86
- actually need to debug a failed run (when, why, how many files, how many bytes,
87
- which paths) and none of the content.
88
- - **Grant freshness is surfaced, never enforced, in this release.** Access carries a
89
- two-stage TTL from its last verification (14d soft / 30d hard); the CLI nudges you
90
- to re-verify well before anything can break. `STALE_VERIFICATION` is deliberately
91
- distinct from `FORBIDDEN`, because the remedy is `verity login`, not asking someone
92
- for access.
93
- - Cross-tenant gaps closed on the token routes and `/review`; a transient grant-lookup
94
- failure now returns `503` with `Retry-After` instead of reporting "you lack access".
95
-
96
- ### ✅ The gate stops rendering unreviewed code as PASS
97
-
98
- - **An unreviewed run can no longer come back green.** Two new fields —
99
- `review_status` (did a review happen) and `coverage` (how complete was the
100
- evidence) — are computed server-side from request facts, and a run with no review
101
- is clamped away from PASS. Previously, **251 of 251 fail-opens in this product's
102
- lifetime rendered PASS**: there was no field anywhere that could say a review had
103
- not happened, so an unreviewed run was indistinguishable from clean code.
104
- - **The reviewer call now retries and fails over.** One retry on 429/5xx within the
105
- 60-second budget, honouring `Retry-After`; **a quota error is never retried** (the
106
- largest real fail-open was a 50-hour billing lapse, and a status-code-only retry
107
- would have hammered it for the duration). A secondary provider can answer, but its
108
- answer yields **WARN, not PASS** — a clean bill of health from a model your project
109
- did not choose is not one.
110
- - **Cost per reviewed run is computable for the first time** — the provider usage
111
- block is returned instead of only logged.
112
-
113
- ### 💬 Verity now speaks on turns that go well
114
-
115
- - **A short report reaches the agent on every meaningful turn**, not only when the
116
- gate blocks. 87.4% of runs used to end PASS or WARN and reach the agent with
117
- nothing at all, while 1,384 pending items across 53% of runs were computed,
118
- returned, and read by nobody.
119
- - Capped and framed so it cannot take over the conversation: **≤1,500 characters,
120
- ≤5 items, one message per turn**, prefixed as a *report to relay* rather than an
121
- instruction — and **a PASS with nothing to say says nothing.**
122
- - Each line now prints its `pattern_id`, so `verity feedback finding …` can finally
123
- be used — it previously asked for an argument that had never been shown to anyone.
124
-
125
- ### 🎯 The verdict is about your goal, and about your code
126
-
127
- - **Intent misalignment no longer blocks — it arrives.** This was the single largest
128
- source of false blocks: **57.6% of identified FAILs**. It is now delivered as a
129
- pending item with a stable `intent-misalignment` id instead of a refusal. It also
130
- ends an inconsistency that was never decided, only implemented twice — the same
131
- server verdict used to block at Stop and pass at pre-commit.
132
- - **A block now requires at least one agent-scope finding** (a further 47.8% of
133
- FAILs), written as an explicit predicate rather than left emergent.
134
- - **A goal that has been delivered is recorded as delivered.** A goal met on turn 1
135
- used to be re-asserted verbatim forever; one real session produced a four-turn loop
136
- in which Verity graded turns that were relaying its own feedback.
137
- - **"Let's go", "yes" and "sounds good" are no longer treated as the goal**, and a
138
- repeated advisory is **labelled as a repeat** rather than asked for again.
139
- - **An operation is work too.** "Pull all changes from main" → the agent ran
140
- `git fetch`, found the branch current, correctly did nothing — and Verity answered
141
- *"Intent misaligned (2/10): No Git pull was performed."* Actions can now satisfy a
142
- goal, and Verity no longer asserts that something did not happen when it can see
143
- that it did.
144
- - **Findings anchor to real line numbers on the diff path.** It previously pushed the
145
- raw unified diff and left the model counting from a hunk header — a finding
146
- reported at `admin.js:156` against code at `:163`, which also broke recurrence
147
- detection.
148
-
149
- ### 🧠 Verity remembers the session
150
-
151
- - **A working-memory dossier**, per session, on your machine (~12 KB, append-only,
152
- CRC-checked, never a store): the goal you typed four turns ago and have not
153
- restated, what has been authored since, what Verity already said, and what became
154
- of it. **84.0% of runs were the second-or-later run of a session Verity had
155
- entirely forgotten.**
156
- - **Stale memory is refused, not softened.** An orphaned dossier is never loaded as
157
- working memory; every carried assertion re-anchors against the current bytes within
158
- ±20 lines or is dropped. Decay is keyed on repository movement, not wall clock — the
159
- same branch with nothing landed is still the same work at 400 hours; a branch switch
160
- is new work at five minutes.
161
- - **A session digest** is written to the project knowledge base at session end — the
162
- first thing that carries the shape of a whole session across. A session with nothing
163
- to say writes nothing.
164
-
165
- ### 🔍 Two skips that were letting real vulnerabilities through
166
-
167
- - **A bare "yes" no longer skips the review.** The bare-acknowledgment skip fired on
168
- the prompt alone, ~100 lines before Verity computed what had changed. A controlled
169
- probe planted an exploitable stored XSS; Verity answered *"Bare acknowledgment —
170
- skipping analysis."* Both acknowledgment skips now consult the diff.
171
- - **The self-healing cap stops blocking, not looking.** "Max Verity iterations (2)
172
- reached" was keyed on the commit, so unrelated vulnerabilities in unrelated tasks
173
- counted toward the same limit — and by the time control reached the cap the content
174
- had changed *by construction*, so every firing discarded genuinely new, unreviewed
175
- code. It green-lit a stored XSS, an unbounded request body and a directory
176
- traversal on separate days.
177
- - **An "orphaned window" is no longer read as an empty turn.** When a turn's edits
178
- fell outside the last 256 KB of the transcript, four separate consumers read that
179
- absence as proof that no code was written — one live security-fix run reviewed 4 of
180
- 56 changed files because of it.
181
-
182
- ### 📉 A third of the review prompt was chosen alphabetically
183
-
184
- - **Project specs are no longer read from byte 0 in `ls` order.** They shipped on
185
- 99.8% of runs at 30 KB ≈ 7,680 tokens — 1.5% of a 2 MB corpus, selected by filename,
186
- with the later files getting hundreds of bytes and one getting **two**. They are now
187
- kept where they are genuinely the rubric (plan mode, or when your goal names a spec
188
- path) and demoted otherwise. **Measured net: −7,321 tokens per review (≈ −32% of the
189
- prompt)**, spent on this turn's goal instead.
190
- - Per-project override both ways: `process_constraints.specs = always | never`.
191
-
192
- ### 📈 More of your change gets reviewed
193
-
194
- - **File cap raised 20 → 40**, on measured evidence rather than instinct: latency over
195
- 3,060 real reviewed runs fits ≈ 8.9s + 0.43s/file (40 files ≈ 26s against a 60s
196
- budget), and findings per run *rise* with file count (0.19 at 1–5 files, 0.92 at 20).
197
- The reviewer was not being diluted by volume; it was being starved by the cap.
198
- 77 of 1,611 runs sat exactly at the old 20-file wall and zero above it.
199
- - **Truncation declares itself.** Every subtraction stage — extension filter, file cap,
200
- byte budget, the 300-line elision — now names what it dropped and why, instead of
201
- silently reporting a partial review as a complete one.
202
-
203
- ### 🔬 Instrumentation (invisible, and the reason the numbers above are trustworthy)
204
-
205
- - **Every turn is now countable.** Verity reviews roughly one turn in fourteen; the
206
- other thirteen exited without writing anything anywhere, so every rate in the
207
- product read 100% by construction. A skip beacon now records each one with a reason
208
- and whether the skip was **chosen** (debounce, no delta) or **unavoidable** (no
209
- token, service unreachable) — deliberately not averaged together.
210
- - **The full session transcript is read** — all 17 record types plus subagent
211
- sidecars, instead of 2 of 17 types from the last 256 KB of a typical 2.75 MB file,
212
- which recovered 37.1% of edits and never once opened a subagent sidecar (in one
213
- measured session, a subagent edited 8 files that appear nowhere in the main
214
- transcript). Shipped in **recording mode**: it measures what would have been
215
- reviewed and changes nothing about what is.
216
- - Coverage telemetry, per-run identity/session/effort keys, provider health, and a
217
- golden verdict corpus — so a regression in any of the above can turn something red
218
- on its own.
219
-
220
- ### Migrating
221
-
222
- The unit of authentication changed from **one token per repository** to **one token
223
- per person, per machine**.
224
-
225
- | | Before (v0.28.x) | After |
226
- |---|---|---|
227
- | Setup | `verity auth register` in every repo | `verity login` once, anywhere |
228
- | A new repo you can write to | Register it | Already covered |
229
- | A repo granted *after* you logged in | — | `verity login` again to refresh grants |
230
- | Token lifetime | Never expires | Logins expire after **90 days** |
231
- | Seeing / ending a login | Not possible | `verity sessions list`, `verity logout` |
232
- | CI | Reuse a project token | `verity token create --name <name>` |
233
- | Secret on disk | `.verity/credentials` **in the repo** + a global line | `~/.verity/credentials` **only** |
234
- | Where your token may be sent | Any URL the repo's `VERITY.md` named | Only the backend that **issued** it |
235
-
236
- The gate itself is unchanged (same PASS/WARN/FAIL, same findings), as is the privacy
237
- guarantee: code is analyzed in memory and never stored, and your GitHub token is used
238
- once server-side to sweep your repository access, then discarded.
239
-
240
- #### The two commands
241
-
242
- ```bash
243
- npm install -g @codacy/verity-cli
244
- verity login # approve a device code at github.com/login/device
245
- ```
246
-
247
- Run it anywhere — login is repo-independent now, and falls back to the default service
248
- URL when the machine has nothing configured. Run it *inside* a repo and it also
249
- confirms that repo is covered. `verity init` offers the same step optionally, and
250
- auto-skips it without a TTY, so `/verity-setup` and CI both still work end to end.
251
-
252
- Confirm with `verity status` (should not say `Anonymous`) and `verity sessions list`
253
- (this machine appears, marked `← this machine`).
254
-
255
- If login reports `Access granted to 0 repositories`, the Verity GitHub App is not
256
- installed on any account you can reach — it prints an install link; install, then
257
- re-run.
258
-
259
- #### Three cases need one more step
260
-
261
- **1. CI.** Project tokens still authenticate, but service tokens are the supported
262
- shape. Inside the repo, as a logged-in writer:
263
-
264
- ```bash
265
- verity token create --name github-actions # optionally --expires <1-3650 days>
266
- ```
267
-
268
- Printed once — store it as `VERITY_TOKEN` in your CI secret store. `VERITY_TOKEN` from
269
- the environment is exempt from credential pinning.
270
-
271
- **2. If you use `/usage`,** re-run `verity telemetry install` once. The OTLP block in
272
- `.claude/settings.local.json` no longer contains your token; it resolves one at session
273
- start. Takes effect on your next Claude Code session.
274
-
275
- **3. A repo whose `.verity/credentials` is gone** — typically a fresh clone, since that
276
- file is gitignored. The old CLI also appended a global `<remote> token: …` line
277
- *without* recording which backend issued it, and an unverifiable credential is now
278
- refused rather than sent:
279
-
280
- ```
281
- Refusing to send your Verity login to https://…: this machine's credential does
282
- not record which service issued it, so it cannot be verified. Run "verity login"
283
- to re-issue it.
284
- ```
285
-
286
- This is not a crash — the request never leaves your machine and the caller takes its
287
- normal offline path, so the Stop hook still gives you local static analysis. But
288
- nothing uploads until you run `verity login`. Most people never see it, because a
289
- surviving project-local file heals the line automatically.
290
-
291
- #### If you do nothing
292
-
293
- - **A project-local `.verity/credentials` with an `origin` remote** — auto-migrated.
294
- The first `verity` command folds it into `~/.verity/credentials` and deletes the
295
- in-repo file. Everything keeps working.
296
- - **`VERITY_TOKEN` or `--token`** — unaffected.
297
- - **A global keyed line with no `service_url`, and no local file to heal it** — the
298
- refusal case above.
299
- - **No login at all** — the gate keeps running. What stops is everything needing a
300
- verified identity: run history, shareable links, task tracking, cloud memory and the
301
- cost views. Nothing already stored is deleted; it is paused until you log in.
302
-
303
- Per-remote lines still take precedence over your login **in their own repository**.
304
- After a successful login, lines it supersedes (same identity, same backend) are pruned;
305
- lines belonging to a **different GitHub account** or pointing at a **different backend**
306
- are deliberately kept, and `verity login` tells you when one shadows your login here.
307
-
308
- #### Command changes
309
-
310
- | Old | New |
311
- |---|---|
312
- | `verity auth register --project … --remote …` | `verity login` |
313
- | `verity login` (per-repo) | `verity login` (machine-wide, all writable repos) |
314
- | — | `verity logout` / `--others` / `--all` |
315
- | — | `verity sessions list` / `verity sessions revoke <session-id>` |
316
- | — | `verity token create --name <n>` / `token list` / `token revoke <id>` |
317
-
318
- `verity auth register`, `verity auth verify` and `verity auth discover` still exist and
319
- still work; `register` is superseded by `login` for normal use.
320
-
321
- #### Troubleshooting
322
-
323
- | You see | Means | Fix |
324
- |---|---|---|
325
- | `Refusing to send your Verity login to …` | Legacy credential with no recorded backend, or a repo naming a different one | `verity login`. If the other service is genuinely yours: `VERITY_SERVICE_URL=<url> verity login` |
326
- | `Your Verity login has expired or was revoked` | 90-day expiry, or revoked from another machine | `verity login` |
327
- | `No access grant for this repository` | Repo granted **after** your last login sweep | `verity login` to refresh grants |
328
- | `This repository is NOT covered by your grants` | The App is installed, but not on this repo | Grant it via the printed link, then `verity login` |
329
- | `origin remote is not a recognizable git URL` | An ssh alias (`gh:owner/repo`) or local path as `origin` | `git remote set-url origin <full url>` |
330
- | `verity status` says `Anonymous` | No user-bound credential resolved here | `verity login` |
331
-
332
- **Lost a laptop:** `verity logout --others` from a machine you still control revokes
333
- every other session.
334
-
335
- #### Also unchanged
336
-
337
- Anonymous usage (the gate runs, nothing is persisted), existing shareable run links,
338
- and GitHub as the only supported sign-in provider. Server changes reach every client on
339
- deploy day; the client changes need `npm install -g @codacy/verity-cli`.
340
-
341
- **Teams:** each person runs `verity login` once. Runs are attributed individually,
342
- while the standard, history and knowledge base stay shared across the repository.
343
-
344
- [0.29.0]: https://github.com/codacy/verity-core/releases/tag/v0.29.0
345
-
346
- ---
347
-
348
- ## [0.26.0] — 2026-07-06
349
-
350
- ### 🔒 Repo-scoped authentication (breaking)
351
-
352
- Verity now verifies that you have **write access to a repository** before it will
353
- store anything for that repository. Previously, any client that could reach the
354
- service could register a repo and read its run history — ownership was never
355
- proven. This release closes that gap.
356
-
357
- > **Action required for existing users:** re-run `/verity-setup` (or
358
- > `verity auth register`) once per repository to sign in. Until you do, Verity
359
- > keeps running the gate but stops recording history — see **Migration** below.
360
-
361
- #### Added
362
-
363
- - **Provider-gated registration (GitHub).** `verity auth register` now runs a
364
- GitHub OAuth **device flow**: you approve the CLI in your browser, and the
365
- service confirms you have push/maintain/admin access to the repo before
366
- issuing a token. The provider token is used once to verify access and read
367
- your verified email, then **discarded server-side** — never stored. The CLI
368
- keeps a local copy in `.verity/credentials` (perms `600`) so you don't
369
- re-auth on every register.
370
- - **User identity on tokens.** Tokens minted through registration are now bound
371
- to a `user_id`. Uploaded `runs`, `tasks`, `task_classifications`, and
372
- `feedback` are stamped with the author's identity.
373
- - **Repository access grants.** A `repository_users` grant (`write` / `admin`) is
374
- recorded at registration. This is the foundation for **multiple developers on
375
- one repository**: each member signs in, each gets their own token and
376
- attribution, and history/knowledge stays shared across the team.
377
- - New tables: `verity_organizations`, `verity_users`, `organization_repositories`,
378
- `repository_users` (migrations 029–032).
379
-
380
- #### Changed
381
-
382
- - **Access control on data endpoints.** `runs`, `usage`, `feedback`,
383
- `classify-task`, and `otlp` ingest now require a verified repo grant and return
384
- `403 FORBIDDEN` without one.
385
- - `POST /auth/register` now requires an `X-Provider-Token` header and returns the
386
- authenticated `user.email`. New error codes: `PROVIDER_TOKEN_REQUIRED` (401),
387
- `NO_WRITE_ACCESS` (403), `NO_VERIFIED_EMAIL` (422), `UNSUPPORTED_PROVIDER` (400),
388
- `PROVIDER_ERROR` (502).
389
- - Only **GitHub** remotes are supported for registration in this release.
390
-
391
- #### Migration & compatibility
392
-
393
- - **The gate still works without signing in.** Clients holding a pre-0.26 token
394
- continue to receive `POST /analyze` verdicts (PASS / WARN / FAIL, findings,
395
- intent alignment) unchanged. Analysis fidelity is identical.
396
- - **But it goes stateless.** For an un-migrated (anonymous) token: nothing is
397
- persisted — no run history, no shareable `view_url`, no task tracking, no
398
- compounding memory/learning — and the `classify-task`, `runs`, `usage`,
399
- `feedback`, and `otlp` endpoints return `403`.
400
- - **No automatic backfill.** Legacy tokens have no email on record, so they stay
401
- anonymous until re-registration. Every teammate must run `/verity-setup`
402
- individually to restore full functionality.
403
- - Existing shareable run links (view tokens) are unaffected and continue to work
404
- until their 7-day TTL expires.
405
-
406
- [0.26.0]: https://github.com/codacy/verity-core/releases/tag/v0.26.0