@reviewsensei/cli-win32-x64 0.1.1 → 0.6.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/bin/_internal/base_library.zip +0 -0
  2. package/bin/_internal/jsonschema-4.26.0.dist-info/RECORD +1 -1
  3. package/bin/_internal/review_sensei/default_stages/01-default-review.json +1 -1
  4. package/bin/_internal/review_sensei/schemas/blocker-admission.schema.json +97 -0
  5. package/bin/_internal/review_sensei/schemas/canary-binding.schema.json +22 -0
  6. package/bin/_internal/review_sensei/schemas/candidate-finding.schema.json +59 -0
  7. package/bin/_internal/review_sensei/schemas/channel-promotion.schema.json +30 -0
  8. package/bin/_internal/review_sensei/schemas/compatibility-manifest.schema.json +44 -0
  9. package/bin/_internal/review_sensei/schemas/convergence-sequence-report.schema.json +72 -0
  10. package/bin/_internal/review_sensei/schemas/conversation-reply.schema.json +6 -1
  11. package/bin/_internal/review_sensei/schemas/coverage-manifest.schema.json +99 -0
  12. package/bin/_internal/review_sensei/schemas/evaluation-report.schema.json +17 -0
  13. package/bin/_internal/review_sensei/schemas/later-finding-classification.schema.json +81 -0
  14. package/bin/_internal/review_sensei/schemas/learning-entry.schema.json +11 -1
  15. package/bin/_internal/review_sensei/schemas/learning-feedback.schema.json +56 -0
  16. package/bin/_internal/review_sensei/schemas/observed-convergence-report.schema.json +93 -0
  17. package/bin/_internal/review_sensei/schemas/openrouter-qualification.schema.json +108 -0
  18. package/bin/_internal/review_sensei/schemas/promotion-record.schema.json +39 -0
  19. package/bin/_internal/review_sensei/schemas/recovery-artifact.schema.json +26 -0
  20. package/bin/_internal/review_sensei/schemas/review-comment.schema.json +22 -3
  21. package/bin/_internal/review_sensei/schemas/review-convergence-policy.schema.json +49 -0
  22. package/bin/_internal/review_sensei/schemas/review-result.schema.json +109 -3
  23. package/bin/_internal/review_sensei/schemas/review-round-decision.schema.json +58 -0
  24. package/bin/_internal/review_sensei/schemas/review-stage.schema.json +13 -0
  25. package/bin/_internal/review_sensei/schemas/review-transaction.schema.json +71 -0
  26. package/bin/_internal/review_sensei/schemas/run-outcome.schema.json +29 -0
  27. package/bin/_internal/review_sensei/schemas/session-record.schema.json +312 -0
  28. package/bin/_internal/review_sensei/schemas/stage.schema.json +6 -0
  29. package/bin/_internal/review_sensei/schemas/verification-result.schema.json +14 -0
  30. package/bin/_internal/review_sensei/schemas/verification-scope.schema.json +80 -0
  31. package/bin/_internal/{review_sensei-0.1.1.dist-info → review_sensei-0.6.6.dist-info}/METADATA +217 -63
  32. package/bin/_internal/review_sensei-0.6.6.dist-info/RECORD +175 -0
  33. package/bin/review-sensei.exe +0 -0
  34. package/package.json +1 -1
  35. package/bin/_internal/review_sensei-0.1.1.dist-info/RECORD +0 -103
  36. /package/bin/_internal/{review_sensei-0.1.1.dist-info → review_sensei-0.6.6.dist-info}/INSTALLER +0 -0
  37. /package/bin/_internal/{review_sensei-0.1.1.dist-info → review_sensei-0.6.6.dist-info}/REQUESTED +0 -0
  38. /package/bin/_internal/{review_sensei-0.1.1.dist-info → review_sensei-0.6.6.dist-info}/WHEEL +0 -0
  39. /package/bin/_internal/{review_sensei-0.1.1.dist-info → review_sensei-0.6.6.dist-info}/direct_url.json +0 -0
  40. /package/bin/_internal/{review_sensei-0.1.1.dist-info → review_sensei-0.6.6.dist-info}/entry_points.txt +0 -0
  41. /package/bin/_internal/{review_sensei-0.1.1.dist-info → review_sensei-0.6.6.dist-info}/licenses/LICENSE +0 -0
  42. /package/bin/_internal/{review_sensei-0.1.1.dist-info → review_sensei-0.6.6.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: review-sensei
3
- Version: 0.1.1
3
+ Version: 0.6.6
4
4
  Summary: Provider-neutral AI code review engine with an Ollama adapter.
5
5
  Author: Mohamad Alsabbagh
6
6
  License-Expression: MIT
@@ -36,11 +36,14 @@ providers later.
36
36
 
37
37
  > Alpha: this repository provides an open-source review engine and CLI. The
38
38
  > primary usage path is running ReviewSensei in your own GitHub Actions
39
- > workflow. Setup-v4 callers follow the operator-managed public `v4` tag; the
39
+ > workflow. Setup-v4 callers follow the operator-managed public `v5` tag; the
40
40
  > Worker validates that tag before creating the setup PR and the broker resolves
41
- > it again when issuing a capability. The example workflow installs the
41
+ > it again when issuing a capability. The broker still accepts `v4` during
42
+ > migration. The example workflow installs the
42
43
  > requested exact package from PyPI first and falls back to its executing commit
43
- > only when the distribution is unavailable. It
44
+ > only when the distribution is unavailable. Both paths prove the intended
45
+ > release identity against a compatibility manifest; live canary and `v5`
46
+ > movement remain operator-only. It
44
47
  > defaults to a local Ollama endpoint and does not require a hosted backend.
45
48
 
46
49
  ## What it does
@@ -48,7 +51,10 @@ providers later.
48
51
  - Keeps review business logic independent of GitHub and model vendors.
49
52
  - Sends a structured prompt to a replaceable provider adapter.
50
53
  - Requires provider output to be valid JSON.
51
- - Rejects inline comments that target files or lines outside the supplied diff.
54
+ - Filters inline comments that target files or lines outside the supplied diff
55
+ while preserving independently valid findings, including deletions and
56
+ file-level concerns, and reports an explicit coverage outcome for every
57
+ changed file.
52
58
  - Supports local Ollama servers and Ollama Cloud through the same adapter.
53
59
  - Loads approved repository-local learnings and returns validated learning proposals.
54
60
  - Supports ordered review stages with structured categories and explicit focus
@@ -59,9 +65,13 @@ providers later.
59
65
  runs and one provider slot per pull request.
60
66
  - Publishes versioned JSON Schemas for review results, learnings, categories,
61
67
  stages, and concurrency plans.
68
+ - Adds optional blocking, severity, fix-effort, and lens labels with
69
+ deterministic summary counts and visual cues for fast triage.
62
70
  - Provides a narrow GitHub App JWT and installation-token auth adapter for
63
71
  optional App-identity comments or reviews.
64
72
  - Avoids retaining raw prompts and provider responses in the engine.
73
+ - Provides `review-sensei doctor` and a zero-write `review-sensei plan`
74
+ preview so skipped or failed setup is diagnosable without forking workflows.
65
75
 
66
76
  ## Quick start
67
77
 
@@ -88,7 +98,7 @@ Ollama Cloud is explicit opt-in:
88
98
  ```bash
89
99
  export OLLAMA_API_KEY="your-key"
90
100
  export REVIEWSENSEI_PROVIDER_MODE="cloud"
91
- export REVIEWSENSEI_CLOUD_MODEL="deepseek-v4-flash:cloud"
101
+ export REVIEWSENSEI_CLOUD_MODEL="deepseek-v4.1-flash:cloud"
92
102
  unset OLLAMA_BASE_URL OLLAMA_MODEL
93
103
  ```
94
104
 
@@ -98,8 +108,8 @@ Node.js 22 or newer can invoke the same Python review engine through the
98
108
  provider-neutral `@reviewsensei/cli` launcher:
99
109
 
100
110
  ```bash
101
- npx --yes @reviewsensei/cli@0.1.1 --version
102
- npx --yes @reviewsensei/cli@0.1.1 --help
111
+ npx --yes @reviewsensei/cli@0.6.6 --version
112
+ npx --yes @reviewsensei/cli@0.6.6 --help
103
113
  ```
104
114
 
105
115
  The launcher selects one of the five native packages (macOS arm64/x64,
@@ -113,7 +123,7 @@ The package version is intentionally identical to the Python project and
113
123
  release tag. See [`docs/installation.md`](docs/installation.md),
114
124
  [`docs/releasing.md`](docs/releasing.md), and [ADR 0031](docs/adr/0031-npm-launcher-and-standalone-platform-packages.md)
115
125
  for prerequisites, release ordering, provenance, and version-forward rollback
116
- guidance (internal tracking issue #103).
126
+ guidance.
117
127
 
118
128
  Generate a bounded diff and run a review:
119
129
 
@@ -123,6 +133,8 @@ review-sensei prepare-diff \
123
133
  --base-ref main \
124
134
  --head-ref feature \
125
135
  --output pr.patch
136
+ review-sensei doctor
137
+ review-sensei plan --diff pr.patch --repository owner/repository --pull-request 42
126
138
  review-sensei \
127
139
  --diff pr.patch \
128
140
  --repository owner/repository \
@@ -156,30 +168,48 @@ Optional App-identity publication is documented in
156
168
  authentication adapter for GitHub App JWTs and installation access tokens; it
157
169
  is not a hosted review service, webhook receiver, or durable delivery store.
158
170
 
159
- ### GitHub App setup-v4 integration
171
+ ### GitHub App setup-v5 integration
160
172
 
161
- The optional setup-v4 integration adds a reviewable, generated caller by using
162
- the operator-managed `v4` git tag as the only update channel:
163
- `malsabbagh/review-sensei/.github/workflows/review-sensei-run.yml@v4`.
173
+ The optional setup-v5 integration adds a reviewable, generated caller by using
174
+ the operator-managed `v5` git tag as the only update channel:
175
+ `malsabbagh/review-sensei/.github/workflows/review-sensei-run.yml@v5`.
164
176
  The Worker validates the tag before writing the caller, and the Cloudflare
165
177
  broker resolves the same tag at capability exchange time and checks the
166
- executing workflow SHA. Moving `v4` is therefore the public cutoff action.
178
+ executing workflow SHA. Moving `v5` is therefore the public cutoff action.
167
179
  The selected provider mode applies consistently to automatic pull-request
168
180
  reviews, manual reviews, learning proposals, artifacts, and authorized
169
181
  `@sensei` conversations. Cloud runs use GitHub-hosted compute; local runs use
170
182
  the operator-controlled labeled self-hosted runner. Every generated write
171
- switch defaults to `false`.
183
+ switch except automatic approval defaults to `false`; automatic approval
184
+ defaults to `true` and requires automatic review and GitHub writes as separate
185
+ gates.
172
186
 
173
187
  Cloud mode may pass the existing customer-owned `OLLAMA_API_KEY` secret by
174
188
  name (`secrets.OLLAMA_API_KEY`) to the public reusable workflow. The App
175
189
  does not create, read, persist, log, or reveal that secret value. The Worker
176
- broker only issues one capability-scoped installation token after verifying
177
- the signed Actions OIDC identity, exact v4 workflow ref and runtime SHA,
190
+ broker issues a short-lived, capability-scoped installation token for each
191
+ authorized exchange after verifying
192
+ the signed Actions OIDC identity, exact `v5` workflow ref and runtime SHA,
178
193
  repository identity, fork status, installation, replay state, and rate limit.
194
+ For each write operation, the workflow obtains a separate short-lived token for
195
+ the requested capability: `review_publish` for review publication,
196
+ `inline_reply` or `issue_reply` for replies, and `learning_write` for learning
197
+ pull requests. The broker-issued token grants the workflow the capability to
198
+ make the corresponding GitHub API write; Cloudflare does not perform that
199
+ write. Review and reply capabilities grant `pull_requests: write`;
200
+ `learning_write` additionally grants `contents: write`. A review-publication
201
+ token cannot write repository contents.
202
+ Cloudflare does not run the review engine or send prompts to the model provider;
203
+ the GitHub Actions job performs those operations in the configured provider
204
+ environment.
205
+
206
+ During installation or migration, the Worker separately uses GitHub App
207
+ authentication to obtain a repository-scoped installation token for the setup
208
+ branch, pull request, and default variables.
179
209
 
180
210
  Installation, reinstall, permission-acceptance, and repository-added events
181
- reconcile absent or older generated clients through at most one setup-v4 PR.
182
- Current v4 is a no-op; managed v3 and older generated clients are migrated
211
+ reconcile absent or older generated clients through at most one setup-v5 PR.
212
+ Current tag-following setup-v5 is a no-op; managed v3/v4 and older generated clients are migrated
183
213
  through a setup PR, while custom, malformed, and future setup files are no-write
184
214
  cases. See [`docs/installation.md`](docs/installation.md),
185
215
  [`docs/github-app-registration.md`](docs/github-app-registration.md), and the
@@ -189,8 +219,8 @@ that never distributes the App private key.
189
219
 
190
220
  ## Offline evaluation
191
221
 
192
- Issue #9 includes a synthetic, CC0-1.0 corpus that runs without network access
193
- or provider credentials:
222
+ The repository includes a synthetic, CC0-1.0 corpus that runs without network
223
+ access or provider credentials:
194
224
 
195
225
  ```bash
196
226
  python scripts/validate_evaluation_corpus.py
@@ -233,6 +263,15 @@ bytes for the compact UTF-8 serialization of the complete proposal array
233
263
  result; and line numbers up to 2,147,483,647. These are byte limits unless a
234
264
  unit is stated otherwise.
235
265
 
266
+ Every changed file in a review result receives an explicit coverage outcome
267
+ (`reviewed`, `partially-reviewed`, `excluded-by-policy`, `unsupported`, or
268
+ `budget-exhausted`). Incomplete enumeration is never reported as fully
269
+ reviewed. Finding locations may bind to a right-side added line (the legacy
270
+ default), a left-side deleted line, or a file-level concern. Per-request
271
+ limits stay in place; opt-in `--orchestrate-large-changes` adds a separate
272
+ total-work budget so larger diffs can be chunked without silent truncation or
273
+ unbounded provider calls.
274
+
236
275
  Repository paths are strict canonical NFC UTF-8, `/`-separated, relative paths:
237
276
  no empty, dot, parent, absolute, drive/UNC, backslash, surrounding whitespace,
238
277
  control/format/surrogate, or silently normalized forms are accepted. Glob
@@ -240,7 +279,10 @@ tokens are allowed only in pattern fields; real Git paths may contain literal
240
279
  glob characters and are preserved without being interpreted. Git C-quoted
241
280
  paths are decoded as strict bytes before the same path checks. Exact duplicate
242
281
  comments identified by `(path, line, body)` use stable first-wins ordering;
243
- comments that differ in body remain distinct. Expected failures are sanitized
282
+ comments that differ in body remain distinct. Across heads, findings also carry
283
+ a stable fingerprint from path, symbol, defect kind, and optional evidence id
284
+ so a moved or rephrased concern does not open a duplicate ReviewSensei thread,
285
+ and a later pass that omits a finding is not treated as a fix. Expected failures are sanitized
244
286
  and never include a prompt, diff, provider body, credential, or supplied secret
245
287
  marker. Invalid structured provider output receives one fresh, sanitized
246
288
  correction attempt per stage; the rejected attempt is discarded completely and
@@ -306,17 +348,21 @@ category to a comment, it must use one of the active stage ids; classification
306
348
  is optional for compatibility. If multiple stages reuse an id, the entire lens
307
349
  definition must be identical.
308
350
 
309
- Inline findings may also carry independent `severity` (`critical`, `high`,
310
- `medium`, or `low`) and `fix_effort` (`trivial`, `small`, `moderate`, `large`,
311
- or `unknown`) labels. Severity describes likely impact, while fix effort
312
- describes remediation scope rather than a time estimate. The existing
313
- `category` id is the lens source and is shown as a human-readable lens label;
314
- no composite priority score or second `lens` field is emitted. These fields are
315
- optional so legacy provider results remain valid. When present, the same labels
316
- appear on inline GitHub comments and deterministic severity/lens/quick-win
317
- counts appear in the review summary. Labels are validated as printable,
318
- bounded provider text and Markdown-escaped before publication so untrusted
319
- output cannot inject structure or exceed the configured comment-body limit.
351
+ Inline findings may also carry independent `blocking`, `severity`
352
+ (`critical`, `high`, `medium`, or `low`), and `fix_effort` (`trivial`, `small`,
353
+ `moderate`, `large`, or `unknown`) labels. `blocking` controls whether the
354
+ finding prevents approval; `false` identifies an optional follow-up.
355
+ If it is omitted, only case-insensitive canonical `critical` and `high`
356
+ severity values block approval. Missing, lower-severity, and legacy free-form
357
+ severity values are non-blocking.
358
+ Severity describes likely impact, while fix effort describes remediation scope
359
+ rather than a time estimate. The existing `category` id is the lens source and
360
+ is shown as a human-readable lens label; no composite priority score or second
361
+ `lens` field is emitted. When present, the same labels appear on inline GitHub
362
+ comments and deterministic blocking/severity/lens/quick-win counts appear in
363
+ the review summary. Labels are validated as printable, bounded provider text
364
+ and Markdown-escaped before publication so untrusted output cannot inject
365
+ structure or exceed the configured comment-body limit.
320
366
  The formatted summary is checked against `max_summary_bytes`, and the complete
321
367
  framed GitHub review body is bounded to 65,536 bytes before publication.
322
368
 
@@ -378,6 +424,47 @@ packaged default pipeline includes an architecture lens whose optional sources
378
424
  are `AGENTS.md`, `docs/architecture.md`, `docs/architecture/**/*.md`, and
379
425
  `docs/adr/**/*.md`.
380
426
 
427
+ ### Opt-in symbol-aware source context
428
+
429
+ By default, reviews do **not** load related source files. That keeps the
430
+ trusted context boundary at configured documents and approved learnings.
431
+ Operators may opt in to bounded Python symbol-aware context from the same
432
+ trusted base checkout:
433
+
434
+ ```bash
435
+ review-sensei --diff pr.patch \
436
+ --context-root /path/to/target-branch-checkout \
437
+ --enable-symbol-context \
438
+ --base-sha <trusted-base-commit-sha>
439
+ ```
440
+
441
+ `--enable-symbol-context` can also be set with
442
+ `REVIEWSENSEI_ENABLE_SYMBOL_CONTEXT=true`. `--base-sha` is required when the
443
+ selector is enabled and identifies the immutable trusted-base snapshot. Optional
444
+ `--head-sha` is recorded only as untrusted coverage metadata; head trees, build
445
+ scripts, hooks, tests, and package installers are never checked out or
446
+ executed for this context.
447
+
448
+ The documented language set is Python. The selector uses static AST parsing
449
+ for enclosing functions/classes, local imports, Protocol/ABC interfaces,
450
+ same-directory callers, and conventional associated tests. JavaScript and
451
+ TypeScript files may be included as a whole-file fallback and are reported as
452
+ `unsupported-language`. Canonical path, traversal, symlink, file-type, and
453
+ secret-sensitive-file protections apply. Identical snapshot and policy inputs
454
+ produce identical excerpts and outcome ordering.
455
+
456
+ Each excerpt records path, base commit SHA, Git blob object id, line range,
457
+ selection reason, and SHA-256 digest. Ambiguous parses, excluded paths,
458
+ unsupported languages, and exhausted budgets appear in result
459
+ `source_context` coverage; they are not presented as complete understanding.
460
+ Bounded relationship expansion names the bound it reached, using
461
+ `directory-truncated` for a capped caller-directory listing and
462
+ `relations-truncated` for a capped import or caller candidate set.
463
+ When the opt-in policy is enabled, exhausting the configured file or byte
464
+ budget fails closed. Evaluation under
465
+ [#33](https://github.com/malsabbagh/review-sensei/issues/33) is required
466
+ before this selector can become the default.
467
+
381
468
  ## Repository-local learnings
382
469
 
383
470
  Durable repository knowledge lives in the reviewed repository under
@@ -403,6 +490,33 @@ must be a checkout of the target branch or target commit, not the untrusted
403
490
  head checkout. This prevents a pull request from changing its own review
404
491
  context before it is merged.
405
492
 
493
+ Existing files may omit lifecycle metadata. Optional bounded fields include
494
+ `owner`, `provenance`, `reviewed_at`, `expires_at`, `supersedes`, and
495
+ `superseded_by`. Status may be `active`, `retired`, or `superseded`.
496
+ Superseded and retired entries stay on disk for provenance and Git rollback,
497
+ but they are not selected for later prompts. Diagnostics for stale,
498
+ conflicting, missing-superseder, or cyclic entries are advisory; ReviewSensei
499
+ never deletes or rewrites approved knowledge automatically.
500
+
501
+ ```bash
502
+ review-sensei learnings diagnose --learning-root /path/to/target-branch --json
503
+ ```
504
+
505
+ Opt-in finding feedback is a separate `learning-feedback` document with
506
+ outcomes `useful`, `incorrect`, `obsolete`, and `unverified`. Absence of
507
+ feedback is not approval, and feedback never becomes trusted review context.
508
+
509
+ Fixture evaluation can compare the same cases with and without selected
510
+ approved learnings. The report records precision/recall/false-positive deltas
511
+ as estimates, not causal proof:
512
+
513
+ ```bash
514
+ review-sensei evaluate --mode fixture --corpus evaluation/v1/corpus.json \
515
+ --compare-learnings --learning-root /path/to/target-branch
516
+ ```
517
+
518
+ See [ADR 0036](docs/adr/0036-learning-lifecycle-diagnostics-and-feedback.md).
519
+
406
520
  ## Local Ollama
407
521
 
408
522
  ```bash
@@ -414,6 +528,12 @@ review-sensei --diff pr.patch
414
528
 
415
529
  ## Providers
416
530
 
531
+ The shipped registry keys are `ollama`, `openai-compatible`, and `openrouter`.
532
+ Operator defaults, workflow modes, named profiles, credentials, and hosted
533
+ OpenRouter allowlists are documented in [`docs/installation.md`](docs/installation.md).
534
+ The release-aware public matrix lives at
535
+ [reviewsensei.dev/providers/](https://reviewsensei.dev/providers/).
536
+
417
537
  The core depends on this small interface:
418
538
 
419
539
  ```python
@@ -429,19 +549,30 @@ provider's API and returning `ProviderResponse`. The review service, diff
429
549
  validation, output schema, and GitHub-independent behavior remain unchanged.
430
550
  See [the architecture guide](docs/architecture.md).
431
551
 
552
+ The OpenAI-compatible adapter is restricted to `https://api.openai.com` by
553
+ default and rejects redirects so its bearer token cannot be silently forwarded
554
+ to another host. An explicitly trusted private or compatible service may be
555
+ selected from Python with `allow_custom_endpoint=True`; this is an operator
556
+ acknowledgement of data egress and still requires a non-empty API key. Custom
557
+ openers own their transport and redirect policy, while the built-in opener uses
558
+ the system CA store (or an explicitly configured, regular `SSL_CERT_FILE`) and
559
+ reuses one verified TLS context for the provider lifetime. Local Ollama and
560
+ Ollama Cloud remain separate provider profiles; selecting Cloud is the explicit
561
+ network egress path for Ollama deployments.
562
+
432
563
  ## GitHub integration
433
564
 
434
- The GitHub App opens a setup-v4 PR containing a thin caller pinned to the full
435
- SHA resolved from the operator-managed `v4` public git tag at installation
436
- time. The reusable workflow prefers the requested exact package from PyPI and,
437
- only when that package/version is unavailable, installs the executing workflow
438
- commit directly from the public GitHub source. Unrelated PyPI installation
439
- failures remain fatal. All nine
440
- `REVIEWSENSEI_*` repository variables are created with safe defaults: automatic
441
- review, GitHub writes, learning PRs, mention replies, and artifact upload are
442
- off. The App never creates the customer-owned
443
- `OLLAMA_API_KEY` secret.
444
- The five feature switches are all disabled by default.
565
+ The GitHub App opens a setup-v5 PR containing a thin caller that follows the
566
+ operator-managed `v5` public git tag. The reusable workflow prefers the
567
+ requested exact package from PyPI and falls back to its executing workflow
568
+ commit only when that package/version is unavailable. Unrelated PyPI
569
+ installation failures remain fatal. Setup provisions 15 repository variables,
570
+ including 7 boolean controls, and manages 3 generated files. Automatic review,
571
+ GitHub writes, learning proposals, learning PRs, mention replies, and artifact
572
+ upload default to `false`; automatic approval defaults to `true` but is effective
573
+ only when review and write gates are enabled. `REVIEWSENSEI_REVIEW_MODE` is a
574
+ policy selector, not a boolean control, and defaults to `merge-focused`.
575
+ The App never creates the customer-owned `OLLAMA_API_KEY` secret.
445
576
 
446
577
  When explicitly enabled, same-repository pull requests can run automatic review
447
578
  with either provider mode: cloud on a GitHub-hosted runner or local Ollama on
@@ -455,19 +586,27 @@ item only when the transport reports an oversized response. The 512 KiB
455
586
  transport ceiling remains unchanged. Fork pull requests fail closed before
456
587
  provider or broker access.
457
588
 
458
- When automatic review and GitHub writes are enabled, ReviewSensei selects
459
- `APPROVE` for a validated exact-head result only when it has no inline findings
460
- and a final bounded GitHub thread sweep confirms that every existing review
461
- thread is resolved. Any open finding or thread, draft/closed/fork/stale PR,
462
- App-authored PR, or incomplete thread lookup keeps the event as `COMMENT` or
463
- fails closed; `@sensei` replies are always ordinary comments. Existing review
464
- markers still deduplicate one publication per head, so resolving a thread does
465
- not retroactively approve an already-published review.
466
-
467
- The approval policy is deliberately conservative: severity, fix effort, lens,
468
- and model confidence help triage findings but never override an unresolved
469
- thread. A later head must receive a fresh clean review after the final
470
- resolution sweep. See [ADR 0030](docs/adr/0030-gate-app-approvals-on-resolved-review-threads-and-exact-head-review-safety.md)
589
+ When automatic review and GitHub writes are enabled, automatic approval is on by
590
+ default; set `REVIEWSENSEI_AUTO_APPROVE=false` for an explicit opt-out.
591
+ ReviewSensei publishes blocking findings as `REQUEST_CHANGES` and non-blocking
592
+ findings as `COMMENT`, then invokes one shared, idempotent approval finalizer.
593
+ It emits `APPROVE` for an eligible exact head when no unresolved ReviewSensei
594
+ root is classified blocking. A later execution on the same commit still
595
+ requests changes if blocking comments appear after an approval, and it
596
+ approves after an earlier change request only once those blocking roots are
597
+ resolved. Unresolved non-blocking ReviewSensei findings and human threads do
598
+ not withhold approval. An unclassified ReviewSensei root, malformed or
599
+ incomplete thread data, or a draft/closed/fork/stale/App-authored PR fails
600
+ closed. The finalizer runs after review publication and after the AI resolves a
601
+ blocking ReviewSensei thread; `@sensei` replies themselves remain ordinary
602
+ comments. Existing approval markers prevent duplicate approvals.
603
+
604
+ The approval policy is deliberately conservative: explicit blocking metadata,
605
+ or an unclassified canonical `critical`/`high` severity, blocks approval.
606
+ Resolving a thread manually does not start GitHub Actions, so rerun the review
607
+ workflow (or push a new head) if a manually resolved blocking root was the last
608
+ blocker. See
609
+ [ADR 0032](docs/adr/0032-blocking-finding-classification-for-approvals.md)
471
610
  for the criteria and rollback path.
472
611
 
473
612
  Manual review and authorized `@sensei` replies use the same selected provider
@@ -479,10 +618,10 @@ mode sends that bounded conversation context to Ollama Cloud; local mode keeps
479
618
  it on the configured local service. Published review summaries and inline
480
619
  findings also tell readers to reply with @sensei followed by their question.
481
620
  `review.json` is uploaded only when
482
- `REVIEWSENSEI_UPLOAD_ARTIFACTS=true`; setup-v4 does not create a separate
621
+ `REVIEWSENSEI_UPLOAD_ARTIFACTS=true`; setup-v5 does not create a separate
483
622
  version artifact. See [installation and migration](docs/installation.md) and
484
623
  the reviewable
485
- [`setup-v4 example`](examples/github-actions/review-sensei-review.yml).
624
+ [`setup-v5 example`](examples/github-actions/review-sensei-review.yml).
486
625
 
487
626
  ## Concurrency policy
488
627
 
@@ -490,11 +629,14 @@ Hosts that run more than one review worker can reuse the same deterministic
490
629
  policy:
491
630
 
492
631
  ```python
493
- from review_sensei import ReviewConcurrencyPlan, ReviewService
632
+ from review_sensei import ProviderAdmission, ReviewConcurrencyPlan, ReviewService
494
633
 
495
634
  plan = ReviewService(provider).concurrency_plan(request)
496
635
  # Enforce plan.workflow in the run scheduler.
497
636
  # Enforce plan.provider in the provider-stage scheduler.
637
+ admission = ProviderAdmission(plan.provider)
638
+ with admission.acquire():
639
+ result = ReviewService(provider).review(request)
498
640
  ```
499
641
 
500
642
  The workflow group is keyed by repository and pull request and is latest-wins.
@@ -502,8 +644,14 @@ The provider group uses the same pull-request identity, admits one active
502
644
  provider stage, and does not cancel the active stage. Different pull requests
503
645
  therefore remain independent. `ReviewConcurrencyPlan.for_non_review_trigger()`
504
646
  creates an isolated workflow group with no provider slot for triggers that do
505
- not request a review. ReviewSensei returns this policy but does not own durable
506
- queue state or cross-process cancellation.
647
+ not request a review.
648
+
649
+ GitHub-hosted runs enforce this with native workflow `concurrency` groups
650
+ (`max_active=1`, cancel-in-progress for reviews). Local hosts and tests can
651
+ use `ProviderAdmission` to enforce the same bound in-process, including lease
652
+ release after cancellation or failure and a hard cap on waiters. ReviewSensei
653
+ does not own durable queue state, a global cross-repository lock, or
654
+ cross-process cancellation.
507
655
 
508
656
  ## Data handling
509
657
 
@@ -540,4 +688,10 @@ See [CONTRIBUTING.md](CONTRIBUTING.md), [SECURITY.md](SECURITY.md), and
540
688
 
541
689
  ## License
542
690
 
543
- ReviewSensei is released under the [MIT License](LICENSE).
691
+ ReviewSensei is released under the [MIT License](LICENSE). The synthetic
692
+ evaluation corpus under `evaluation/v1/` is CC0-1.0. For the ownership
693
+ inventory, trademark usage, contribution licensing (DCO; no CLA), and
694
+ Community / Managed / Enterprise boundary, see
695
+ [`docs/ownership-and-licensing.md`](docs/ownership-and-licensing.md),
696
+ [`TRADEMARKS.md`](TRADEMARKS.md), [`CONTRIBUTING.md`](CONTRIBUTING.md), and
697
+ [ADR 0040](docs/adr/0040-community-managed-enterprise-boundary.md).
@@ -0,0 +1,175 @@
1
+ ../../Scripts/review-sensei.exe,sha256=aiJfPftvZjcLCqupusFwyry5-u0omCFFlhRXj-FZHUM,108355
2
+ review_sensei-0.6.6.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
3
+ review_sensei-0.6.6.dist-info/METADATA,sha256=nHIIFWJW9glRh0Yd0BgE0yJYfE8EP12hZ52kGDsaMLM,34155
4
+ review_sensei-0.6.6.dist-info/RECORD,,
5
+ review_sensei-0.6.6.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ review_sensei-0.6.6.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
7
+ review_sensei-0.6.6.dist-info/direct_url.json,sha256=EDhpXdSFq1qZfl2FCT07Hg2gleInjGFaAwkFy0selqU,67
8
+ review_sensei-0.6.6.dist-info/entry_points.txt,sha256=Eki1ToC6hiOv8PMEAd2Cnbh5WWstVzzzf0XmHBHzpMQ,57
9
+ review_sensei-0.6.6.dist-info/licenses/LICENSE,sha256=-eVBqOV92YK1K76UIcK5MrgUh0EiQMe8xNhSysQE68s,1095
10
+ review_sensei-0.6.6.dist-info/top_level.txt,sha256=VCF4gJIJPP3MPJntoITDjMhJ8MUZfVLj-z3-VUQ9XDY,14
11
+ review_sensei/__init__.py,sha256=hBA7OkQbK_oV4-fDFucVnpsnIut_JK-BbXLTznhg8ao,10524
12
+ review_sensei/__main__.py,sha256=0iDYjdmiXNBinFF23WUyotsdpA6wFKjoB5aw3esTSRg,83
13
+ review_sensei/__pycache__/__init__.cpython-311.pyc,,
14
+ review_sensei/__pycache__/__main__.cpython-311.pyc,,
15
+ review_sensei/__pycache__/baseline.cpython-311.pyc,,
16
+ review_sensei/__pycache__/cli.cpython-311.pyc,,
17
+ review_sensei/__pycache__/concurrency.cpython-311.pyc,,
18
+ review_sensei/__pycache__/context.cpython-311.pyc,,
19
+ review_sensei/__pycache__/convergence.cpython-311.pyc,,
20
+ review_sensei/__pycache__/conversation.cpython-311.pyc,,
21
+ review_sensei/__pycache__/coverage.cpython-311.pyc,,
22
+ review_sensei/__pycache__/diagnostics.cpython-311.pyc,,
23
+ review_sensei/__pycache__/diff.cpython-311.pyc,,
24
+ review_sensei/__pycache__/disposition.cpython-311.pyc,,
25
+ review_sensei/__pycache__/errors.cpython-311.pyc,,
26
+ review_sensei/__pycache__/evaluation.cpython-311.pyc,,
27
+ review_sensei/__pycache__/learnings.cpython-311.pyc,,
28
+ review_sensei/__pycache__/models.cpython-311.pyc,,
29
+ review_sensei/__pycache__/openrouter_qualification.cpython-311.pyc,,
30
+ review_sensei/__pycache__/outcomes.cpython-311.pyc,,
31
+ review_sensei/__pycache__/patches.cpython-311.pyc,,
32
+ review_sensei/__pycache__/planning.cpython-311.pyc,,
33
+ review_sensei/__pycache__/presentation.cpython-311.pyc,,
34
+ review_sensei/__pycache__/provider_config.cpython-311.pyc,,
35
+ review_sensei/__pycache__/release_manifest.cpython-311.pyc,,
36
+ review_sensei/__pycache__/schemas.cpython-311.pyc,,
37
+ review_sensei/__pycache__/sequence.cpython-311.pyc,,
38
+ review_sensei/__pycache__/service.cpython-311.pyc,,
39
+ review_sensei/__pycache__/session.cpython-311.pyc,,
40
+ review_sensei/__pycache__/stages.cpython-311.pyc,,
41
+ review_sensei/__pycache__/validation.cpython-311.pyc,,
42
+ review_sensei/__pycache__/verifier.cpython-311.pyc,,
43
+ review_sensei/__pycache__/workflow.cpython-311.pyc,,
44
+ review_sensei/baseline.py,sha256=nJegFpLDW-YviQqUt8QXWSOgzuPIWg3ryz1DTr87d4U,54311
45
+ review_sensei/cli.py,sha256=CarOAUk2BhP2vsIzmMq6IPtJV5gc2d78Z0rqD0ZJjm8,130843
46
+ review_sensei/concurrency.py,sha256=7nqMDNaIl7YoKafkAF1ctXu6D5SFxXosm-1407OKimQ,20097
47
+ review_sensei/context.py,sha256=ejDs0EBaUVTbAkrs-wACGXbgQcEwClX0Tultn2Mo_R0,96255
48
+ review_sensei/convergence.py,sha256=XJQ3Fx4N41Fzf_Y2PVeebyS3tf7e7cpbD1p4VdPuHTg,54234
49
+ review_sensei/conversation.py,sha256=KRWtF8JnmOrOQsvAX4q-d0UzzXjNp2XeePSbyIm4_pw,7467
50
+ review_sensei/coverage.py,sha256=8fVsO4x2swqaa9QI5fcqeqB_FB6m0JfKrlRCg7_KA6E,12951
51
+ review_sensei/default_categories/01-correctness.json,sha256=ZeTTvEavHU6_ih7JKhv8a6gH-4wRJGv0abckRWNWTfs,211
52
+ review_sensei/default_categories/02-security.json,sha256=6mz8Hlteb9q1PouLDmDoR-1wxrN31XR2X5I9yoYiG-E,231
53
+ review_sensei/default_categories/03-architecture.json,sha256=Fg3VsUCzl9trCpSnoOgwTqfNHbB7a4znEfrw2apqjXA,806
54
+ review_sensei/default_categories/03-maintainability.json,sha256=eyF9_slQ50LwEqSSet63jthfNp9ZOTnwiDVtVYjVv1A,229
55
+ review_sensei/default_categories/04-tests.json,sha256=UHhvH79bae9FmLJT_MYNvki4Y9xhJDLpDuLdgp2npe0,208
56
+ review_sensei/default_stages/01-default-review.json,sha256=-y9LP_8XNqEPpRN2K8z_qMHRqXyP6ZsiydzZFHozZwY,3463
57
+ review_sensei/diagnostics.py,sha256=CAYZPlOBlJ8ZNyPUrbzX-bcnbigxhA593_aaGqNj5hY,44971
58
+ review_sensei/diff.py,sha256=na5MWhYcnRimFwGElNBiSp27Su_oufHhWiGtm1W38oY,32057
59
+ review_sensei/disposition.py,sha256=jENlqe7JU3kPCBo-0_jxpfEkb_rltcEvXoRihstmo7s,24908
60
+ review_sensei/errors.py,sha256=1-JKbLcEodjQMXleJwR-QDzRhMSFwDSe9Oc6Pg1UYmY,2901
61
+ review_sensei/evaluation.py,sha256=kKhbcF3XpHhDYLW8e_dxGjcS0sXJpz8nXYsPpUuXnBE,59450
62
+ review_sensei/hosting/__init__.py,sha256=zqIukHwfUzai3x7dJS2nFNlVhP7EQWQ47-4pGCi2Sz0,84
63
+ review_sensei/hosting/__pycache__/__init__.cpython-311.pyc,,
64
+ review_sensei/hosting/__pycache__/openrouter_workflow.cpython-311.pyc,,
65
+ review_sensei/hosting/github/__init__.py,sha256=x-mVioarkGsUF8Uwh4SfpEMOu51lP9p6tA4N0G6pB8o,5452
66
+ review_sensei/hosting/github/__pycache__/__init__.cpython-311.pyc,,
67
+ review_sensei/hosting/github/__pycache__/application.cpython-311.pyc,,
68
+ review_sensei/hosting/github/__pycache__/approval.cpython-311.pyc,,
69
+ review_sensei/hosting/github/__pycache__/auth.cpython-311.pyc,,
70
+ review_sensei/hosting/github/__pycache__/broker.cpython-311.pyc,,
71
+ review_sensei/hosting/github/__pycache__/broker_client.cpython-311.pyc,,
72
+ review_sensei/hosting/github/__pycache__/conversation.cpython-311.pyc,,
73
+ review_sensei/hosting/github/__pycache__/errors.cpython-311.pyc,,
74
+ review_sensei/hosting/github/__pycache__/http.cpython-311.pyc,,
75
+ review_sensei/hosting/github/__pycache__/jwt.cpython-311.pyc,,
76
+ review_sensei/hosting/github/__pycache__/learning_pr.cpython-311.pyc,,
77
+ review_sensei/hosting/github/__pycache__/observed.cpython-311.pyc,,
78
+ review_sensei/hosting/github/__pycache__/oidc.cpython-311.pyc,,
79
+ review_sensei/hosting/github/__pycache__/publication.cpython-311.pyc,,
80
+ review_sensei/hosting/github/__pycache__/session_ledger.cpython-311.pyc,,
81
+ review_sensei/hosting/github/__pycache__/setup.cpython-311.pyc,,
82
+ review_sensei/hosting/github/__pycache__/trigger.cpython-311.pyc,,
83
+ review_sensei/hosting/github/__pycache__/webhooks.cpython-311.pyc,,
84
+ review_sensei/hosting/github/application.py,sha256=L9GyMXzvtxZkFXaG9XWWitf2Z974bV9krwp8VVxCb0k,70460
85
+ review_sensei/hosting/github/approval.py,sha256=nx8h8oDvljrdrXkNahMXrvk3kMVkMy6owztXZPRwsqA,4189
86
+ review_sensei/hosting/github/auth.py,sha256=koITagUX9piVboGJ_smEhPsCf4rOQkOqqSKeLKvFRbc,19055
87
+ review_sensei/hosting/github/broker.py,sha256=FFC7DsFhzy1tENXTCmLNuYzX2cHaYsgMkDGwXEcJaTU,18014
88
+ review_sensei/hosting/github/broker_client.py,sha256=v8_PQe7yF0kXtZOEbXxWcw2xW-Z7COQt9Zi8CTsQkHM,16573
89
+ review_sensei/hosting/github/conversation.py,sha256=j0WNXWEcLLjaAHhYkk0WTbLHUXyikDKjhppCaEgImLY,62918
90
+ review_sensei/hosting/github/errors.py,sha256=K5Lfsh4uzuAW6tER2l7pcEM4Lz6FwGEmMPxvF1vNc4E,5352
91
+ review_sensei/hosting/github/fixtures/__init__.py,sha256=2sBygkvppFJ6F8KV1_MDmbBNl7Yd0oPvYOFG6R_NOpA,82
92
+ review_sensei/hosting/github/fixtures/__pycache__/__init__.cpython-311.pyc,,
93
+ review_sensei/hosting/github/fixtures/historical-v4-uninstall.yml,sha256=VrX1XpTrOlqscHDoJM_yRKwbP-cvcFvnG79G3HTO3hY,2664
94
+ review_sensei/hosting/github/fixtures/merge-focused-v4-caller.yml,sha256=EGs0F3O7Ictx0azK07q_6Px2cMTA87mKCLnsWSyIoFY,17496
95
+ review_sensei/hosting/github/fixtures/merge-focused-v4-config.yml,sha256=4L1UvSucMGJqPh_OwmPgq_lE-nenySkIg7Xogtmk7Us,464
96
+ review_sensei/hosting/github/fixtures/released-v4-resolve-trigger-runner-switch.yml,sha256=09um6w5QmIodLMrbR10z4gdZ3f5AaVj7eqjhQzOfkV8,16194
97
+ review_sensei/hosting/github/http.py,sha256=6Dz9S-U4M07KehE7FhjNyrBt_XKKz4Dnp6zULMFKHk0,8943
98
+ review_sensei/hosting/github/jwt.py,sha256=mTakXBxU-GR-hBnIZE-FryfFXwpS9hJ7qb3X7P0FBMo,4582
99
+ review_sensei/hosting/github/learning_pr.py,sha256=hT7FmmpWCnUO5WCQEmP9XioQiceNALxuJCtcZXAQxSU,112424
100
+ review_sensei/hosting/github/observed.py,sha256=Pin563D-wNQVeC0_PSrh8W1138K5xM2jbN_lE2MyK6s,36230
101
+ review_sensei/hosting/github/oidc.py,sha256=h3UVcBYQIKy-xQS7Ixv3_fy670mmuBoNKSYurPZWZ60,13310
102
+ review_sensei/hosting/github/publication.py,sha256=h-j_FpqftFwC7gjO-jvrtUwayL31LKISECC7AGJxDTQ,85760
103
+ review_sensei/hosting/github/session_ledger.py,sha256=bqalhVAz6AolacYn-paxdddofl7uyeR_kZE7s750iqo,31057
104
+ review_sensei/hosting/github/setup.py,sha256=jhMoMbnlZBO2vPb1X8kdYnjC_ArHl1EMENR70J7N15A,107713
105
+ review_sensei/hosting/github/trigger.py,sha256=ewwnF02jV1llat5xXwXM3AzZLpMLoD3El0gLKIhsIiM,11395
106
+ review_sensei/hosting/github/webhooks.py,sha256=7hh_YlF7riV6wov7A_27aOb5g6-Ivob1PBWR4m5bF3I,13662
107
+ review_sensei/hosting/openrouter_workflow.py,sha256=qepVpa12sL6mTaBqTGhcWEaYI8zawcgAYK6sOCRnKtE,1330
108
+ review_sensei/learnings.py,sha256=AF9Dqyreb9WQLWLZiciuyRXNviSso6sYVTe2xzx1ZfY,21434
109
+ review_sensei/models.py,sha256=UL3bnferZPU6ra5ris6JDJ0XMIjgvMqbgCYM8YtmeU8,93017
110
+ review_sensei/openrouter_qualification.py,sha256=UKUL8oK8oexX1P_othR3y_QAAW0PG2EdAYnWXA-ACZI,30296
111
+ review_sensei/outcomes.py,sha256=uFpb5-n3mvuQ71ljGQp7KHAmjtCHx13YbiXnTkmCiuk,32183
112
+ review_sensei/patches.py,sha256=P9plsU7-5Z-Jxy8EJBFQX5hX3bcmxBoRJxTnEqA_tbA,15981
113
+ review_sensei/planning.py,sha256=6rb6w-tNhXCBOl6-_N6A2fQox6cGjL88kOAhn4oGTpA,23289
114
+ review_sensei/presentation.py,sha256=JlbvtcFV_Kok_21ATtDNj-kHfcmCpk5v7N15RulAAVQ,6587
115
+ review_sensei/provider_config.py,sha256=Hgs0oNI6sNYJxuMi38dZ8YyF-Nu1i5CF7mi0K_2Kr0Q,16385
116
+ review_sensei/providers/__init__.py,sha256=gmfB6gm0QN_FfN3lJJ0kN8QgTtJom4ayzaqUkLmwQwc,779
117
+ review_sensei/providers/__pycache__/__init__.cpython-311.pyc,,
118
+ review_sensei/providers/__pycache__/base.cpython-311.pyc,,
119
+ review_sensei/providers/__pycache__/fixture.cpython-311.pyc,,
120
+ review_sensei/providers/__pycache__/ollama.cpython-311.pyc,,
121
+ review_sensei/providers/__pycache__/openai_compatible.cpython-311.pyc,,
122
+ review_sensei/providers/__pycache__/openrouter.cpython-311.pyc,,
123
+ review_sensei/providers/__pycache__/profiles.cpython-311.pyc,,
124
+ review_sensei/providers/__pycache__/registry.cpython-311.pyc,,
125
+ review_sensei/providers/__pycache__/routing.cpython-311.pyc,,
126
+ review_sensei/providers/__pycache__/transport.cpython-311.pyc,,
127
+ review_sensei/providers/base.py,sha256=u-z9bQNi3sjPudoDb52czjOmM2YwBX_Kwniopz_LfWI,2009
128
+ review_sensei/providers/fixture.py,sha256=-HXetG6cXpWd5NlF1-RMA3aqyr88YHwYpiyz0Bc6BO8,1554
129
+ review_sensei/providers/ollama.py,sha256=50u86LU-FYulbBxJP_vShGw-9t2sGCVfceGE8vjZdFY,10739
130
+ review_sensei/providers/openai_compatible.py,sha256=fJFCUz_tyhBG7STItvfNybOq7V620k47_VgSbizRDWU,19441
131
+ review_sensei/providers/openrouter.py,sha256=8gFslaz82oOtDxG58o1-wdn9IH2T_bKjeJE738gphJ8,23224
132
+ review_sensei/providers/profiles.py,sha256=_vhQPNMBT2x-6AU-xVqM0lqTlT2cTiXMv5xwb5-C2EM,9352
133
+ review_sensei/providers/registry.py,sha256=_YifbpFtgsARRF5l1VJsyQgovJgjrgvB_VLT-SUAE9k,12088
134
+ review_sensei/providers/routing.py,sha256=-EttO963m9Gh3E5hlF72EvyFDN9qMabPmm05b3m5QH0,7064
135
+ review_sensei/providers/transport.py,sha256=9QhvHM33gYE7DbmXNxhfBoVDsa7Hx3audaxzRd_7pS4,2937
136
+ review_sensei/release_manifest.py,sha256=a7pPhr0YVBCrzC6Q8JC4HiqTD3aBUyTYV4Y0827U5TA,37775
137
+ review_sensei/schemas.py,sha256=DG0Z2VsZUKRaoLNquemWSsGT8XFavUy1ot-W3ADowWw,2736
138
+ review_sensei/schemas/blocker-admission.schema.json,sha256=M3nBzti7M5yAWKFDcsfdJ3TsPbiJrEEn2Zj4yYUDBPQ,2800
139
+ review_sensei/schemas/canary-binding.schema.json,sha256=065T5GIYG16P9S22HEKrHeRg6unHu8WXedbJxwUYBgk,794
140
+ review_sensei/schemas/candidate-finding.schema.json,sha256=P_FM6pbwdOZGZPAiI_E_ZSmxDfScu2u_2RPzpkdIdmk,1982
141
+ review_sensei/schemas/channel-promotion.schema.json,sha256=LNQgvm6IxntfXrpEnoVz4aL_7_ALo8syiVYEFrfxHYw,1085
142
+ review_sensei/schemas/compatibility-manifest.schema.json,sha256=RIsEo5Os6obelQ078cySd3BHJxGgAySCQg0f0KHRpzY,1858
143
+ review_sensei/schemas/concurrency-plan.schema.json,sha256=YtHPlfShzFPLE4sQMEn7TogW3souwiKC6d4yd-kgFRY,830
144
+ review_sensei/schemas/convergence-sequence-report.schema.json,sha256=FWNUHgdlqlu9SOazQsEVxhBqFY4P_uLynb4OsI8VE1E,2323
145
+ review_sensei/schemas/conversation-reply.schema.json,sha256=bKHxO1CX_g_VrWDb1e0GKPGIUzMPORchHqrT805yPXA,682
146
+ review_sensei/schemas/coverage-manifest.schema.json,sha256=rrbvq1YYNt-c4YPLmdmrzWo_Au-rDu-e35eg3NdZzQQ,2765
147
+ review_sensei/schemas/evaluation-corpus.schema.json,sha256=0W3-zgmVFa5AjDSs385szKNt4DX_D_ZdrE9ur3Nrnz0,7905
148
+ review_sensei/schemas/evaluation-report.schema.json,sha256=kPLXcJv3XeRFNW__VnQzrnovXHaKfS4-ZevfLDgV1xY,10012
149
+ review_sensei/schemas/later-finding-classification.schema.json,sha256=YxsogG9aN4Kbm7__lJpvhOMBbuRe8NbDKS4GnJf4Kl4,2092
150
+ review_sensei/schemas/learning-entry.schema.json,sha256=QtbNYK_eIPmXos4TlYbCFL8EvYAqOx-dxUXDM5wBGQ4,1782
151
+ review_sensei/schemas/learning-feedback.schema.json,sha256=SbNqRSdA82pV5a8Zbzbnjm7U7sj4s9epqRPlJ7-lgAg,1925
152
+ review_sensei/schemas/learning-proposal.schema.json,sha256=FVYG4sFWGil_66-6NlliFCk2LpiCfJn-yTrY4dN-b0E,644
153
+ review_sensei/schemas/observed-convergence-report.schema.json,sha256=amIk4vhjbfn_Zpyz3_qRWHsUJ3M3RAxrXWAvx_K3ipg,5228
154
+ review_sensei/schemas/openrouter-qualification.schema.json,sha256=wIgsZxwvAsKuptmjfsD_8UitPcl-DLAzxjlCD-pZyx8,4203
155
+ review_sensei/schemas/promotion-record.schema.json,sha256=CHJ99AjwioPthygjTimPjXNuG2rriW4DFZw54fa1rfs,2402
156
+ review_sensei/schemas/recovery-artifact.schema.json,sha256=ZP-C_E_nQlFsuObxFn2O0iJLMbDMgNWAF7h4BpPyM3g,1254
157
+ review_sensei/schemas/review-category.schema.json,sha256=Rni93qGN2LyJSrHRF-GcgVdAjqXGnDU5yjIjG2wn7pI,2189
158
+ review_sensei/schemas/review-comment.schema.json,sha256=0A9J_vzYnMUpKsv9wZUGGnCd1ryP-8uksPEbSJWj8Xo,1140
159
+ review_sensei/schemas/review-convergence-policy.schema.json,sha256=E4pGr4CNMzvBUdJ7hTFJy4tzm7iolitG0vClqsj1rcU,1348
160
+ review_sensei/schemas/review-result.schema.json,sha256=jzQMoZIMw2HVC4EhUPfcSuScCd48URPfq6DGX9KnHZM,4899
161
+ review_sensei/schemas/review-round-decision.schema.json,sha256=4Nd306X6_pU4co4papD0nv6D0K5-n3LefGbUYC9M1Ow,1594
162
+ review_sensei/schemas/review-stage.schema.json,sha256=H5CDiC-ngQXJpVomEvd8YPP1tgyPgwo_k3atK4Vjev0,4707
163
+ review_sensei/schemas/review-transaction.schema.json,sha256=KWtsfa0p0CmPx--cB91XpDizF2Z6N2Ehg5YMlRqJwN8,2215
164
+ review_sensei/schemas/run-outcome.schema.json,sha256=pyByHFmQ8yNFPsLD7wccR5lxsWBwzoxNyD77bjNqeU8,1744
165
+ review_sensei/schemas/session-record.schema.json,sha256=DCkPnK8o5va5lkPInHZm6dLyZKnkDKJmNVCD_b06liM,11949
166
+ review_sensei/schemas/stage.schema.json,sha256=WsxbwZFGpRNCyZ6xzWsAQHf8f7YpJLAh9FKRXN_vlao,2900
167
+ review_sensei/schemas/verification-result.schema.json,sha256=Hf765S-aC1Tk4c7KMWaaSf5DMsg6ogmjnHXcjcHE01k,625
168
+ review_sensei/schemas/verification-scope.schema.json,sha256=402Q7OiLHnb41lwb5JkVoKUpCe19fMV9hVhTjsenLFo,2141
169
+ review_sensei/sequence.py,sha256=kUehmk85gtZPSpSsAiUxtK_UVeVZPK6MFwy2av-IGXc,23791
170
+ review_sensei/service.py,sha256=wfU84eab9uXH-ph3JYxcUGWni6oKy1pRLnySqu-thVc,70808
171
+ review_sensei/session.py,sha256=x1VcNk5EF4jjLxPU1D0LVl73E-hDgofmeZEpT6Z8O2o,130802
172
+ review_sensei/stages.py,sha256=rMomi3dvKrEl3yiuy2VbX09_bLu8dWD2rblFH8aJ6yI,24256
173
+ review_sensei/validation.py,sha256=euLaI7cxwTCxcpNRh-F8zGz0BQu8GMG3cA3_1_wtdkU,12390
174
+ review_sensei/verifier.py,sha256=_6cbaoXj8R9hatM7fZav-BgfkSPRyJ4ASmQlZbxF5HA,34913
175
+ review_sensei/workflow.py,sha256=b20eeP9ekbNYGibNCYCcvKSLK7cO3bpCsXiA7y9y33Y,23572
Binary file