npm warn Unknown env config "http-proxy". This will stop working in the next major version of npm. > telegram-task-earning@0.19.0 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.0 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.0 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.0 test > node --test ✔ Admin auth routes are composed behind validation, session, and CSRF gates (136.877126ms) ✔ configured Admin IP policy rejects disallowed networks before authentication (21.865169ms) ✔ Express foundation serves service, liveness, readiness, and safe 404 responses (147.440538ms) ✔ readiness returns 503 without disclosing database errors (18.965616ms) ✔ web bootstrap verifies MySQL, configures HTTP, becomes ready, and shuts down (57.684997ms) ✔ web bootstrap fails closed and releases resources for an unsupported database (5.755419ms) ✔ web bootstrap connects Redis for distributed protection and closes it on shutdown (21.6952ms) ✔ migration dry run validates all files without secrets or a live database (336.613482ms) ✔ seed and rollback dry runs are offline and deterministic (746.243209ms) ✔ unknown database command options fail closed (248.382651ms) ✔ example verification succeeds and redacts sensitive placeholders (263.442301ms) ✔ using the example as a runtime environment fails closed without leaking secrets (296.006992ms) ✔ runtime verification succeeds from deployment environment values (227.632161ms) ✔ wallet and history endpoints require a verified Telegram session (73.408835ms) ✔ wallet API returns string amounts and cursor pagination metadata (25.301712ms) ✔ wallet history rejects excessive limits and unknown query input (25.007751ms) ✔ task APIs require a server-verified Telegram user session (102.296244ms) ✔ task start requires CSRF, an empty body, and an Idempotency-Key (78.986436ms) ✔ claim validates ownership-shaped IDs and returns server reward data (17.578039ms) ✔ Admin task lifecycle routes enforce their exact permission (36.333898ms) ✔ public referral endpoints require a verified Telegram session (152.276941ms) ✔ Admin referral routes enforce distinct view, review, and settings permissions (64.039506ms) ✔ Admin review requires CSRF, review permission, reason, and resource version (26.538704ms) ✔ public Mystery Box endpoints require a verified Telegram session (119.798262ms) ✔ free claim requires CSRF, an empty body, and an Idempotency-Key (75.173626ms) ✔ Admin reads, claims, management, and lifecycle use distinct permissions (49.055007ms) ✔ public method, quote, and withdrawal history endpoints require verified Telegram identity (171.676794ms) ✔ quote and create use strict schemas, CSRF, and a required idempotency key (103.284874ms) ✔ Admin withdrawal reads and decrypted destination details use distinct permissions (22.998804ms) ✔ Admin review checks the submitted decision permission and payout confirmation is separate (26.152986ms) ✔ content endpoints require verified Telegram identity (136.606587ms) ✔ announcement read evidence requires CSRF and an empty strict body (56.775076ms) ✔ Admin banner reading, editing, and publishing use separate permissions (18.450754ms) ✔ Admin settings and feature flags enforce exact permissions and strict versions (19.886069ms) ✔ Notification inbox requires Telegram identity and read mutation requires CSRF (124.320331ms) ✔ Template reads and broadcast approval require their exact Admin permissions (47.7931ms) ✔ Reminder creation validates timezone-shaped schedule inputs before service execution (26.417702ms) ✔ earning history and leaderboard require a Telegram-authenticated user (108.413409ms) ✔ financial analytics require their exact high-sensitivity permission (36.863793ms) ✔ report range and leaderboard pagination are rejected before service execution (20.702054ms) ✔ Mini App shell renders EJS with a narrowly scoped official Telegram SDK CSP (147.441635ms) ✔ Mini App module assets revalidate and private paths remain inaccessible (63.922805ms) ✔ Maintenance allows only the public shell/assets while protected API stays closed (25.119387ms) ✔ Banned sessions can load the shell for an error screen but cannot access API data (24.419295ms) ✔ admin shell and assets are public but contain no account data and deny framing (136.718067ms) ✔ every operational route fails closed without its exact read permission (81.5252ms) ✔ authorized reads validate pagination, return string amounts, and record audit context (24.86681ms) ✔ catalog exposes only allowed screens and hides payment account details from reviewers (29.966043ms) ✔ maintenance preserves shell access and follows configured admin access policy (41.307354ms) ✔ upload size exception requires permission and CSRF and does not enlarge other routes (84.958645ms) ✔ Phase 9 user endpoints require a server-attached session (154.775264ms) ✔ profile mutation requires CSRF and rejects unapproved fields (69.702616ms) ✔ admin user inspection requires both admin authentication and users.view (21.892091ms) ✔ maintenance keeps bootstrap, authenticated admins, and configured webhook reachable (24.586403ms) ✔ Telegram auth and webhook routes are composed behind their security gates (135.834506ms) ✔ Admin authentication and RBAC trust only server-attached identity and permissions (3.280459ms) ✔ Admin IP allowlist supports exact addresses and bounded CIDR ranges (7.626723ms) ✔ database schema enforces the current security and money contract (69.20676ms) ✔ unexpected async errors disclose neither stack traces nor embedded Telegram tokens (107.283571ms) ✔ invalid incoming request IDs are replaced with server-generated identifiers (49.443429ms) ✔ security headers allow Telegram framing only through CSP (99.002334ms) ✔ production responses enable HSTS and HTTPS upgrade policy (36.736003ms) ✔ strict CORS rejects unknown origins and handles approved preflights (31.050372ms) ✔ signed double-submit CSRF flow protects unsafe JSON requests (41.680219ms) ✔ body parsing rejects unsupported, malformed, and oversized payloads safely (37.240124ms) ✔ rate limiting emits standard controls and fails closed when its store fails (28.60715ms) ✔ maintenance gates application traffic but preserve liveness (14.661442ms) ✔ readiness fails safely when the distributed security dependency is unavailable (8.736261ms) ✔ Phase 10 migration makes ledger entries append-only and excludes pending balances (11.459561ms) ✔ ledger repository locks account rows in deterministic database order (2.066713ms) ✔ wallet history keeps cursor values parameterized (0.742025ms) ✔ runtime ledger repository contains no entry update or delete operation (10.75956ms) ✔ Phase 11 migration snapshots attempts and blocks duplicate active attempts and claims (11.502082ms) ✔ public task mapping never exposes destination or internal database identifiers (0.735052ms) ✔ Admin task filters keep hostile input parameterized (1.104445ms) ✔ task completion uses the existing transaction for ledger settlement (2.918277ms) ✔ task routes declare separate permissions for viewing, editing, publishing, and review (1.544263ms) ✔ Phase 12 migration preserves referral evidence and optimistic state transitions (10.70166ms) ✔ Admin referral search keeps hostile input in query parameters (0.935491ms) ✔ Referral reward settings require string minor units and matching versions (6.258306ms) ✔ Task completion invokes referral activation inside its existing transaction (6.270099ms) ✔ Referral API exposes reads only while Admin mutations require exact permissions (1.841372ms) ✔ Referral activation amount comes only from validated server settings (1.512372ms) ✔ Phase 13 migration enforces single-active, free-only, immutable claim evidence (23.025265ms) ✔ claim flow locks user and reward state before atomic ledger settlement (1.929208ms) ✔ client cannot select the box, reward, amount, ticket, or paid access fields (7.782409ms) ✔ Admin claim search keeps hostile values parameterized (0.823228ms) ✔ repository hardcodes zero cost and no purchase on every box insert (0.548848ms) ✔ route permissions separate claim evidence from lifecycle and configuration (2.613328ms) ✔ Phase 14 migration protects immutable quotes, requests, approvals, history, and payouts (14.513574ms) ✔ withdrawal creation locks user, quote, and method before holding funds and consuming the quote (9.78259ms) ✔ client payloads cannot choose fees, net totals, status, approvals, or payout evidence (3.995197ms) ✔ Admin search values remain parameterized and LIKE metacharacters are escaped (0.453597ms) ✔ destination details use authenticated encryption context and a separate hash (1.836657ms) ✔ manual provider is the only enabled payout implementation and rejects automatic mode (0.76292ms) ✔ route permissions separate reads, sensitive details, decisions, payout, methods, and settings (0.864459ms) ✔ Phase 15 migration versions content and protects lifecycle evidence (10.193155ms) ✔ public banner query requires active time window and verified public media (1.654628ms) ✔ public announcement query binds user reads and server-owned visibility windows (3.570115ms) ✔ public tutorial queries expose published rows only with safe cover media (0.432622ms) ✔ content routes separate management, viewing, and publishing permissions (3.367108ms) ✔ configuration routes enforce exact settings, flag, theme, currency, and maintenance permissions (1.064915ms) ✔ raw Admin text is converted to safe HTML and never passed through as body_html (2.467449ms) ✔ public media serving uses verified metadata, containment, size, and hash controls (2.055196ms) ✔ Phase 16 migration protects immutable template and delivery evidence (12.070318ms) ✔ Outbox claim query uses row locks, leases, bounded attempts, and SKIP LOCKED (3.16242ms) ✔ Message routes separate view, edit, approval, cancellation, and reminder permissions (6.201381ms) ✔ Telegram worker has one allowlisted method and never stores raw provider response (3.631453ms) ✔ Broadcast audience excludes deleted and non-writable Telegram accounts (0.922613ms) ✔ Phase 17 migration protects immutable leaderboard and rollup evidence (9.703262ms) ✔ leaderboard materialization snapshots privacy-safe display data (5.03309ms) ✔ earning history is sourced from posted ledger evidence and uses keyset pagination (3.395673ms) ✔ financial totals and operational reports use distinct permissions (1.825935ms) ✔ Telegram re-sync merges profile data instead of erasing privacy preferences (1.16282ms) ✔ Mini App modules use local resolvable imports and do not persist authentication material (54.350776ms) ✔ Mini App shell permits zoom, has safe-area viewport and loads no inline code (1.682517ms) ✔ Mini App CSS retains mobile clearance, keyboard focus and reduced effects (1.66705ms) ✔ media processor decodes pixels, removes appended data and strips metadata (19.927772ms) ✔ media processor rejects disguised SVG, mismatched MIME, truncated data and excess pixels (15.641463ms) ✔ upload accepts only strict filenames, bounded base64 and explicit supported media types (14.412999ms) ✔ upload writes only generated paths and stores a digest matching the served pixels (22.664404ms) ✔ operational searches bind escaped wildcards and reject unknown query models (1.212079ms) ✔ console projections exclude password, session, payload and raw security evidence columns (0.736491ms) ✔ admin user filters keep hostile search and status values out of SQL text (3.290815ms) ✔ admin user repository parameterizes pagination and search values (1.511901ms) ✔ profile writes update only allowlisted preference columns (0.444299ms) ✔ Telegram webhook requires the exact secret header without reflecting it (1.927534ms) ✔ approved project directories exist (12.909411ms) ✔ package metadata is private, ESM, exact-pinned, and script-complete (2.872929ms) ✔ runtime policy accepts supported LTS lines and rejects unsupported lines (0.606876ms) ✔ web entry point fails closed when deployment configuration is missing (1011.818495ms) ✔ repository does not contain a real environment file (15.525722ms) ✔ password success creates only a staged two-factor challenge (3.383513ms) ✔ unknown and incorrect Admin credentials return the same public failure (1.708338ms) ✔ valid TOTP atomically advances replay state and promotes the challenge (1.119949ms) ✔ invalid TOTP revokes its challenge and commits lockout evidence (1.621395ms) ✔ one-time bootstrap creates an active 2FA Super Admin under a database lock (3.510587ms) ✔ bootstrap command refuses missing one-time inputs before opening MySQL (1.038043ms) ✔ native Argon2id hashes verify correctly and reject malformed resource parameters (200.352019ms) ✔ AES-256-GCM encrypts TOTP secrets with admin-bound authenticated context (3.762758ms) ✔ TOTP matches RFC 6238 vectors and blocks accepted-step replay (4.722738ms) ✔ recovery codes are one-time-hashable, bounded, and never store plaintext (2.122888ms) ✔ admin challenge is opaque, hashed at rest, short-lived, and cookie-separated (3.17017ms) ✔ authenticated admin session loads server-side permissions and rolls idle expiry (2.287884ms) ✔ operational error classes expose stable codes and HTTP statuses (2.301639ms) ✔ AppError rejects invalid status codes and unstable error codes (0.659731ms) ✔ unknown errors normalize to a non-exposed internal failure (0.367478ms) ✔ malformed JSON normalizes to a safe client error (0.244979ms) ✔ configuration modules map validated values and preserve bigint-safe database options (18.76949ms) ✔ complete configuration is deeply frozen (1.931052ms) ✔ diagnostic projection does not expose configuration secrets (2.324984ms) ✔ MySQL version policy accepts supported Oracle MySQL and rejects alternatives (2.968775ms) ✔ acquired MySQL connections are initialized with UTC and strict SQL mode (0.503521ms) ✔ query helpers keep values parameterized and identifiers allowlisted (1.58546ms) ✔ pagination helpers clamp limits and calculate stable metadata (0.577105ms) ✔ transaction helper commits success and rolls back failure (1.264317ms) ✔ transaction helper retries only deadlock-class errors (0.509847ms) ✔ example template contains every declared key and validates in template mode (25.736804ms) ✔ valid production values are parsed into typed and frozen environment data (3.006673ms) ✔ runtime parsing rejects placeholders without exposing their values (2.351647ms) ✔ production validation rejects insecure transport, proxy, cache, logging, and cookie choices (1.416371ms) ✔ cross-field validation rejects unsafe TTL and upload directory relationships (1.565003ms) ✔ cross-field validation keeps route limits within the global request budget (2.5219ms) ✔ database configuration requires UTC and TLS for remote production servers (1.172954ms) ✔ path traversal and unknown template keys are rejected (3.600386ms) ✔ duplicate environment keys fail before parsing (0.487383ms) ✔ file loading rejects file typos while ignoring unrelated process variables (15.149099ms) ✔ unrelated process variables are ignored when strict file mode is not requested (1.140536ms) ✔ environment and nested diagnostic redaction hide all sensitive values (0.869248ms) ✔ health-check CLI parses bounded options and rejects unknown input (4.355934ms) ✔ health-check URL defaults locally and rejects embedded credentials (0.756576ms) ✔ health-check client validates the response contract (5.168563ms) ✔ application lifecycle moves through starting, ready, draining, and stopped (9.790126ms) ✔ application lifecycle rejects impossible transitions (1.615741ms) ✔ graceful shutdown stops HTTP before closing the database and is idempotent (12.686861ms) ✔ shutdown deadline force-closes connections and still closes the pool (9.818146ms) ✔ secret redaction handles nested keys, tokens, URL credentials, bigint, and cycles (2.080314ms) ✔ JSON logger applies thresholds, child bindings, and stderr separation (1.180883ms) ✔ ledger validation rejects unbalanced, duplicate-account, and unsafe amount inputs (5.065623ms) ✔ balanced reward posts atomically and rebuilds the user projection (215.467154ms) ✔ a repeated ledger idempotency key returns the committed result without new entries (4.27594ms) ✔ reusing a ledger idempotency key for different data is rejected (3.373004ms) ✔ a debit cannot make a user available account negative (4.735745ms) ✔ reversal appends opposite entries and restores reward and lifetime projections (3.706072ms) ✔ wallet cursor is signed, round-trips, and rejects tampering (6.826983ms) ✔ wallet history validation bounds limit and rejects unknown query fields (4.006157ms) ✔ wallet returns authoritative integer strings and projection health (1.230824ms) ✔ history preserves available and held deltas and emits a signed next cursor (1.061969ms) ✔ projection comparison identifies exact mismatched fields (0.257419ms) ✔ reconciliation repair locks user accounts before replacing the snapshot (1.35839ms) ✔ Admin-created task always uses the server settlement currency and starts as draft (6.307576ms) ✔ publishing a future timer task uses optimistic versioning and scheduled state (1.704736ms) ✔ unsupported verification integrations and stale Admin versions fail closed (1.001768ms) ✔ an early task claim rolls back without creating a ledger reward (18.94825ms) ✔ verified task claim posts ledger and completion in one transaction (2.706394ms) ✔ manual verification claim becomes pending without issuing a reward (0.875175ms) ✔ claim idempotency replay returns the committed completion before task mutation (0.819505ms) ✔ task validation accepts only server-governed task fields and integer minor units (20.074141ms) ✔ eligibility rules fail closed when stored configuration is malformed (1.308046ms) ✔ eligibility evaluates username, geography, progress, and account age server-side (5.753259ms) ✔ completion policy enforces active, global, one-time, daily, and cooldown limits (0.730412ms) ✔ task configuration uses deployment URL policy and rejects unavailable callbacks (15.823614ms) ✔ start and claim idempotency hashes are scoped and compared safely (3.079328ms) ✔ completion period keys make one-time, daily, and repeatable awards deterministic (0.434573ms) ✔ scheduled task activates safely and snapshots all reward-critical fields on start (50.131499ms) ✔ an existing active attempt blocks a second start before any insert (11.41589ms) ✔ start idempotency replay returns the immutable destination snapshot (8.292232ms) ✔ referral policy uses safe defaults for invalid database settings (2.47484ms) ✔ referral activation waits for the server-counted task threshold (1.736024ms) ✔ eligible referral activation posts both server-controlled rewards atomically (1.852558ms) ✔ shared-device risk holds a referral and never posts a reward (0.559601ms) ✔ account restriction is evaluated before age and task progress (0.282675ms) ✔ Admin referral setting update versions history and commits optimistic write (6.68637ms) ✔ stale Admin referral setting version rolls back without writing (1.562402ms) ✔ Admin approval records review then re-runs activation in the same transaction (1.977891ms) ✔ Admin-created boxes persist only server-enforced free access fields (2.488586ms) ✔ stale Admin box updates roll back before a database mutation (0.947618ms) ✔ publish validates the reward pool and performs one optimistic transition (0.744552ms) ✔ reward inventory cannot be reduced below its immutable awarded count (0.418126ms) ✔ daily eligibility uses server task count and timezone period boundaries (26.490988ms) ✔ task requirements are evaluated from authoritative integer counts (0.269883ms) ✔ cooldown eligibility is anchored to the last committed claim (0.432424ms) ✔ weighted selection uses an injected cryptographic ticket boundary (0.492734ms) ✔ exhausted rewards are excluded and fixed mode requires exactly one reward (1.391391ms) ✔ publishing enforces free-only configuration and a valid reward pool (1.608524ms) ✔ Admin payloads cannot introduce payment fields or unsafe money numbers (5.928546ms) ✔ eligible free claim reserves inventory, posts ledger, and stores evidence atomically (24.375245ms) ✔ insufficient verified task progress rolls back before reward or ledger mutation (1.435141ms) ✔ a committed idempotency key returns the original claim without a new transaction (1.983404ms) ✔ earning-restricted users cannot reserve inventory or receive a reward (0.554074ms) ✔ reject atomically refunds the full held gross amount, never only the net amount (5.478131ms) ✔ the first high-value approval remains under review and does not move money (0.558037ms) ✔ the required final approval transitions to approved with immutable approval evidence (0.827353ms) ✔ manual paid confirmation settles held gross into exact net payout and fee credits (2.333958ms) ✔ decrypted destination details are released only after stored hash verification (1.588275ms) ✔ payout confirmation rejects stale versions and non-approved states before settlement (0.896564ms) ✔ global and method rules combine using the stricter financial limits (2.791299ms) ✔ percentage fees round upward and all amounts stay decimal strings (1.600963ms) ✔ eligibility is derived from server account, task, referral, wallet, day, and cooldown state (1.803346ms) ✔ restricted and too-new accounts fail closed (0.268124ms) ✔ dynamic destination fields reject unknown values and produce a safe display mask (2.550012ms) ✔ dual approval is required only at or above the configured high-value threshold (0.204495ms) ✔ withdrawal payload schemas reject client-controlled totals and unsafe numeric amounts (4.790002ms) ✔ Admin method and setting schemas enforce consistent fees and optimistic versions (14.214864ms) ✔ invalid stored setting values fall back to conservative defaults (0.682039ms) ✔ quote derives fee and expiry on the server without posting ledger entries (32.856795ms) ✔ request atomically encrypts details, holds the gross amount, consumes quote, and records history (6.151787ms) ✔ a concurrent quote-consumption conflict rolls back the complete request transaction (2.527626ms) ✔ idempotent request replays must match the original canonical input fingerprint (1.136279ms) ✔ managed setting policy preserves the free-only Mystery Box boundary (1.695029ms) ✔ managed setting policy bounds pagination and normalizes allowlisted URLs (0.228625ms) ✔ theme payload accepts the closed token contract and rejects CSS injection (4.213643ms) ✔ feature flag mutation permits rollout only and rejects targeting objects (1.62415ms) ✔ currency input canonicalizes ISO-style codes and caps decimal precision (2.42501ms) ✔ maintenance windows require strictly ordered timestamps (2.222051ms) ✔ setting updates write an immutable next-version record in one transaction (2.845914ms) ✔ setting updates reject null when it violates the stored value type (1.367934ms) ✔ settlement currency precision cannot change after ledger setup (1.086807ms) ✔ publishing a theme retires the former active theme inside the transaction (1.150353ms) ✔ plain content is encoded into inert server-generated HTML (1.613708ms) ✔ banner validation requires verified-media identity and paired actions (5.884866ms) ✔ announcement targeting schema is strict and date ordered (4.231134ms) ✔ tutorial validation rejects client lifecycle and malformed slugs (3.299483ms) ✔ announcement targeting fails closed for missing or mismatched user attributes (0.276417ms) ✔ disabled banner feature avoids every content database read (1.215252ms) ✔ banner creation rejects media that is not verified and public (2.113748ms) ✔ future announcement publishing selects scheduled state on the server clock (1.949938ms) ✔ tutorial creation rejects a URL outside the deployment allowlist (1.379051ms) ✔ media resolution blocks storage paths that escape the public root (1.063809ms) ✔ Telegram templates preserve allowlisted markup and escape every variable (4.117103ms) ✔ Template buttons are HTTPS-only and expose one closed Telegram keyboard shape (0.999864ms) ✔ Internal Telegram payload contract rejects arbitrary methods, chats, and oversized text (5.778006ms) ✔ Outbox claims use leases and exponential retry is bounded and honors Telegram retry-after (1.369559ms) ✔ Outbox worker completes successes and records failures without logging payloads (0.782286ms) ✔ Telegram job rejects malformed success responses instead of recording a false delivery (0.808172ms) ✔ Reminder next-run calculation follows IANA local time and ISO weekdays (128.591686ms) ✔ Broadcast creator cannot approve their own draft (6.018ms) ✔ Transactional amount placeholders format integer minor units without floating point (4.232427ms) ✔ analytics periods use closed UTC dates and ISO calendar boundaries (3.971852ms) ✔ earning-history cursors are scoped, signed, and reject tampering (2.320423ms) ✔ earning history emits only signed server ledger deltas and an opaque next cursor (1.147054ms) ✔ earning summary keeps integer minor units and reports reversals separately (1.024929ms) ✔ public leaderboard uses snapshots and never requests Telegram identifiers (0.901852ms) ✔ rollup is idempotent per closed date and builds every allowlisted snapshot (1.565034ms) ✔ Admin financial reports keep monetary values behind a separate service method (1.031033ms) ✔ profile contract accepts explicit leaderboard privacy without accepting identity fields (3.131066ms) ✔ miniapp money formatting preserves every BIGINT minor unit including negative fractions (27.680243ms) ✔ miniapp amount entry never uses floating point or accepts exponent notation (0.653041ms) ✔ miniapp navigation normalizes hashes and rejects malformed or traversal routes (1.986458ms) ✔ miniapp rejects credential-bearing and executable URLs (0.815072ms) ✔ withdrawal field validation mirrors allowed format and option contracts (1.689132ms) ✔ miniapp API rejects non-local paths before sending credentials (2.876676ms) ✔ miniapp shares CSRF retrieval and coalesces concurrent identical mutations (6.409286ms) ✔ failed CSRF requests can be retried and do not send a mutation (0.755626ms) ✔ uncertain financial mutations reuse the same key on deliberate retry (3.07382ms) ✔ API failures retain safe request references and distinguish timeout (1.164796ms) ✔ authentication never invents a development identity outside Telegram (5.784051ms) ✔ theme tokens reject CSS injection and reset stale per-theme overrides (1.625372ms) ✔ admin client rejects external and traversal destinations before sending credentials (2.115926ms) ✔ admin mutations coalesce and use the admin CSRF token without persisting credentials (4.338193ms) ✔ failed mutations are never automatically retried and preserve error context (1.041897ms) ✔ session invalidation discards late responses and does not send an awaiting mutation (0.756758ms) ✔ 401 invalidates authentication while 403 keeps an actionable permission error (1.048892ms) ✔ catalog hides ungranted resources and exact withdrawal decision controls (0.299096ms) ✔ minor units remain decimal strings and numeric configuration rejects unsafe integers (0.965408ms) ✔ forms preserve optional omission, explicit null, booleans and nested reward values (123.765667ms) ✔ create task form submits only supported server fields and keeps rewards precise (36.394232ms) ✔ editing plain content round-trips server HTML without double encoding (20.2156ms) ✔ reminder form reconstructs template keys and keeps nested audience rules (39.124877ms) ✔ template editor sends all strict fields and represents nullable button config (18.16567ms) ✔ settings editor fixes free-only protection and preserves server versions (22.351469ms) ✔ resource query only includes route-supported fields and identities are encoded (0.395628ms) ✔ login completes password challenge and TOTP without persisting a password (32.59705ms) ✔ withdrawal confirmation requires review and duplicate clicks share one request (44.605565ms) ✔ conflict keeps the draft visible and prevents immediate resubmission (17.911628ms) ✔ resource UI renders hostile text inert and ignores a disposed response (16.607217ms) ✔ dashboard renders daily chart and table from real response values and isolates financial reports (16.523229ms) ✔ search phrases with spaces and encoded URL punctuation stay on the local admin endpoint (0.808603ms) ✔ admin entry restores an authenticated shell and logout clears its private data (22.168949ms) ✔ admin user list schema caps page sizes and rejects deleted pseudo-filter (4.086901ms) ✔ admin user mappings preserve large numeric values as strings (0.986392ms) ✔ admin user list uses normalized pagination and parallel repository reads (0.538979ms) ✔ admin user detail combines profile, restrictions, wallets, and metrics (0.568229ms) ✔ cache returns a valid hit without invoking the loader (2.256222ms) ✔ cache fails open on malformed reads and write failures (0.363823ms) ✔ cache does not persist oversized responses (0.626097ms) ✔ local day and week boundaries are converted to UTC for Dhaka (28.191721ms) ✔ day boundaries respect daylight-saving transitions (0.694307ms) ✔ database and offset datetimes normalize to the same UTC representation (0.634499ms) ✔ theme tokens accept a closed safe schema and reject CSS injection (0.661554ms) ✔ setting guards accept only usable locale lists and IANA timezones (29.50267ms) ✔ bootstrap combines safe public configuration with user-scoped state (1.594593ms) ✔ dashboard returns decimal-safe strings and never exposes task destination URLs (5.623513ms) ✔ feature gates prevent disabled task and free-reward database reads (2.296885ms) ✔ database numeric guards reject unsafe representations (0.702039ms) ✔ free reward eligibility is display-only and honors frequency boundaries (0.508337ms) ✔ profile schema rejects Telegram-owned and financial fields (6.472204ms) ✔ profile reads expose Telegram IDs as strings and only public fields (1.13641ms) ✔ profile update validates flags/settings before opening a transaction (19.620512ms) ✔ disabled profile editing fails before a database transaction begins (1.159061ms) ✔ unsupported language and invalid timezone are rejected server-side (0.692696ms) ✔ memory rate-limit store increments and resets fixed windows (1.528565ms) ✔ Redis rate-limit store uses one atomic script and namespaced keys (0.820208ms) ✔ Redis client factory applies TLS verification and bounded reconnects (0.258869ms) ✔ Redis connection, readiness cache, and close lifecycle are bounded (0.781554ms) ✔ database readiness is cached and concurrent checks share one query (1.73768ms) ✔ database readiness fails closed without throwing dependency details (1.562199ms) ✔ migration runner applies each immutable migration once under a schema lock (6.112414ms) ✔ migration runner resumes after a partial DDL failure without replaying recorded statements (2.268211ms) ✔ migration runner rejects a changed file after it has been applied (1.290667ms) ✔ seeds require all migrations, run once, and rollback invalidates seed history (97.871312ms) ✔ validation middleware stores only schema-approved data and returns safe issues (10.237602ms) ✔ maintenance and ban gates use trusted server-side providers (0.894848ms) ✔ idempotency middleware hashes accepted keys and rejects duplicates (2.407924ms) ✔ audit middleware records completed mutations without delaying responses (6.015025ms) ✔ HMAC signatures are deterministic and reject modified input (22.061978ms) ✔ CSRF tokens are signed, session-bound, and time-limited (1.026498ms) ✔ secure random and idempotency helpers enforce bounded keys (0.795433ms) ✔ managed URL allowlist requires approved schemes, domains, and credential-free URLs (5.963598ms) ✔ HTML and plain-text helpers encode markup and remove unsafe controls (0.535925ms) ✔ SQL splitter preserves quoted semicolons and removes comments (1.566879ms) ✔ migration parser requires both sections and rejects session control (1.493796ms) ✔ seed parser accepts one section and checksum is deterministic (1.285178ms) ✔ all migration and seed files load in contiguous order (88.720919ms) ✔ Telegram exchange creates one user, first-touch referral, and opaque session atomically (2.585577ms) ✔ existing Telegram users retain their internal database ID during profile sync (0.459628ms) ✔ simultaneous first login recovers from a unique-user insert race (0.846884ms) ✔ Telegram API client sends JSON webhook settings and exposes no token on failure (4.417441ms) ✔ bot command routing is private-chat only and preserves a bounded referral payload (0.728356ms) ✔ Mini App keyboards require HTTPS and Telegram HTML is escaped (0.536591ms) ✔ webhook service acknowledges duplicates and retries failed processing safely (0.348917ms) ✔ failed webhook retries cannot replace the payload for an existing update ID (3.619369ms) ✔ Telegram initData validates HMAC, freshness, and bigint-safe identity strings (7.521132ms) ✔ Telegram initData rejects tampering, expiry, future dates, and duplicate protected fields (5.300424ms) ✔ Telegram initData rejects bot users and unsafe numeric identities (2.422322ms) ✔ user sessions store only a hash and emit an HttpOnly secure cookie (2.204291ms) ✔ cookie and IP parsing fail safely on malformed values (5.022825ms) ✔ session authentication maps public identity and rolls idle expiry server-side (0.606713ms) ✔ public IDs are 26-character sortable Crockford identifiers (0.560178ms) ℹ tests 379 ℹ suites 0 ℹ pass 379 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 5477.590171 [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.0 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.0 verify:database-schema > node scripts/verify-database-schema.js Database schema verified: 22 migrations, 6 seeds, 75 tables, 249 named constraints, 191 up statements, 170 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.0 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.0 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.0 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.0 verify:project > node scripts/verify-project.js Phase 19 project verification passed: 79 directories, 471 required files, and 34 npm scripts. Phase 19 quality gate passed.