ReviewQueue package 0.4 — browser viewer logic/static evidence
Date: 15 October 2026, 07:13 UTC (12:13 Asia/Tashkent)
Runtime: Node v24.19.0
Commands: node --check web_demo/core.js; node --check web_demo/app.js; node --check web_demo/fixture.js (all exit 0)
Command: node --test --test-reporter=tap web_demo/test_core.cjs
Exit code: 0

LIMIT: No browser, DOM, visual layout, accessibility or actual download verification.
The managed Sites workflow requires control-browser for browser QA. That capability is unavailable.
No preview server, browser installation or alternative browser-control route was used.
These are internal synthetic checks, not owner approval, acceptance or contest submission.

TAP version 13
# Subtest: Web Crypto SHA-256 matches Node for ASCII and Unicode
ok 1 - Web Crypto SHA-256 matches Node for ASCII and Unicode
  ---
  duration_ms: 8.111472
  type: 'test'
  ...
# Subtest: fixture is exactly the stored Python model output
ok 2 - fixture is exactly the stored Python model output
  ---
  duration_ms: 1.008956
  type: 'test'
  ...
# Subtest: original input byte hash is retained
ok 3 - original input byte hash is retained
  ---
  duration_ms: 0.314827
  type: 'test'
  ...
# Subtest: invalid row counts and review counts are rejected
ok 4 - invalid row counts and review counts are rejected
  ---
  duration_ms: 0.666008
  type: 'test'
  ...
# Subtest: malformed source records, flags and row numbers are rejected
ok 5 - malformed source records, flags and row numbers are rejected
  ---
  duration_ms: 0.463652
  type: 'test'
  ...
# Subtest: export and confirmation are refused before review
ok 6 - export and confirmation are refused before review
  ---
  duration_ms: 0.386685
  type: 'test'
  ...
# Subtest: review retains every row, duplicate ID, ambiguous amount and abstention
ok 7 - review retains every row, duplicate ID, ambiguous amount and abstention
  ---
  duration_ms: 2.815449
  type: 'test'
  ...
# Subtest: digest binds exact complete exported UTF-8 document
ok 8 - digest binds exact complete exported UTF-8 document
  ---
  duration_ms: 1.333106
  type: 'test'
  ...
# Subtest: wrong digest cannot unlock export
ok 9 - wrong digest cannot unlock export
  ---
  duration_ms: 1.065893
  type: 'test'
  ...
# Subtest: mutation of returned review cannot change export
ok 10 - mutation of returned review cannot change export
  ---
  duration_ms: 0.94571
  type: 'test'
  ...
# Subtest: mutation of constructor input cannot change snapshot
ok 11 - mutation of constructor input cannot change snapshot
  ---
  duration_ms: 0.953312
  type: 'test'
  ...
# Subtest: another review invalidates earlier confirmation
ok 12 - another review invalidates earlier confirmation
  ---
  duration_ms: 1.849178
  type: 'test'
  ...
# Subtest: reset invalidates digest and export permission
ok 13 - reset invalidates digest and export permission
  ---
  duration_ms: 0.789955
  type: 'test'
  ...
# Subtest: reset during hashing cannot resurrect a stale review
ok 14 - reset during hashing cannot resurrect a stale review
  ---
  duration_ms: 0.444403
  type: 'test'
  ...
# Subtest: overlapping reviews cannot replace the newest digest
ok 15 - overlapping reviews cannot replace the newest digest
  ---
  duration_ms: 0.279803
  type: 'test'
  ...
# Subtest: hash failure fails closed
ok 16 - hash failure fails closed
  ---
  duration_ms: 0.20515
  type: 'test'
  ...
# Subtest: static page wiring and default disabled gates are present
ok 17 - static page wiring and default disabled gates are present
  ---
  duration_ms: 0.446285
  type: 'test'
  ...
# Subtest: browser source uses local assets and no network or HTML injection APIs
ok 18 - browser source uses local assets and no network or HTML injection APIs
  ---
  duration_ms: 0.586698
  type: 'test'
  ...
1..18
# tests 18
# suites 0
# pass 18
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 98.777767


Existing Python regression suite rerun (not 48 new tests)
Command: python3 -m unittest -v demo test_conversation
Exit code: 0
test_all_original_values_preserved (demo.TestReview.test_all_original_values_preserved) ... ok
test_boolean_amount_is_not_a_number (demo.TestReview.test_boolean_amount_is_not_a_number) ... ok
test_cli_preserves_bytes_and_refuses_overwrite (demo.TestReview.test_cli_preserves_bytes_and_refuses_overwrite) ... ok
test_cli_rejects_invalid_utf8_without_writing (demo.TestReview.test_cli_rejects_invalid_utf8_without_writing) ... ok
test_cli_rejects_lossy_input_without_writing (demo.TestReview.test_cli_rejects_lossy_input_without_writing) ... ok
test_cli_rejects_unpaired_surrogate_without_writing (demo.TestReview.test_cli_rejects_unpaired_surrogate_without_writing) ... ok
test_currency_not_mixed (demo.TestReview.test_currency_not_mixed) ... ok
test_derived_overflow_is_flagged (demo.TestReview.test_derived_overflow_is_flagged) ... ok
test_duplicate_keys_rejected (demo.TestReview.test_duplicate_keys_rejected) ... ok
test_duplicates_kept_and_flagged (demo.TestReview.test_duplicates_kept_and_flagged) ... ok
test_empty_input (demo.TestReview.test_empty_input) ... ok
test_escaped_duplicate_keys_rejected (demo.TestReview.test_escaped_duplicate_keys_rejected) ... ok
test_float_overflow_rejected (demo.TestReview.test_float_overflow_rejected) ... ok
test_float_precision_loss_rejected (demo.TestReview.test_float_precision_loss_rejected) ... ok
test_float_underflow_rejected (demo.TestReview.test_float_underflow_rejected) ... ok
test_invalid_reference_fails_explicitly (demo.TestReview.test_invalid_reference_fails_explicitly) ... ok
test_leading_zero_and_order (demo.TestReview.test_leading_zero_and_order) ... ok
test_locale_not_guessed (demo.TestReview.test_locale_not_guessed) ... ok
test_missing_number (demo.TestReview.test_missing_number) ... ok
test_model_detects_synthetic_outlier (demo.TestReview.test_model_detects_synthetic_outlier) ... ok
test_nested_duplicate_keys_rejected (demo.TestReview.test_nested_duplicate_keys_rejected) ... ok
test_no_mutation (demo.TestReview.test_no_mutation) ... ok
test_no_network_during_review (demo.TestReview.test_no_network_during_review) ... ok
test_nontext_id_not_coerced (demo.TestReview.test_nontext_id_not_coerced) ... ok
test_regular_float_preserved (demo.TestReview.test_regular_float_preserved) ... ok
test_reproducible (demo.TestReview.test_reproducible) ... ok
test_small_reference_abstains (demo.TestReview.test_small_reference_abstains) ... ok
test_zero_quantity (demo.TestReview.test_zero_quantity) ... ok
test_cli_confirmed_export_preserves_complete_review (test_conversation.TestConversation.test_cli_confirmed_export_preserves_complete_review) ... ok
test_cli_does_not_overwrite_existing_file (test_conversation.TestConversation.test_cli_does_not_overwrite_existing_file) ... ok
test_cli_refuses_input_as_output (test_conversation.TestConversation.test_cli_refuses_input_as_output) ... ok
test_cli_rejects_duplicate_keys_before_output (test_conversation.TestConversation.test_cli_rejects_duplicate_keys_before_output) ... ok
test_cli_unconfirmed_export_creates_nothing (test_conversation.TestConversation.test_cli_unconfirmed_export_creates_nothing) ... ok
test_confirmation_before_review_refused (test_conversation.TestConversation.test_confirmation_before_review_refused) ... ok
test_empty_records_supported_without_fabricated_score (test_conversation.TestConversation.test_empty_records_supported_without_fabricated_score) ... ok
test_export_before_confirmation_refused (test_conversation.TestConversation.test_export_before_confirmation_refused) ... ok
test_input_hash_is_canonical_not_raw_file_hash (test_conversation.TestConversation.test_input_hash_is_canonical_not_raw_file_hash) ... ok
test_input_mutation_cannot_change_internal_export (test_conversation.TestConversation.test_input_mutation_cannot_change_internal_export) ... ok
test_network_is_not_used_by_model_or_session (test_conversation.TestConversation.test_network_is_not_used_by_model_or_session) ... ok
test_new_review_invalidates_confirmation (test_conversation.TestConversation.test_new_review_invalidates_confirmation) ... ok
test_original_rows_order_ids_and_ambiguous_values_survive (test_conversation.TestConversation.test_original_rows_order_ids_and_ambiguous_values_survive) ... ok
test_real_model_report_is_not_stubbed (test_conversation.TestConversation.test_real_model_report_is_not_stubbed) ... ok
test_report_digest_binds_flags_and_all_original_fields (test_conversation.TestConversation.test_report_digest_binds_flags_and_all_original_fields) ... ok
test_reset_invalidates_confirmation (test_conversation.TestConversation.test_reset_invalidates_confirmation) ... ok
test_session_does_not_mutate_input (test_conversation.TestConversation.test_session_does_not_mutate_input) ... ok
test_unpaired_unicode_rejected (test_conversation.TestConversation.test_unpaired_unicode_rejected) ... ok
test_view_copy_cannot_change_internal_export (test_conversation.TestConversation.test_view_copy_cannot_change_internal_export) ... ok
test_wrong_digest_refused (test_conversation.TestConversation.test_wrong_digest_refused) ... ok

----------------------------------------------------------------------
Ran 48 tests in 15.780s

OK
