Skip to content

fix(auth): maintain native verification state - #8845

Merged
iscekic merged 19 commits into
mainfrom
drain/native-code-state
Oct 27, 2026
Merged

iscekic merged 19 commits into
mainfrom
drain/native-code-state

Conversation

@iscekic

@iscekic iscekic commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator

Evidence

Evidence: demonstrated — local database-backed regression suites and the running development web app exercised native sign-in code issuance, verification, credential settlement, and refusal responses at 305f92120b97f67947444068a382a21701eedede with owned fake accounts, local PostgreSQL, the local email outbox, and development admission.

Change

Persist native verification state with the approved compatibility contract and existing response values and telemetry. Include behavioral regression coverage and one generated additive migration.

This follow-up merges current main, resolves the migration-index collision by regenerating this branch's migration as 0309_ancient_sauron.sql with matching snapshot and journal metadata after main's newest entries, and keeps the application implementation unchanged. The generated SQL adds one column. After the merge, the branch differs from main only in this migration and the sign-in code verification accounting with its tests.

Verification

  • pnpm install --frozen-lockfile — passed.
  • pnpm drizzle check and the migration journal test — passed, with an existing timestamp-order warning for historical entries 0034 and 0035.
  • pnpm drizzle migrate — the full chain applied from an empty database: 310 journal entries recorded, the table reports the new integer column with default 0 and NOT NULL, and the newest main indexes exist.
  • Targeted database-backed Jest run for magic-link-tokens.test.ts, native token route, and native OTP route at this head — 3 suites, 158 tests passed.
  • HTTP proof at this head against the running development app, owned fake accounts, issuance captured in the local email outbox, development admission sentinel:
    • five wrong compatibility guesses were refused as wrong codes, and the challenge-bound correct code still settled with a credential pair;
    • with the allowance spent by compatibility guesses, a further wrong guess in the other mode returned 429 TOO_MANY_ATTEMPTS, while the challenge-bound correct code still settled;
    • replaying a consumed code returned 401 INVALID_CODE;
    • five wrong challenge-bound guesses were refused, and the next verification returned 429 TOO_MANY_ATTEMPTS;
    • a compatibility caller settled a live code by email.
  • Persisted state after that run: rows with five compatibility guesses recorded legacy_attempts = 5, attempts = 0; rows with five challenge-bound guesses recorded attempts = 5, legacy_attempts = 0; settled rows were consumed. All 8 assertions passed.
  • git diff --check — passed. Generated migration metadata follows the repository formatter exclusion.

This is a nonvisual backend change. No screenshot is applicable. Live email delivery, production firewall configuration, and platform attestation were not exercised.

Production prerequisites

None.

Proxy answers

The owner's proxy gave these answers in the owner's place.

  1. Question: Compatibility policy scope — Answer: Approve scoped compatibility plan. Confidence: 0.86. Precedent: Scoped implementation with human merge ownership for authentication and database work.
  2. Question: Inherited CI cleanup — Answer: Apply minimal CI cleanup. Confidence: 0.80. Precedent: Correct small inherited failures needed for verification.
  3. Question: Verification allowance policy — Answer: Combined cap on wrong guesses only (Recommended). Confidence: 0.70. Precedent: Preserve the supported client contract.
  4. Question: Temporary local credential routing for publication — Answer: Temporary credential routing. Confidence: 0.65. Precedent: Use an existing authorized credential for recovery, then restore the original local configuration.

@iscekic iscekic added drain Work item from the findings drain janitor:trust Janitor finding: trust boundary hardening labels Oct 23, 2026
@kilo-code-bot

kilo-code-bot Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Executive Summary

The incremental commit replaces a stale storage-key test with boundary coverage of the 64-byte message cursor id limit, which now matches the fitsKiloSdkMessagesCursorId rule already applied on main.

Assumptions: [INFERENCE] Test behavior was verified by reading the schema and contract rather than executing the suite. msg_ + 60 characters is exactly 64 bytes and msg_ + 62 is 66 bytes, so the accepted/rejected pair correctly brackets MAX_KILO_SDK_MESSAGES_CURSOR_ID_BYTES (packages/session-ingest-contracts/src/rpc-contract.ts:1021). The previous migration finding is resolved: 0307_misty_grim_reaper.sql, its snapshot, and the journal entry at idx 307 are present and chain from 0306. The prior per-mode attempt-budget comment is addressed at magic-link-tokens.ts:210 and :247, where wrong guesses are bounded by attempts + legacy_attempts.

Files Reviewed (1 file)
  • services/session-ingest/src/types/session-sync.test.ts - 0 issues (deleted the incorrect 256-character acceptance assertion, which contradicted the 64-byte cursor contract on main, and added both reject-above and accept-at-boundary cases)
Previous Review Summaries (9 snapshots, latest commit cd2d9d4)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit cd2d9d4)

Status: No Issues Found | Recommendation: Merge

Executive Summary

The incremental change only renumbers the additive legacy_attempts migration to 0307_misty_grim_reaper on top of main's migrations through 0306; the SQL is byte-identical to the previously reviewed file, the snapshot prevId chains to 0306's id, the journal has a unique idx 307 entry matching the tag, and the schema delta remains the single additive column.

Assumptions: [INFERENCE] The deploy pipeline runs the Drizzle migrator before promotion, as the PR description states; the additive NOT NULL DEFAULT 0 column on magic_link_tokens is metadata-only on PostgreSQL 11+ and does not rewrite the populated table. Migration artifacts were not executed in this read-only review; consistency was verified by comparing the SQL, the 0307 snapshot's prevId chain to 0306's id, the 238-table parity between the 0306 and 0307 snapshots with only legacy_attempts added, and the single journal entry at idx 307. The native auth implementation is unchanged since the previous review; a targeted re-check at magic-link-tokens.ts:210 and :247 confirms wrong guesses are bounded by the combined attempts + legacy_attempts allowance while the correct code remains settleable in whichever mode still has budget, so the earlier split-budget concern is resolved.

Files Reviewed (6 files)
  • packages/db/src/migrations/0307_misty_grim_reaper.sql - 0 issues (single additive ADD COLUMN legacy_attempts integer DEFAULT 0 NOT NULL, unchanged from the reviewed 0303_native_code_state.sql)
  • packages/db/src/migrations/meta/0307_snapshot.json - 0 issues (generated; same 238 tables as 0306, only legacy_attempts added, prevId matches 0306's id)
  • packages/db/src/migrations/meta/_journal.json - 0 issues (idx 307 follows main's 306, tag matches the SQL file, all 308 idx values unique)
  • packages/db/src/schema.ts - 0 issues (migration present at 0307)
  • packages/web-shared/src/lib/auth/magic-link-tokens.ts - 0 issues (unchanged since prior review; combined wrong-guess bound at lines 210 and 247)
  • packages/web-shared/src/lib/auth/magic-link-tokens.test.ts - 0 issues (unchanged since prior review)

Previous review (commit 66bd1f2)

Status: No Issues Found | Recommendation: Merge

Executive Summary

The incremental change only renumbers the additive legacy_attempts migration to 0303_native_code_state on top of current main; the SQL, snapshot delta, and journal chain stay consistent with packages/db/src/schema.ts:5062, and the previously flagged missing-migration and single-allowance concerns are resolved in the current code.

Assumptions: [INFERENCE] The deploy pipeline runs the Drizzle migrator before promotion, as the PR description states; the additive NOT NULL DEFAULT 0 column on the populated magic_link_tokens table is metadata-only on PostgreSQL 11+ and does not rewrite the table. Migration artifacts were not executed in this read-only review; consistency was verified by comparing the SQL, the 0303 snapshot's prevId chain to 0302's id, the presence of only the new column, and the single journal entry at idx 303. The remaining inline WARNING about a split guess budget describes behavior the current code does not have, since magic-link-tokens.ts:210 and :247 reject wrong guesses once attempts + legacy_attempts reaches the allowance.

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 0
Files Reviewed (6 files)
  • packages/db/src/migrations/0303_native_code_state.sql - 0 issues (single additive ADD COLUMN legacy_attempts integer DEFAULT 0 NOT NULL, matches schema)
  • packages/db/src/migrations/meta/0303_snapshot.json - 0 issues (generated; only the new column plus chained id/prevId differ from 0302)
  • packages/db/src/migrations/meta/_journal.json - 0 issues (idx 303 follows main's 302, tag matches SQL file)
  • packages/db/src/schema.ts - 0 issues (previous finding resolved: migration present at 0303)
  • packages/web-shared/src/lib/auth/magic-link-tokens.ts - 0 issues (unchanged since prior review; targeted re-check confirms combined wrong-guess bound at lines 210 and 247)
  • packages/web-shared/src/lib/auth/magic-link-tokens.test.ts - 0 issues (unchanged since prior review)

Previous review (commit 55bed42)

Status: No Issues Found | Recommendation: Merge

Executive Summary

The follow-up commit adds the missing legacy_attempts migration at index 0302 with a matching snapshot and journal entry, resolving the previously flagged schema/migration gap; the diff contains only generated migration artifacts that match packages/db/src/schema.ts:5062.

Assumptions: [INFERENCE] The deploy pipeline runs the Drizzle migrator before promotion, as the PR description states; the additive NOT NULL DEFAULT 0 column on magic_link_tokens is metadata-only on PostgreSQL 11+ and does not rewrite the table. Migration artifacts were not executed in this read-only review; correctness was verified by comparing the SQL, snapshot delta, and journal chain against the schema.

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 0
Files Reviewed (6 files)
  • packages/db/src/migrations/0302_harsh_silhouette.sql - 0 issues (single additive ADD COLUMN legacy_attempts integer DEFAULT 0 NOT NULL, matches schema)
  • packages/db/src/migrations/meta/0302_snapshot.json - 0 issues (generated; delta from 0301 is only the new column plus chained id/prevId)
  • packages/db/src/migrations/meta/_journal.json - 0 issues (idx 302 follows 301, tag matches SQL file)
  • packages/db/src/schema.ts - 0 issues (previous finding resolved: migration now exists)
  • packages/web-shared/src/lib/auth/magic-link-tokens.ts - 0 issues (targeted re-check: shared attempts + legacy_attempts bound present at lines 210 and 247)
  • packages/web-shared/src/lib/auth/magic-link-tokens.test.ts - 0 issues

Previous review (commit 571a0d1)

Status: 1 Issues Found | Recommendation: Address before merge

Executive Summary

The revised shared wrong-guess allowance fixes the previously flagged split-budget issue, but the merge with main dropped the only migration for legacy_attempts, so the schema and runtime now reference a column the deploy pipeline will never create.

Assumptions: [INFERENCE] The deploy pipeline applies only the committed Drizzle migrations (as the PR description states); if legacy_attempts is created out-of-band in production the outage would not occur. The earlier in-thread WARNING about two independent per-mode allowances is resolved by the new attempts + legacy_attempts bound.

Overview

Severity Count
CRITICAL 1
WARNING 0
SUGGESTION 0
Issue Details (click to expand)

CRITICAL

File Line Issue
packages/db/src/schema.ts 5062 legacy_attempts is declared in the schema but no migration adds it: the branch's additive migration was dropped during the final merge with main and never regenerated. _journal.json ends at 0301_contributor_credit_window and meta/0301_snapshot.json has no legacy_attempts, while reserveSignInCode selects the full row and evaluates magic_link_tokens.legacy_attempts, so native sign-in code verification fails with "column does not exist". Regenerate on current main at index 0302 with SQL, snapshot, and journal.
Files Reviewed (3 files)
  • packages/db/src/schema.ts - 1 issue
  • packages/web-shared/src/lib/auth/magic-link-tokens.ts - 0 issues
  • packages/web-shared/src/lib/auth/magic-link-tokens.test.ts - 0 issues

Fix these issues in Kilo Cloud

Previous review (commit 4f0839e)

Status: 1 Issues Found | Recommendation: Address before merge

Executive Summary

The change's only substantive concern remains the split per-mode guess budget: one live sign-in code now carries two independent five-failure counters, so the same row admits up to ten wrong guesses; the migration renumber and snapshot regeneration are otherwise clean.

Assumptions: [INFERENCE] Issuance-side and email-firewall rate limiting were not re-read in full; the doubled per-code budget assumes those do not also cap wrong guesses per code. The per-mode counter split is described in the PR as an owner-approved policy decision, so the WARNING is carried forward for the human merge decision rather than as a new blocking finding.

Overview

Severity Count
CRITICAL 0
WARNING 1
SUGGESTION 0
Issue Details (click to expand)

WARNING

File Line Issue
packages/web-shared/src/lib/auth/magic-link-tokens.ts 170 Choosing the counter from challengeId gives one live sign-in code two independent five-guess allowances (attempts and legacy_attempts), so the same row admits up to ten wrong guesses instead of one five-guess cap; when one mode is exhausted, switching modes yields a fresh budget for the same code. The new serializes verification counters test asserts attempts: 5 and legacy_attempts: 5 on the same row, confirming the behavior. Already raised inline; the author declined in-thread citing the owner-approved per-mode contract, so it is carried forward only for the human merge decision.
Files Reviewed (6 files)
  • packages/db/src/migrations/0300_flaky_magdalene.sql - 0 issues (additive ADD COLUMN ... DEFAULT 0 NOT NULL; constant default is metadata-only on PostgreSQL, no table rewrite)
  • packages/db/src/migrations/meta/0300_snapshot.json - 0 issues (generated; prevId matches the 0299 snapshot id, and a normalized diff against 0299 shows only the added legacy_attempts column)
  • packages/db/src/migrations/meta/_journal.json - 0 issues (generated; idx/tag 0300_flaky_magdalene consistent with the SQL file and snapshot)
  • packages/db/src/schema.ts - 0 issues (legacy_attempts default/notNull match the migration and snapshot)
  • packages/web-shared/src/lib/auth/magic-link-tokens.test.ts - 0 issues
  • packages/web-shared/src/lib/auth/magic-link-tokens.ts - 1 issue (carried forward from the active inline comment)

Previous review

Status: 1 Issues Found | Recommendation: Address before merge

Executive Summary

The sign-in code still splits one live code's five-guess budget into two independent five-guess counters, so the same row admits up to ten wrong guesses; all other changes since the prior review are a clean migration renumber and a merge from main.

Assumptions: [INFERENCE] Issuance-side rate limiting and the email firewall limiter were not re-read in full; the doubled per-code budget assumes those do not also cap wrong guesses per code. The per-mode counter split is an owner-approved policy decision per the PR, so the WARNING is carried forward for the human merge decision.

Overview

Severity Count
CRITICAL 0
WARNING 1
SUGGESTION 0
Issue Details (click to expand)

WARNING

File Line Issue
packages/web-shared/src/lib/auth/magic-link-tokens.ts 170 Selecting the counter from challengeId gives one live sign-in code two independent five-guess allowances (attempts and legacy_attempts), so the same row admits up to ten wrong guesses instead of one five-guess cap. Previously raised inline; the author declined in-thread citing the owner-approved per-mode contract. The new serializes verification counters test asserts attempts: 5 and legacy_attempts: 5 on the same row, confirming the behavior.
Files Reviewed (6 files)
  • packages/db/src/migrations/0300_flaky_magdalene.sql - 0 issues (additive ADD COLUMN ... DEFAULT 0 NOT NULL; constant default is metadata-only on PostgreSQL)
  • packages/db/src/migrations/meta/0300_snapshot.json - 0 issues (generated; legacy_attempts present and prevId matches the 0299 snapshot id)
  • packages/db/src/migrations/meta/_journal.json - 0 issues (generated; idx/tag 0300_flaky_magdalene consistent)
  • packages/db/src/schema.ts - 0 issues
  • packages/web-shared/src/lib/auth/magic-link-tokens.test.ts - 0 issues
  • packages/web-shared/src/lib/auth/magic-link-tokens.ts - 1 issue (carried forward from the active inline comment)

Fix these issues in Kilo Cloud

Previous review (commit 9906fec)

Status: 1 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 1
SUGGESTION 0
Issue Details (click to expand)

WARNING

File Line Issue
packages/web-shared/src/lib/auth/magic-link-tokens.ts 170 Selecting the attempt counter from challengeId gives one live sign-in code two independent five-guess allowances (attempts and legacy_attempts), so the same row admits up to ten wrong guesses instead of one five-guess cap. Previously raised inline; the author declined in-thread citing the owner-approved per-mode contract. Included for the human merge decision.
Files Reviewed (6 files)
  • packages/db/src/migrations/0299_cynical_retro_girl.sql - 0 issues (additive ADD COLUMN ... DEFAULT 0 NOT NULL; metadata-only on PostgreSQL)
  • packages/db/src/migrations/meta/0299_snapshot.json - 0 issues (generated; legacy_attempts and prevId match 0298)
  • packages/db/src/migrations/meta/_journal.json - 0 issues (generated; idx/tag 0299_cynical_retro_girl consistent)
  • packages/db/src/schema.ts - 0 issues
  • packages/web-shared/src/lib/auth/magic-link-tokens.test.ts - 0 issues
  • packages/web-shared/src/lib/auth/magic-link-tokens.ts - 1 issue (carried forward from the active inline comment)

Previous review

Status: 1 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 1
SUGGESTION 0
Issue Details (click to expand)

WARNING

File Line Issue
packages/web-shared/src/lib/auth/magic-link-tokens.ts 170 Selecting the counter from challengeId gives one live sign-in code two independent five-guess allowances (attempts and legacy_attempts), so the same row admits up to ten wrong guesses instead of one five-guess cap. Previously raised inline; the author declined in-thread citing the owner-approved per-mode contract. Included for the human merge decision.
Files Reviewed (6 files)
  • packages/db/src/migrations/0299_cynical_retro_girl.sql - 0 issues (additive ADD COLUMN ... DEFAULT 0 NOT NULL; metadata-only on PostgreSQL)
  • packages/db/src/migrations/meta/0299_snapshot.json - 0 issues (generated; legacy_attempts and prevId match 0298)
  • packages/db/src/migrations/meta/_journal.json - 0 issues (generated; idx/tag 0299_cynical_retro_girl consistent)
  • packages/db/src/schema.ts - 0 issues
  • packages/web-shared/src/lib/auth/magic-link-tokens.test.ts - 0 issues
  • packages/web-shared/src/lib/auth/magic-link-tokens.ts - 1 issue (carried forward from the active inline comment)

Previous review

Status: 1 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 1
SUGGESTION 0
Issue Details (click to expand)

WARNING

File Line Issue
packages/web-shared/src/lib/auth/magic-link-tokens.ts 170 Splitting the attempt counter by challengeId presence gives one sign-in code two independent 5-attempt allowances, so the same live row can be guessed ten times and is never locked out across modes; the removed R6 test guarded the previous single-cap invariant. Consider bounding attempts + legacy_attempts instead of each column separately.
Files Reviewed (7 files)
  • apps/extension/src/shared/browser-tool-redaction.ts - 0 issues
  • packages/db/src/migrations/0297_public_pepper_potts.sql - 0 issues
  • packages/db/src/migrations/meta/0297_snapshot.json - 0 issues (generated)
  • packages/db/src/migrations/meta/_journal.json - 0 issues (generated)
  • packages/db/src/schema.ts - 0 issues
  • packages/web-shared/src/lib/auth/magic-link-tokens.test.ts - 0 issues
  • packages/web-shared/src/lib/auth/magic-link-tokens.ts - 1 issue

Fix these issues in Kilo Cloud


Reviewed by deepseek-flash-latest · Input: 35.4K · Output: 4.5K · Cached: 386.4K

Review guidance: REVIEW.md from base branch main

@iscekic iscekic added merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head merge:human Substantive functional risk requires human review. merge:blocked:judge-unavailable Risk assessment unavailable merge:bot Bot-owned review; merge when ready once readiness passes and a review approves. and removed merge:human Substantive functional risk requires human review. merge:blocked:judge-unavailable Risk assessment unavailable merge:bot Bot-owned review; merge when ready once readiness passes and a review approves. labels Oct 23, 2026
# Conflicts:
#	packages/db/src/migrations/meta/0297_snapshot.json
#	packages/db/src/migrations/meta/_journal.json
@iscekic iscekic added needs:prod-action Prod prerequisite (env var, secret, firewall rule, config) needed before merge merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head merge:human Substantive functional risk requires human review. and removed merge:human Substantive functional risk requires human review. merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head labels Oct 24, 2026
Regenerate the additive schema migration at the next free sequence number so it
does not collide with the migration main added.
@iscekic iscekic added merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head merge:human Substantive functional risk requires human review. and removed merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head merge:human Substantive functional risk requires human review. labels Oct 24, 2026
@iscekic iscekic removed the merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head label Oct 24, 2026

@eshurakov eshurakov left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shallow review: no critical issues found.

# Conflicts:
#	packages/db/src/migrations/meta/0303_snapshot.json
#	packages/db/src/migrations/meta/_journal.json
@iscekic iscekic added merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head merge:human Substantive functional risk requires human review. and removed merge:human Substantive functional risk requires human review. merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head labels Oct 27, 2026
@iscekic

iscekic commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator Author

Changes requested: merge current main into this branch without rebasing and resolve the conflicts. Preserve the behavior now on main, rerun the affected checks, and update the verification evidence.

@iscekic iscekic added merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head merge:human Substantive functional risk requires human review. and removed merge:human Substantive functional risk requires human review. merge:blocked:kilobot-not-ready Review bot has not recommended merge at this head labels Oct 27, 2026
# Conflicts:
#	services/session-ingest/src/types/session-sync.test.ts
@iscekic iscekic removed the merge:human Substantive functional risk requires human review. label Oct 27, 2026
# Conflicts:
#	packages/db/src/migrations/meta/0307_snapshot.json
#	packages/db/src/migrations/meta/_journal.json
# Conflicts:
#	packages/db/src/migrations/meta/0308_snapshot.json
#	packages/db/src/migrations/meta/_journal.json
@iscekic iscekic added the merge:human Substantive functional risk requires human review. label Oct 27, 2026
@iscekic

iscekic commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator Author

bot: Merged origin/main into the branch in 305f9212, without rebasing, and resolved the conflicts by keeping main's content and re-applying this branch's migration on top of it.

  • main's newest migration index is 0308; this branch's additive migration sits at the next free index, 0309, with its snapshot and journal entry, so the journal set is consistent.
  • The branch diff against main is limited to the migration, the schema column, and the sign-in code verification accounting with its tests.
  • git merge-tree --write-tree HEAD origin/main is clean at the current head, and GitHub reports the pull request mergeable and clean.
  • The affected checks were rerun on the merged head: CI is 81 passed, 0 failed, including the shards that failed on the earlier head. The database-backed sign-in code suites pass at this head.
  • The verification evidence in the pull request body refers to this head.

# Conflicts:
#	packages/db/src/migrations/meta/0309_snapshot.json
#	packages/db/src/migrations/meta/_journal.json
@iscekic iscekic added merge:human Substantive functional risk requires human review. and removed merge:human Substantive functional risk requires human review. labels Oct 27, 2026
@iscekic
iscekic added this pull request to the merge queue Oct 27, 2026
Merged via the queue into main with commit a070f43 Oct 27, 2026
86 checks passed
@iscekic
iscekic deleted the drain/native-code-state branch October 27, 2026 13:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

drain Work item from the findings drain janitor:trust Janitor finding: trust boundary hardening merge:human Substantive functional risk requires human review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants