npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. > telegram-task-earning@0.19.1 check > node scripts/run-quality-checks.js [phase-19-check] Running lint npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. > telegram-task-earning@0.19.1 lint > eslint . --max-warnings=0 [phase-19-check] Running format:check npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. > telegram-task-earning@0.19.1 format:check > prettier . --check Checking formatting... All matched files use Prettier code style! [phase-19-check] Running test npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. > telegram-task-earning@0.19.1 test > node --test ✔ Admin auth routes are composed behind validation, session, and CSRF gates (89.184371ms) ✔ configured Admin IP policy rejects disallowed networks before authentication (18.711859ms) ✔ Express foundation serves service, liveness, readiness, and safe 404 responses (99.051386ms) ✔ readiness returns 503 without disclosing database errors (34.904182ms) ✔ web bootstrap verifies MySQL, configures HTTP, becomes ready, and shuts down (29.326512ms) ✔ web bootstrap fails closed and releases resources for an unsupported database (2.344115ms) ✔ web bootstrap connects Redis for distributed protection and closes it on shutdown (4.92444ms) ✔ migration dry run validates all files without secrets or a live database (233.948051ms) ✔ seed and rollback dry runs are offline and deterministic (529.407103ms) ✔ unknown database command options fail closed (193.065421ms) ✔ example verification succeeds and redacts sensitive placeholders (231.672473ms) ✔ using the example as a runtime environment fails closed without leaking secrets (167.795394ms) ✔ runtime verification succeeds from deployment environment values (174.860659ms) ✔ wallet and history endpoints require a verified Telegram session (86.736992ms) ✔ wallet API returns string amounts and cursor pagination metadata (19.014793ms) ✔ wallet history rejects excessive limits and unknown query input (16.61217ms) ✔ task APIs require a server-verified Telegram user session (89.300623ms) ✔ task start requires CSRF, an empty body, and an Idempotency-Key (57.336861ms) ✔ claim validates ownership-shaped IDs and returns server reward data (17.77847ms) ✔ Admin task lifecycle routes enforce their exact permission (20.48312ms) ✔ public referral endpoints require a verified Telegram session (82.766715ms) ✔ Admin referral routes enforce distinct view, review, and settings permissions (58.631551ms) ✔ Admin review requires CSRF, review permission, reason, and resource version (25.782662ms) ✔ public Mystery Box endpoints require a verified Telegram session (74.634679ms) ✔ free claim requires CSRF, an empty body, and an Idempotency-Key (64.208144ms) ✔ Admin reads, claims, management, and lifecycle use distinct permissions (48.876267ms) ✔ public method, quote, and withdrawal history endpoints require verified Telegram identity (103.589348ms) ✔ quote and create use strict schemas, CSRF, and a required idempotency key (58.688516ms) ✔ Admin withdrawal reads and decrypted destination details use distinct permissions (18.14937ms) ✔ Admin review checks the submitted decision permission and payout confirmation is separate (22.173526ms) ✔ content endpoints require verified Telegram identity (115.365984ms) ✔ announcement read evidence requires CSRF and an empty strict body (50.275092ms) ✔ Admin banner reading, editing, and publishing use separate permissions (13.533425ms) ✔ Admin settings and feature flags enforce exact permissions and strict versions (19.636565ms) ✔ Notification inbox requires Telegram identity and read mutation requires CSRF (120.047184ms) ✔ Template reads and broadcast approval require their exact Admin permissions (27.863472ms) ✔ Reminder creation validates timezone-shaped schedule inputs before service execution (11.78265ms) ✔ earning history and leaderboard require a Telegram-authenticated user (60.697525ms) ✔ financial analytics require their exact high-sensitivity permission (18.99993ms) ✔ report range and leaderboard pagination are rejected before service execution (16.551751ms) ✔ Mini App shell renders EJS with a narrowly scoped official Telegram SDK CSP (69.955405ms) ✔ Mini App module assets revalidate and private paths remain inaccessible (34.8288ms) ✔ Maintenance allows only the public shell/assets while protected API stays closed (33.536638ms) ✔ Banned sessions can load the shell for an error screen but cannot access API data (19.558266ms) ✔ admin shell and assets are public but contain no account data and deny framing (119.807312ms) ✔ every operational route fails closed without its exact read permission (80.348494ms) ✔ authorized reads validate pagination, return string amounts, and record audit context (21.372232ms) ✔ catalog exposes only allowed screens and hides payment account details from reviewers (12.653723ms) ✔ maintenance preserves shell access and follows configured admin access policy (24.634559ms) ✔ upload size exception requires permission and CSRF and does not enlarge other routes (53.414816ms) ✔ all Phase 19 operations reject anonymous callers even with a valid anonymous CSRF token (175.530154ms) ✔ all Phase 19 operations enforce their exact permissions before invoking the service (79.514457ms) ✔ every authorized operation routes a strict validated body and trusted actor context (92.148702ms) ✔ CSRF, malformed money, stale-body fields and oversized input are rejected without a write (28.624165ms) ✔ public enrollment keeps CSRF protection and strict one-time-token validation (20.911965ms) ✔ Phase 9 user endpoints require a server-attached session (97.713584ms) ✔ profile mutation requires CSRF and rejects unapproved fields (72.009638ms) ✔ admin user inspection requires both admin authentication and users.view (21.651646ms) ✔ maintenance keeps bootstrap, authenticated admins, and configured webhook reachable (24.155469ms) ✔ Telegram auth and webhook routes are composed behind their security gates (165.932411ms) ✔ Admin authentication and RBAC trust only server-attached identity and permissions (1.268391ms) ✔ Admin IP allowlist supports exact addresses and bounded CIDR ranges (8.151076ms) ✔ database schema enforces the current security and money contract (68.283311ms) ✔ unexpected async errors disclose neither stack traces nor embedded Telegram tokens (80.121387ms) ✔ invalid incoming request IDs are replaced with server-generated identifiers (15.484922ms) ✔ security headers allow Telegram framing only through CSP (87.414937ms) ✔ production responses enable HSTS and HTTPS upgrade policy (18.972824ms) ✔ strict CORS rejects unknown origins and handles approved preflights (17.26431ms) ✔ signed double-submit CSRF flow protects unsafe JSON requests (31.481393ms) ✔ body parsing rejects unsupported, malformed, and oversized payloads safely (25.723844ms) ✔ rate limiting emits standard controls and fails closed when its store fails (18.279956ms) ✔ maintenance gates application traffic but preserve liveness (12.997333ms) ✔ readiness fails safely when the distributed security dependency is unavailable (9.739322ms) ✔ Phase 10 migration makes ledger entries append-only and excludes pending balances (7.781789ms) ✔ ledger repository locks account rows in deterministic database order (1.612911ms) ✔ wallet history keeps cursor values parameterized (0.490678ms) ✔ runtime ledger repository contains no entry update or delete operation (13.721616ms) ✔ Phase 11 migration snapshots attempts and blocks duplicate active attempts and claims (14.179666ms) ✔ public task mapping never exposes destination or internal database identifiers (0.653509ms) ✔ Admin task filters keep hostile input parameterized (0.487793ms) ✔ task completion uses the existing transaction for ledger settlement (18.579695ms) ✔ task routes declare separate permissions for viewing, editing, publishing, and review (0.953844ms) ✔ Phase 12 migration preserves referral evidence and optimistic state transitions (5.950775ms) ✔ Admin referral search keeps hostile input in query parameters (0.57323ms) ✔ Referral reward settings require string minor units and matching versions (3.2096ms) ✔ Task completion invokes referral activation inside its existing transaction (5.078811ms) ✔ Referral API exposes reads only while Admin mutations require exact permissions (2.202436ms) ✔ Referral activation amount comes only from validated server settings (0.790462ms) ✔ Phase 13 migration enforces single-active, free-only, immutable claim evidence (5.850315ms) ✔ claim flow locks user and reward state before atomic ledger settlement (1.929501ms) ✔ client cannot select the box, reward, amount, ticket, or paid access fields (2.988942ms) ✔ Admin claim search keeps hostile values parameterized (0.473052ms) ✔ repository hardcodes zero cost and no purchase on every box insert (0.341847ms) ✔ route permissions separate claim evidence from lifecycle and configuration (2.774975ms) ✔ Phase 14 migration protects immutable quotes, requests, approvals, history, and payouts (11.267528ms) ✔ withdrawal creation locks user, quote, and method before holding funds and consuming the quote (9.222575ms) ✔ client payloads cannot choose fees, net totals, status, approvals, or payout evidence (4.838895ms) ✔ Admin search values remain parameterized and LIKE metacharacters are escaped (0.606559ms) ✔ destination details use authenticated encryption context and a separate hash (2.570071ms) ✔ manual provider is the only enabled payout implementation and rejects automatic mode (0.828348ms) ✔ route permissions separate reads, sensitive details, decisions, payout, methods, and settings (1.670867ms) ✔ Phase 15 migration versions content and protects lifecycle evidence (7.248308ms) ✔ public banner query requires active time window and verified public media (1.945595ms) ✔ public announcement query binds user reads and server-owned visibility windows (1.313638ms) ✔ public tutorial queries expose published rows only with safe cover media (1.832968ms) ✔ content routes separate management, viewing, and publishing permissions (9.162406ms) ✔ configuration routes enforce exact settings, flag, theme, currency, and maintenance permissions (0.755661ms) ✔ raw Admin text is converted to safe HTML and never passed through as body_html (2.864488ms) ✔ public media serving uses verified metadata, containment, size, and hash controls (3.364219ms) ✔ Phase 16 migration protects immutable template and delivery evidence (4.452513ms) ✔ Outbox claim query uses row locks, leases, bounded attempts, and SKIP LOCKED (1.503809ms) ✔ Message routes separate view, edit, approval, cancellation, and reminder permissions (3.361855ms) ✔ Telegram worker has one allowlisted method and never stores raw provider response (3.855597ms) ✔ Broadcast audience excludes deleted and non-writable Telegram accounts (0.941016ms) ✔ Phase 17 migration protects immutable leaderboard and rollup evidence (4.523688ms) ✔ leaderboard materialization snapshots privacy-safe display data (1.681683ms) ✔ earning history is sourced from posted ledger evidence and uses keyset pagination (1.961559ms) ✔ financial totals and operational reports use distinct permissions (0.935488ms) ✔ Telegram re-sync merges profile data instead of erasing privacy preferences (0.633529ms) ✔ Mini App modules use local resolvable imports and do not persist authentication material (58.919779ms) ✔ Mini App shell permits zoom, has safe-area viewport and loads no inline code (1.337454ms) ✔ Mini App CSS retains mobile clearance, keyboard focus and reduced effects (1.291375ms) ✔ media processor decodes pixels, removes appended data and strips metadata (17.672305ms) ✔ media processor rejects disguised SVG, mismatched MIME, truncated data and excess pixels (19.862273ms) ✔ upload accepts only strict filenames, bounded base64 and explicit supported media types (7.53923ms) ✔ upload writes only generated paths and stores a digest matching the served pixels (15.039471ms) ✔ operational searches bind escaped wildcards and reject unknown query models (0.857171ms) ✔ console projections exclude password, session, payload and raw security evidence columns (0.428556ms) ✔ admin user filters keep hostile search and status values out of SQL text (1.183025ms) ✔ admin user repository parameterizes pagination and search values (1.392054ms) ✔ profile writes update only allowlisted preference columns (0.363048ms) ✔ Telegram webhook requires the exact secret header without reflecting it (1.655645ms) ✔ approved project directories exist (7.340455ms) ✔ package metadata is private, ESM, exact-pinned, and script-complete (8.3891ms) ✔ runtime policy accepts supported LTS lines and rejects unsupported lines (0.402146ms) ✔ web entry point fails closed when deployment configuration is missing (589.406501ms) ✔ repository does not contain a real environment file (2.01655ms) ✔ password success creates only a staged two-factor challenge (2.336965ms) ✔ unknown and incorrect Admin credentials return the same public failure (1.131317ms) ✔ valid TOTP atomically advances replay state and promotes the challenge (0.938712ms) ✔ invalid TOTP revokes its challenge and commits lockout evidence (1.177426ms) ✔ one-time bootstrap creates an active 2FA Super Admin under a database lock (1.959906ms) ✔ bootstrap command refuses missing one-time inputs before opening MySQL (0.516426ms) ✔ native Argon2id hashes verify correctly and reject malformed resource parameters (157.650115ms) ✔ AES-256-GCM encrypts TOTP secrets with admin-bound authenticated context (1.763766ms) ✔ TOTP matches RFC 6238 vectors and blocks accepted-step replay (1.831205ms) ✔ recovery codes are one-time-hashable, bounded, and never store plaintext (2.809686ms) ✔ admin challenge is opaque, hashed at rest, short-lived, and cookie-separated (3.069261ms) ✔ authenticated admin session loads server-side permissions and rolls idle expiry (1.422239ms) ✔ operational error classes expose stable codes and HTTP statuses (1.206349ms) ✔ AppError rejects invalid status codes and unstable error codes (0.430178ms) ✔ unknown errors normalize to a non-exposed internal failure (0.233416ms) ✔ malformed JSON normalizes to a safe client error (0.131225ms) ✔ configuration modules map validated values and preserve bigint-safe database options (11.789002ms) ✔ complete configuration is deeply frozen (1.652731ms) ✔ diagnostic projection does not expose configuration secrets (2.475191ms) ✔ MySQL version policy accepts supported Oracle MySQL and rejects alternatives (1.533954ms) ✔ acquired MySQL connections are initialized with UTC and strict SQL mode (0.268819ms) ✔ query helpers keep values parameterized and identifiers allowlisted (0.705796ms) ✔ pagination helpers clamp limits and calculate stable metadata (0.227908ms) ✔ transaction helper commits success and rolls back failure (0.502866ms) ✔ transaction helper retries only deadlock-class errors (0.212806ms) ✔ example template contains every declared key and validates in template mode (27.321258ms) ✔ valid production values are parsed into typed and frozen environment data (6.646796ms) ✔ runtime parsing rejects placeholders without exposing their values (2.046365ms) ✔ production validation rejects insecure transport, proxy, cache, logging, and cookie choices (0.924982ms) ✔ cross-field validation rejects unsafe TTL and upload directory relationships (0.734529ms) ✔ cross-field validation keeps route limits within the global request budget (3.192404ms) ✔ database configuration requires UTC and TLS for remote production servers (0.727058ms) ✔ path traversal and unknown template keys are rejected (2.821604ms) ✔ duplicate environment keys fail before parsing (0.70133ms) ✔ file loading rejects file typos while ignoring unrelated process variables (14.076864ms) ✔ unrelated process variables are ignored when strict file mode is not requested (0.817292ms) ✔ environment and nested diagnostic redaction hide all sensitive values (0.715281ms) ✔ health-check CLI parses bounded options and rejects unknown input (1.485182ms) ✔ health-check URL defaults locally and rejects embedded credentials (0.22933ms) ✔ health-check client validates the response contract (2.391998ms) ✔ application lifecycle moves through starting, ready, draining, and stopped (1.11242ms) ✔ application lifecycle rejects impossible transitions (0.338562ms) ✔ graceful shutdown stops HTTP before closing the database and is idempotent (19.298636ms) ✔ shutdown deadline force-closes connections and still closes the pool (21.024215ms) ✔ secret redaction handles nested keys, tokens, URL credentials, bigint, and cycles (1.344383ms) ✔ JSON logger applies thresholds, child bindings, and stderr separation (0.928998ms) ✔ ledger validation rejects unbalanced, duplicate-account, and unsafe amount inputs (1.960407ms) ✔ balanced reward posts atomically and rebuilds the user projection (16.083079ms) ✔ a repeated ledger idempotency key returns the committed result without new entries (1.823364ms) ✔ reusing a ledger idempotency key for different data is rejected (1.197646ms) ✔ a debit cannot make a user available account negative (0.665557ms) ✔ reversal appends opposite entries and restores reward and lifetime projections (3.984538ms) ✔ wallet cursor is signed, round-trips, and rejects tampering (3.085906ms) ✔ wallet history validation bounds limit and rejects unknown query fields (1.999725ms) ✔ wallet returns authoritative integer strings and projection health (0.636454ms) ✔ history preserves available and held deltas and emits a signed next cursor (0.689963ms) ✔ projection comparison identifies exact mismatched fields (0.209842ms) ✔ reconciliation repair locks user accounts before replacing the snapshot (0.584837ms) ✔ Admin-created task always uses the server settlement currency and starts as draft (4.954557ms) ✔ publishing a future timer task uses optimistic versioning and scheduled state (1.184927ms) ✔ unsupported verification integrations and stale Admin versions fail closed (1.087773ms) ✔ an early task claim rolls back without creating a ledger reward (20.846633ms) ✔ verified task claim posts ledger and completion in one transaction (2.56254ms) ✔ manual verification claim becomes pending without issuing a reward (0.980433ms) ✔ claim idempotency replay returns the committed completion before task mutation (0.928597ms) ✔ task validation accepts only server-governed task fields and integer minor units (6.521951ms) ✔ eligibility rules fail closed when stored configuration is malformed (1.144327ms) ✔ eligibility evaluates username, geography, progress, and account age server-side (1.614184ms) ✔ completion policy enforces active, global, one-time, daily, and cooldown limits (0.36415ms) ✔ task configuration uses deployment URL policy and rejects unavailable callbacks (0.848378ms) ✔ start and claim idempotency hashes are scoped and compared safely (1.033011ms) ✔ completion period keys make one-time, daily, and repeatable awards deterministic (0.354626ms) ✔ scheduled task activates safely and snapshots all reward-critical fields on start (16.497273ms) ✔ an existing active attempt blocks a second start before any insert (1.436741ms) ✔ start idempotency replay returns the immutable destination snapshot (1.144707ms) ✔ referral policy uses safe defaults for invalid database settings (1.250134ms) ✔ referral activation waits for the server-counted task threshold (1.765638ms) ✔ eligible referral activation posts both server-controlled rewards atomically (2.020606ms) ✔ shared-device risk holds a referral and never posts a reward (0.492971ms) ✔ account restriction is evaluated before age and task progress (0.218985ms) ✔ Admin referral setting update versions history and commits optimistic write (2.338468ms) ✔ stale Admin referral setting version rolls back without writing (0.794257ms) ✔ Admin approval records review then re-runs activation in the same transaction (1.360257ms) ✔ Admin-created boxes persist only server-enforced free access fields (1.801301ms) ✔ stale Admin box updates roll back before a database mutation (1.086562ms) ✔ publish validates the reward pool and performs one optimistic transition (1.206049ms) ✔ reward inventory cannot be reduced below its immutable awarded count (0.596114ms) ✔ daily eligibility uses server task count and timezone period boundaries (15.199618ms) ✔ task requirements are evaluated from authoritative integer counts (0.18209ms) ✔ cooldown eligibility is anchored to the last committed claim (0.358041ms) ✔ weighted selection uses an injected cryptographic ticket boundary (0.346985ms) ✔ exhausted rewards are excluded and fixed mode requires exactly one reward (0.713718ms) ✔ publishing enforces free-only configuration and a valid reward pool (1.00472ms) ✔ Admin payloads cannot introduce payment fields or unsafe money numbers (4.227659ms) ✔ eligible free claim reserves inventory, posts ledger, and stores evidence atomically (17.397497ms) ✔ insufficient verified task progress rolls back before reward or ledger mutation (1.340988ms) ✔ a committed idempotency key returns the original claim without a new transaction (0.58661ms) ✔ earning-restricted users cannot reserve inventory or receive a reward (1.802263ms) ✔ reject atomically refunds the full held gross amount, never only the net amount (3.41878ms) ✔ the first high-value approval remains under review and does not move money (0.335548ms) ✔ the required final approval transitions to approved with immutable approval evidence (0.469316ms) ✔ manual paid confirmation settles held gross into exact net payout and fee credits (0.831743ms) ✔ decrypted destination details are released only after stored hash verification (2.629119ms) ✔ payout confirmation rejects stale versions and non-approved states before settlement (0.848267ms) ✔ global and method rules combine using the stricter financial limits (1.646592ms) ✔ percentage fees round upward and all amounts stay decimal strings (0.559469ms) ✔ eligibility is derived from server account, task, referral, wallet, day, and cooldown state (0.974515ms) ✔ restricted and too-new accounts fail closed (0.183091ms) ✔ dynamic destination fields reject unknown values and produce a safe display mask (0.970489ms) ✔ dual approval is required only at or above the configured high-value threshold (0.179707ms) ✔ withdrawal payload schemas reject client-controlled totals and unsafe numeric amounts (3.769099ms) ✔ Admin method and setting schemas enforce consistent fees and optimistic versions (7.347796ms) ✔ invalid stored setting values fall back to conservative defaults (1.390822ms) ✔ quote derives fee and expiry on the server without posting ledger entries (19.949372ms) ✔ request atomically encrypts details, holds the gross amount, consumes quote, and records history (3.847966ms) ✔ a concurrent quote-consumption conflict rolls back the complete request transaction (1.566493ms) ✔ idempotent request replays must match the original canonical input fingerprint (0.68808ms) ✔ managed setting policy preserves the free-only Mystery Box boundary (1.580764ms) ✔ managed setting policy bounds pagination and normalizes allowlisted URLs (0.33704ms) ✔ theme payload accepts the closed token contract and rejects CSS injection (4.072889ms) ✔ feature flag mutation permits rollout only and rejects targeting objects (1.419685ms) ✔ currency input canonicalizes ISO-style codes and caps decimal precision (1.706341ms) ✔ maintenance windows require strictly ordered timestamps (1.514957ms) ✔ setting updates write an immutable next-version record in one transaction (2.293892ms) ✔ setting updates reject null when it violates the stored value type (0.91076ms) ✔ settlement currency precision cannot change after ledger setup (0.689332ms) ✔ publishing a theme retires the former active theme inside the transaction (0.925903ms) ✔ plain content is encoded into inert server-generated HTML (0.999572ms) ✔ banner validation requires verified-media identity and paired actions (2.328182ms) ✔ announcement targeting schema is strict and date ordered (1.71299ms) ✔ tutorial validation rejects client lifecycle and malformed slugs (0.845975ms) ✔ announcement targeting fails closed for missing or mismatched user attributes (0.16853ms) ✔ disabled banner feature avoids every content database read (0.717664ms) ✔ banner creation rejects media that is not verified and public (0.860186ms) ✔ future announcement publishing selects scheduled state on the server clock (0.919884ms) ✔ tutorial creation rejects a URL outside the deployment allowlist (0.779206ms) ✔ media resolution blocks storage paths that escape the public root (0.432692ms) ✔ Telegram templates preserve allowlisted markup and escape every variable (1.617238ms) ✔ Template buttons are HTTPS-only and expose one closed Telegram keyboard shape (0.731755ms) ✔ Internal Telegram payload contract rejects arbitrary methods, chats, and oversized text (3.06808ms) ✔ Outbox claims use leases and exponential retry is bounded and honors Telegram retry-after (0.695882ms) ✔ Outbox worker completes successes and records failures without logging payloads (0.457338ms) ✔ Telegram job rejects malformed success responses instead of recording a false delivery (0.392552ms) ✔ Reminder next-run calculation follows IANA local time and ISO weekdays (39.86254ms) ✔ Broadcast creator cannot approve their own draft (0.645137ms) ✔ Transactional amount placeholders format integer minor units without floating point (0.233426ms) ✔ analytics periods use closed UTC dates and ISO calendar boundaries (2.154264ms) ✔ earning-history cursors are scoped, signed, and reject tampering (1.26126ms) ✔ earning history emits only signed server ledger deltas and an opaque next cursor (0.599369ms) ✔ earning summary keeps integer minor units and reports reversals separately (0.445861ms) ✔ public leaderboard uses snapshots and never requests Telegram identifiers (0.651847ms) ✔ rollup is idempotent per closed date and builds every allowlisted snapshot (1.329832ms) ✔ Admin financial reports keep monetary values behind a separate service method (0.518148ms) ✔ profile contract accepts explicit leaderboard privacy without accepting identity fields (2.091571ms) ✔ miniapp money formatting preserves every BIGINT minor unit including negative fractions (17.664373ms) ✔ miniapp amount entry never uses floating point or accepts exponent notation (0.266395ms) ✔ miniapp navigation normalizes hashes and rejects malformed or traversal routes (1.046392ms) ✔ miniapp rejects credential-bearing and executable URLs (0.171044ms) ✔ withdrawal field validation mirrors allowed format and option contracts (0.772906ms) ✔ miniapp API rejects non-local paths before sending credentials (0.664656ms) ✔ miniapp shares CSRF retrieval and coalesces concurrent identical mutations (4.001594ms) ✔ failed CSRF requests can be retried and do not send a mutation (4.567543ms) ✔ uncertain financial mutations reuse the same key on deliberate retry (1.1465ms) ✔ API failures retain safe request references and distinguish timeout (0.689122ms) ✔ authentication never invents a development identity outside Telegram (0.314677ms) ✔ theme tokens reject CSS injection and reset stale per-theme overrides (0.800627ms) ✔ admin client rejects external and traversal destinations before sending credentials (2.358738ms) ✔ admin mutations coalesce and use the admin CSRF token without persisting credentials (4.523778ms) ✔ failed mutations are never automatically retried and preserve error context (0.77608ms) ✔ session invalidation discards late responses and does not send an awaiting mutation (0.713558ms) ✔ 401 invalidates authentication while 403 keeps an actionable permission error (1.039431ms) ✔ catalog hides ungranted resources and exact withdrawal decision controls (0.372302ms) ✔ minor units remain decimal strings and numeric configuration rejects unsafe integers (0.399863ms) ✔ forms preserve optional omission, explicit null, booleans and nested reward values (136.843127ms) ✔ create task form submits only supported server fields and keeps rewards precise (26.741873ms) ✔ editing plain content round-trips server HTML without double encoding (11.79609ms) ✔ reminder form reconstructs template keys and keeps nested audience rules (12.332825ms) ✔ template editor sends all strict fields and represents nullable button config (14.150631ms) ✔ settings editor fixes free-only protection and preserves server versions (15.868898ms) ✔ resource query only includes route-supported fields and identities are encoded (0.369678ms) ✔ login completes password challenge and TOTP without persisting a password (27.819531ms) ✔ withdrawal confirmation requires review and duplicate clicks share one request (19.510518ms) ✔ conflict keeps the draft visible and prevents immediate resubmission (25.014017ms) ✔ resource UI renders hostile text inert and ignores a disposed response (14.782998ms) ✔ dashboard renders daily chart and table from real response values and isolates financial reports (13.6509ms) ✔ search phrases with spaces and encoded URL punctuation stay on the local admin endpoint (0.674249ms) ✔ admin entry restores an authenticated shell and logout clears its private data (17.495911ms) ✔ administrator form loads named roles, reviews the request and displays a one-time invitation safely (158.059677ms) ✔ wallet correction editor creates a stable hidden idempotency key per draft (17.130161ms) ✔ resolved fraud records offer no further review action (37.888091ms) ✔ enrollment accepts own password then verifies TOTP without retaining invitation or password fields (29.132393ms) ✔ closing enrollment while a response is pending cannot restore its secret (12.675734ms) ✔ enrollment API obtains anonymous admin CSRF and never exempts its mutations (1.293067ms) ✔ mobile authenticator app switching hides the setup key but permits returning with a code (15.306444ms) ✔ retry risk acknowledgement requires a deliberate checked choice (12.340126ms) ✔ administrative changes recheck active session and fresh permission before writing (6.227445ms) ✔ identity management cannot be delegated by assigning only a manage permission (1.182143ms) ✔ invitation stores only a token digest and does not provision active credentials (5.661866ms) ✔ self access changes and stale administrator versions cannot revoke the last operator (4.74772ms) ✔ administrator role/status change and session revocation commit together (2.537873ms) ✔ a cancelled, unenrolled administrator cannot be enabled through access editing (0.759326ms) ✔ built-in roles cannot be edited, while custom grants revoke assigned sessions (1.266759ms) ✔ account ban revokes sessions without leaving a permanent banned status after expiry (1.559322ms) ✔ unban removes only the selected scope and requires its separate permission (0.892884ms) ✔ competing fraud decisions have one winner and persist the review reason (1.785037ms) ✔ wallet correction preparation is idempotent and cannot change money (1.743516ms) ✔ wallet adjustment rejects self approval and posts exactly once under competing reviews (8.140631ms) ✔ insufficient debit rolls back review and ledger; rejection never changes money (0.852754ms) ✔ money and control inputs reject floats, forged actor fields and missing risk acknowledgement (1.607594ms) ✔ manual retry refuses sent, cancelled, unlinked, stale and permanent recipient failures (0.397289ms) ✔ manual retry retains attempt number/payload and only schedules one additional attempt (3.231722ms) ✔ retry rechecks delivery consent and cannot revive an ineligible campaign (0.312934ms) ✔ invitation enrollment consumes both tokens, encrypts TOTP, and returns recovery codes only once (4.045679ms) ✔ failed enrollment attempts commit their counter and stop verification after five codes (5.882122ms) ✔ outbox terminal failure records its linked job in the same executor and never writes for a lost lease (0.56627ms) ✔ administrative repositories bind arbitrary text and refuse arbitrary table names (0.62725ms) ✔ fraud evidence reveal redacts nested credentials and sensitive identity evidence (0.769901ms) ✔ admin user list schema caps page sizes and rejects deleted pseudo-filter (3.859363ms) ✔ admin user mappings preserve large numeric values as strings (1.039552ms) ✔ admin user list uses normalized pagination and parallel repository reads (0.501865ms) ✔ admin user detail combines profile, restrictions, wallets, and metrics (0.550506ms) ✔ cache returns a valid hit without invoking the loader (1.343462ms) ✔ cache fails open on malformed reads and write failures (0.373464ms) ✔ cache does not persist oversized responses (0.561303ms) ✔ local day and week boundaries are converted to UTC for Dhaka (13.690421ms) ✔ day boundaries respect daylight-saving transitions (0.596174ms) ✔ database and offset datetimes normalize to the same UTC representation (0.385982ms) ✔ theme tokens accept a closed safe schema and reject CSS injection (1.098639ms) ✔ setting guards accept only usable locale lists and IANA timezones (18.436939ms) ✔ bootstrap combines safe public configuration with user-scoped state (1.500525ms) ✔ dashboard returns decimal-safe strings and never exposes task destination URLs (6.360692ms) ✔ feature gates prevent disabled task and free-reward database reads (2.057191ms) ✔ database numeric guards reject unsafe representations (0.420994ms) ✔ free reward eligibility is display-only and honors frequency boundaries (0.225264ms) ✔ profile schema rejects Telegram-owned and financial fields (2.544564ms) ✔ profile reads expose Telegram IDs as strings and only public fields (1.191307ms) ✔ profile update validates flags/settings before opening a transaction (13.447971ms) ✔ disabled profile editing fails before a database transaction begins (0.720398ms) ✔ unsupported language and invalid timezone are rejected server-side (0.481684ms) ✔ memory rate-limit store increments and resets fixed windows (1.609877ms) ✔ Redis rate-limit store uses one atomic script and namespaced keys (0.539961ms) ✔ Redis client factory applies TLS verification and bounded reconnects (0.260507ms) ✔ Redis connection, readiness cache, and close lifecycle are bounded (0.460472ms) ✔ database readiness is cached and concurrent checks share one query (0.875388ms) ✔ database readiness fails closed without throwing dependency details (0.70092ms) ✔ migration runner applies each immutable migration once under a schema lock (6.661879ms) ✔ migration runner resumes after a partial DDL failure without replaying recorded statements (1.00482ms) ✔ migration runner rejects a changed file after it has been applied (5.783126ms) ✔ seeds require all migrations, run once, and rollback invalidates seed history (1.377793ms) ✔ validation middleware stores only schema-approved data and returns safe issues (9.320621ms) ✔ maintenance and ban gates use trusted server-side providers (0.619148ms) ✔ idempotency middleware hashes accepted keys and rejects duplicates (0.979072ms) ✔ audit middleware records completed mutations without delaying responses (4.68649ms) ✔ HMAC signatures are deterministic and reject modified input (1.322882ms) ✔ CSRF tokens are signed, session-bound, and time-limited (0.503156ms) ✔ secure random and idempotency helpers enforce bounded keys (0.379693ms) ✔ managed URL allowlist requires approved schemes, domains, and credential-free URLs (0.428766ms) ✔ HTML and plain-text helpers encode markup and remove unsafe controls (0.271222ms) ✔ SQL splitter preserves quoted semicolons and removes comments (1.151768ms) ✔ migration parser requires both sections and rejects session control (0.837852ms) ✔ seed parser accepts one section and checksum is deterministic (0.534122ms) ✔ all migration and seed files load in contiguous order (54.558632ms) ✔ Telegram exchange creates one user, first-touch referral, and opaque session atomically (2.763318ms) ✔ existing Telegram users retain their internal database ID during profile sync (0.483437ms) ✔ simultaneous first login recovers from a unique-user insert race (0.903169ms) ✔ Telegram API client sends JSON webhook settings and exposes no token on failure (2.214413ms) ✔ bot command routing is private-chat only and preserves a bounded referral payload (0.455365ms) ✔ Mini App keyboards require HTTPS and Telegram HTML is escaped (0.255889ms) ✔ webhook service acknowledges duplicates and retries failed processing safely (0.298913ms) ✔ failed webhook retries cannot replace the payload for an existing update ID (0.703593ms) ✔ Telegram initData validates HMAC, freshness, and bigint-safe identity strings (3.852633ms) ✔ Telegram initData rejects tampering, expiry, future dates, and duplicate protected fields (2.550312ms) ✔ Telegram initData rejects bot users and unsafe numeric identities (1.061875ms) ✔ user sessions store only a hash and emit an HttpOnly secure cookie (2.622098ms) ✔ cookie and IP parsing fail safely on malformed values (5.054084ms) ✔ session authentication maps public identity and rolls idle expiry server-side (0.860105ms) ✔ public IDs are 26-character sortable Crockford identifiers (0.544347ms) ℹ tests 414 ℹ suites 0 ℹ pass 414 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 3797.660077 [phase-19-check] Running verify:environment:example npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. > telegram-task-earning@0.19.1 verify:environment:example > node bin/verify-environment.js --example Telegram Task Earning — Phase 19 environment verification Mode: example-template Source: .env.example (found) Node.js: v24.19.0 (supported) Keys: 87/87 recognized Placeholders: 13 Environment verification passed. [phase-19-check] Running verify:database-schema npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. > telegram-task-earning@0.19.1 verify:database-schema > node scripts/verify-database-schema.js Database schema verified: 23 migrations, 6 seeds, 77 tables, 259 named constraints, 202 up statements, 178 down statements, 19 seed statements. [phase-19-check] Running build:css npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. > telegram-task-earning@0.19.1 build:css > node scripts/build-css.js npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. > telegram-task-earning@0.19.1 build:css:miniapp > postcss resources/css/miniapp.css --output public/miniapp/css/app.min.css --env production npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. > telegram-task-earning@0.19.1 build:css:admin > postcss resources/css/admin.css --output public/admin/css/admin.min.css --env production CSS bundles built successfully. [phase-19-check] Running verify:project npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. > telegram-task-earning@0.19.1 verify:project > node scripts/verify-project.js Phase 19 project verification passed: 79 directories, 481 required files, and 34 npm scripts. Phase 19 quality gate passed.