BITSHIELD (project name bitshield-3) is a Bitcoin Scam Risk Detector: a single-file, fully offline web application that lets a person paste a suspicious Bitcoin message or offer and receive a transparent, rule-based risk analysis. The product is deliberately not a simple scam/not-scam verdict. Instead it lays the message out like evidence on a desk and reports a Risk Score (0–100), a Risk Level (LOW / MEDIUM / HIGH / CRITICAL), the warning signs detected, the suspicious phrases highlighted inside the original message, beginner-friendly reasons, next steps, a scam stage tracker, a scam type classification, a mathematical reality check on return claims, and the rules that were checked but did not match.
The intended audience is ordinary people who have just received a suspicious Bitcoin message and need a calm, forensic, procedural reading of it, plus a student presenting this as a college cybersecurity project demo who needs a polished, working, offline artefact that visibly proves the analyzer's logic. The app must feel like a finished college cybersecurity project demo, not a mockup.
The product uses sample/test data only. It never handles real Bitcoin, keys, or payments, and it makes no external requests of any kind.
BITSHIELD is delivered as one self-contained HTML file. All markup is HTML, all styling lives in a single <style> block, and all behaviour is vanilla JavaScript inside a single <script> block. There are no frameworks, libraries, backends, APIs, databases, wallets, blockchains, or external requests. The application works fully offline.
The current delivery is a single-page, single-document application whose working areas are presented as numbered, ruled sections of one filed document — a "Cybersecurity Evidence Desk". The user submits a message, the local rule engine scores it, and the results are rendered as evidence sheets, taped labels, a stamped verdict, and coded status rules.
Delivery ownership. The entire product is first-party and self-contained. There is no server, no provider surface, and no external destination that owns any part of the analysis. The only outbound link in the product is the India Cyber Crime Portal (https://cybercrime.gov.in/), which is a reporting reference the user may choose to open in a new tab; it is not a dependency of the app and the app functions completely without it.
Access ownership. BITSHIELD has no accounts, no sign-in, no sessions, and no stored user identity. Every working area is anonymously reachable. There is no protected destination, because there is no durable actor-specific state that must be privately owned or resumed: the pasted message is analyzed in the browser and the results are shown immediately. localStorage use is optional and, if used at all, must be wrapped in try/catch and must not create an identity or an account.
Current vs. future boundary. Everything described in this document is current. There are no future-horizon features in the authoritative requirement thread. The product explicitly excludes real Bitcoin handling, key handling, payments, network calls, and any backend.
Safety boundary. The app is educational and pattern-based. It never claims to prove that a message is a scam or that a message is legitimate, and it never handles real Bitcoin or money.
The reference directive for the India Cyber Crime Portal is declared with uses: ["domain_context"] and authority: "supplemental", with the instruction to include it as a link in the "What to do now" checklist, opening in a new tab with rel="noopener noreferrer". Because this directive does not declare content_source, no Source Content Inventory is produced. The only fact carried into the product is the link itself and its required link behaviour, which is preserved in the Next Steps coverage and in the Functional Requirements.
The following pages are the closed, ordered page contract for this generation. Each is represented exactly once.
OFFLINE DEMO, NO REAL CRYPTO, NO DATA SENT; the one-sentence description "Analyze suspicious Bitcoin messages using transparent warning patterns and understand why a message may be risky."; the simple CSS shield mark (a flat polygon with a notched bottom and a small red notch, no emoji); a full-width 1px hairline beneath the header.CHECK MESSAGE (runs the analyzer on the current textarea contents); each of the five sample buttons (fills the textarea, updates the counter, and auto-analyzes).CLEAR (empties the textarea and resets the counter); typing or pasting into the textarea (updates the counter live).CHECK MESSAGE button, CLEAR button, sample button group, validation message region.CHECK MESSAGE on empty or whitespace-only input produces a friendly message rather than an analysis.CLEAR, or load a sample and analyze again.aria-live result region.(1.08^365 - 1) x 100), and the note: "This is a mathematical reality check, not proof that the sender's claim is true. Extremely large repeated returns are a reason to stop and independently verify the offer."https://cybercrime.gov.in/ opening in a new tab with rel="noopener noreferrer", and Helpline 1930.SCAM button and a SAFE button, and after answering, correct/incorrect feedback plus a plain-English explanation. The six scenarios cover: send BTC get more back; a simple Bitcoin price question; a seed phrase request; a recovery fee; the phrase "Never share your seed phrase"; and an independent verification prompt.SCAM or SAFE for each scenario; read the feedback and explanation.RUN SELF-TEST button; per-sample result lines in the "Fake Giveaway ..... PASS" form; and a summary line reading "5/5 SELF-TESTS PASSED" or "X/5 SELF-TESTS PASSED".RUN SELF-TEST to run the real analyzer against all five samples and compare each detected level to its expected level.aria-live region for the self-test output.Each requirement below is a distinct story point with provenance, lifecycle facts, and observable acceptance.
FR-01 — Single self-contained offline file (explicit)
As a Cybersecurity Student Demonstrator, I should receive the entire BITSHIELD application as one self-contained HTML file with HTML, CSS inside a single <style> block, and vanilla JavaScript inside a single <script> block, so that I can open it and demonstrate it with no setup.
FR-02 — Font fallback stacks (explicit)
As a Suspicious Message Recipient, I should see headings in "Bricolage Grotesque", Arial, system-ui, body text in "IBM Plex Sans", system-ui, and evidence text in "IBM Plex Mono", ui-monospace, monospace, so that the document reads as a filed report even when the preferred fonts are unavailable.
FR-03 — Header identity and status labels (explicit)
As a Suspicious Message Recipient, I should see the header "BITSHIELD / Bitcoin Scam Risk Detector" with the status labels OFFLINE DEMO, NO REAL CRYPTO, and NO DATA SENT, and the text "Analyze suspicious Bitcoin messages using transparent warning patterns and understand why a message may be risky.", so that I immediately understand what the tool is and what it does not do.
FR-04 — Submit the Evidence input (explicit) As a Suspicious Message Recipient, I should be able to paste a suspicious message into a large textarea labelled "Suspicious message or offer" inside the section "Submit the Evidence", with a maximum of 5000 characters and a live counter reading "0 / 5000", so that I can submit the exact message I received.
CHECK MESSAGE or loads a sample.FR-05 — Check Message and Clear controls (explicit)
As a Suspicious Message Recipient, I should have a CHECK MESSAGE button that runs the analysis and a CLEAR button that empties the textarea, so that I can control when analysis happens and reset the desk.
CHECK MESSAGE or CLEAR.CHECK MESSAGE produces an analysis of the current textarea contents; CLEAR empties the textarea and resets the counter.CHECK MESSAGE, the user reads the results; after CLEAR, the user can paste a new message.FR-06 — Robust input handling with friendly messages (explicit) As a Suspicious Message Recipient, I should receive friendly messages when I submit empty, whitespace-only, emoji, Unicode, non-English, long, or pasted text, so that I am never confronted with a raw error or a silent failure.
try/catch and raw errors are never displayed.FR-07 — Five preset samples (explicit) As a Suspicious Message Recipient, I should have five sample buttons — Fake Giveaway, Guaranteed Profit, Fake Support, Withdrawal Fee, and Normal Question — where clicking fills the textarea, updates the counter, and auto-analyzes, so that I can see the analyzer work on known cases.
FR-08 — Exact sample texts (explicit) As a Suspicious Message Recipient, I should see these exact sample texts when I load each sample:
FR-09 — Auto-load Guaranteed Profit on page load (explicit) As a Suspicious Message Recipient, I should see the Guaranteed Profit sample auto-loaded and analyzed when the page loads, so that the desk is never empty and the tool demonstrates itself immediately.
FR-10 — Local rule engine of 18–20 rules (explicit)
As a Suspicious Message Recipient, I should have my message evaluated by a local JavaScript array of 18–20 rules, each with id, label, weight, regex, explanation, tip, family, and stage, so that every result is traceable to a named, inspectable rule.
FR-11 — Required rule coverage (explicit) As a Suspicious Message Recipient, I should have the rule engine cover guaranteed profit, unrealistic returns, Bitcoin giveaway, send BTC to get more back, urgency, seed phrase request, private key request, fake exchange support, fake security alert, gift card payment, crypto ATM payment, wallet address, short links, look-alike domains, secrecy, upfront fees, recovery scam, remote-access software, legal threats, password/OTP request, and unexpected crypto payment demand, so that the common Bitcoin scam patterns are all represented.
FR-12 — Negation handling (explicit) As a Suspicious Message Recipient, I should have "Never share your seed phrase" and "Do not send Bitcoin" NOT trigger rules, so that safe, cautionary language is not flagged as a warning sign.
FR-13 — Safe regex only (explicit)
As a Cybersecurity Student Demonstrator, I should have every rule use safe regex only — no nested quantifiers, with bounded wildcards such as [\s\S]{0,60} — so that the analyzer cannot hang or catastrophically backtrack during a live demo.
FR-14 — Exponential scoring formula (explicit)
As a Suspicious Message Recipient, I should have my score computed as sum = total matched weights, then score = round(100 x (1 - e^(-sum/45))), capped at 100, so that the score reflects accumulated evidence rather than a simple count.
FR-15 — Urgency and payment bonus (explicit) As a Suspicious Message Recipient, I should have a +12 bonus added to the sum when urgency AND payment rules both match, applied before the formula, so that messages that combine time pressure with a payment demand are scored more severely.
FR-16 — Risk level bands (explicit) As a Suspicious Message Recipient, I should have my score mapped to LOW (0–24), MEDIUM (25–47), HIGH (48–71), or CRITICAL (72–100), so that the verdict is expressed in a small, legible ladder.
FR-17 — Full calculation display (explicit) As a Suspicious Message Recipient, I should see the full calculation — the matched weights, the bonus when applied, the formula, and the final score — so that I can verify how the verdict was reached.
FR-18 — Target sample levels (explicit) As a Cybersecurity Student Demonstrator, I should have the weights tuned so that Fake Giveaway, Guaranteed Profit, and Fake Support score CRITICAL, Withdrawal Fee scores HIGH, and Normal Question scores LOW, so that the demo proves the engine behaves as designed.
FR-19 — Stamp-style verdict with score and progress bar (explicit) As a Suspicious Message Recipient, I should see a prominent stamp-style risk level, the score in the "86 / 100" form, and a text progress bar, so that the verdict is the loudest element on the desk.
FR-20 — aria-live result updates (explicit)
As a Suspicious Message Recipient using a screen reader, I should have result updates wrapped in aria-live, so that a new verdict is announced without moving focus.
FR-21 — Safe evidence highlighting (explicit)
As a Suspicious Message Recipient, I should see the original message displayed with matched phrases in evidence-tape styling, rendered without ever using innerHTML with user text, using textContent, createElement, and appendChild instead, so that pasted content can never be interpreted as markup.
innerHTML.FR-22 — No eval or Function (explicit)
As a Cybersecurity Student Demonstrator, I should have the application use no eval and no Function constructor anywhere, so that the demo is defensible as a safe, self-contained artefact.
eval nor Function appears in the implementation.FR-23 — Clickable highlights that focus their finding (explicit) As a Suspicious Message Recipient, I should be able to click a highlighted phrase and have the page scroll to and focus its corresponding finding, so that I can move directly from evidence to explanation.
FR-24 — Warning Signs Detected findings (explicit) As a Suspicious Message Recipient, I should see a "Warning Signs Detected" section where each matched rule shows its severity, rule name, matched evidence, why it is risky, and what to check, in plain beginner language, so that I understand the risk without technical background.
FR-25 — Scam type card (explicit) As a Suspicious Message Recipient, I should see a scam type card showing the strongest matched family from Investment, Giveaway, Impersonation, Credential Theft, Phishing, Pressure, Advance Fee, Recovery, Device Takeover, and Payment, with the family name and a "How it works" description, plus the note that this is an educational classification and not a legal determination, so that I understand the shape of the scam.
FR-26 — Stage tracker (explicit) As a Suspicious Message Recipient, I should see a stage tracker HOOK > TRUST > PRESSURE > PAYMENT > EXIT with the active stages derived from matched rules, laid out horizontally on desktop and stacked on mobile, so that I can see where in the scam's arc this message sits.
FR-27 — Reality check on percentage claims (explicit)
As a Suspicious Message Recipient, I should have any "X% daily", "X% weekly", or "X% monthly" claim detected and its compounded yearly return computed and displayed (for example (1.08^365 - 1) x 100), together with the note "This is a mathematical reality check, not proof that the sender's claim is true. Extremely large repeated returns are a reason to stop and independently verify the offer.", so that I can see the arithmetic consequence of the promise.
FR-28 — Dynamic What to Do Now checklist (explicit) As a Suspicious Message Recipient, I should see a dynamic checklist that adapts to the risk level — for high risk: do not send Bitcoin, do not pay upfront fees, verify independently, never share seed phrase / private key / passwords / OTP, no remote-access software, do not click suspicious links, ignore deadlines; for low risk: keep verifying, do not share credentials, verify payment requests independently — so that my next actions match the verdict.
FR-29 — Reporting contacts (explicit)
As a Suspicious Message Recipient, I should see the India Cyber Crime Portal link https://cybercrime.gov.in/ opening in a new tab with rel="noopener noreferrer", and Helpline 1930, so that I know where to report.
target="_blank" and rel="noopener noreferrer", and the helpline number 1930 is displayed.FR-30 — Checked and Clear list (explicit) As a Suspicious Message Recipient, I should see a list of the rules that did not match, each with a check mark, together with the note "No matched rule is not proof that a message is legitimate.", so that I understand what was checked and why a clean result is not a guarantee.
FR-31 — Practice mode with exactly six scenarios (explicit)
As a Suspicious Message Recipient, I should have exactly six practice scenarios, each with a SCAM button and a SAFE button, followed by correct/incorrect feedback and an explanation, covering send BTC get more back, a simple Bitcoin price question, a seed phrase request, a recovery fee, "Never share your seed phrase", and independent verification, so that I can rehearse my judgement.
SCAM or SAFE for a scenario.FR-32 — Self-test that really runs the analyzer (explicit)
As a Cybersecurity Student Demonstrator, I should have a RUN SELF-TEST button that really runs the analyzer on all five samples, compares each detected level to its expected level, and shows "Fake Giveaway ..... PASS" style lines and "5/5 SELF-TESTS PASSED" (or "X/5 SELF-TESTS PASSED"), so that I can prove the engine works during the demo.
RUN SELF-TEST.FR-33 — Accessibility (explicit)
As a Suspicious Message Recipient, I should have proper labels, keyboard navigation, visible focus, aria-live regions, WCAG AA contrast, meaning never carried by colour alone, and touch-friendly buttons, so that the tool is usable regardless of input method or vision.
FR-34 — Responsive layout (explicit) As a Suspicious Message Recipient, I should have the app work at 320px, 360px, 390px, tablet, and desktop with no horizontal scroll, with a single column and full-width buttons on mobile and two columns on desktop — LEFT: input, highlighted message, and findings; RIGHT: scam type, reality check, what to do, checked and clear, practice, and self-test — so that the desk is readable on any device.
FR-35 — Light and dark theme via CSS variables (explicit)
As a Suspicious Message Recipient, I should have light and dark themes driven by CSS variables following prefers-color-scheme, with dark mode using dark blue-grey paper, light ink, muted borders, and the deep red stamp, and not a cyberpunk look, so that the desk is comfortable in either environment.
FR-36 — Single entrance animation and static stamp rotation (explicit)
As a Suspicious Message Recipient, I should see only one subtle entrance fade/slide and a static slight stamp rotation, with all motion disabled under prefers-reduced-motion, so that the desk feels still and forensic.
prefers-reduced-motion all motion is removed.FR-37 — Optional localStorage in try/catch (explicit)
As a Suspicious Message Recipient, I should have any localStorage use be optional and wrapped in try/catch, so that the app never breaks when storage is unavailable or blocked.
localStorage.FR-38 — Visual hierarchy (explicit) As a Suspicious Message Recipient, I should have the risk level and score as the loudest elements, then warning signs, highlighted evidence, why risky, and what to do, with secondary cards quieter, so that my eye lands on the verdict first.
FR-39 — Footer disclaimer (explicit) As a Suspicious Message Recipient, I should see the footer text "BitShield provides pattern-based educational guidance, not proof that a message is a scam or legitimate. Always verify important claims independently. This demo uses sample/test data only and never handles real Bitcoin or money.", so that the limits of the tool are always stated.
FR-40 — Sample/test data only; no real crypto (explicit) As a Suspicious Message Recipient, I should have the app use sample/test data only and never handle real Bitcoin, keys, or payments, so that using the tool carries no financial risk.
FR-41 — No console errors (explicit) As a Cybersecurity Student Demonstrator, I should have the app produce no console errors, so that the demo is clean when the console is visible.
FR-42 — Complete finished file output (explicit) As a Cybersecurity Student Demonstrator, I should receive the complete finished file, so that I can open it and present it without further assembly.
Product context. This person has just received a message or offer involving Bitcoin — a giveaway, an investment pitch, a support alert, a withdrawal demand — and is uneasy about it. They are not a security professional. They may be reading on a phone at 360px or on a laptop, and they need an answer they can trust and understand.
Primary goal. To understand, in plain language, why the message they received may be risky, and what to check or do next — without being handed a bare scam/not-scam verdict they cannot interrogate.
Distinct accepted responsibilities. They paste the message into "Submit the Evidence", or load one of the five samples to see how the tool behaves. They press CHECK MESSAGE or CLEAR. They read the stamped risk level and score, then the "Why this score?" calculation, then the warning signs, then the highlighted evidence in their own message, then the scam type, the stage tracker, the reality check, and the next steps. They click a highlighted phrase to jump to its finding. They read the checked-and-clear list and understand that a clean result is not a guarantee. They may rehearse their judgement in practice mode.
Relevant inputs and decisions. The message text itself; the decision of whether to trust the offer; the decision of which next step to take; the decision of whether to open the India Cyber Crime Portal link or call Helpline 1930.
Interactions with other accepted participants. This persona is the sole human actor in the analysis lifecycle. The other accepted persona, the Cybersecurity Student Demonstrator, may be the same person in a different context, but the Recipient's work is private and self-directed: they submit, read, and act. No other human participant receives or responds to their submission.
Observable success. The Recipient sees a risk level and score that match the message's character, reads at least one finding that explains a phrase they can see highlighted in their own message, understands the arithmetic behind any return claim, and leaves with a concrete next step — including the reporting link and helpline when the risk is high.
Product context. This person is presenting BITSHIELD as a college cybersecurity project. They need the app to be visibly working, not a mockup, and they need to be able to prove the engine's logic in front of an audience — often with the browser console open and the network tab showing no requests.
Primary goal. To demonstrate a polished, fully offline tool whose rule engine, scoring formula, and evidence handling can be inspected and verified live.
Distinct accepted responsibilities. They load the app and let the Guaranteed Profit sample auto-analyze. They step through all five samples and show that Fake Giveaway, Guaranteed Profit, and Fake Support reach CRITICAL, Withdrawal Fee reaches HIGH, and Normal Question reaches LOW. They open the "Why this score?" breakdown to show the matched weights, the urgency+payment bonus, the formula, and the final score. They point at the highlighted evidence and click a tape label to jump to its finding. They demonstrate that "Never share your seed phrase" does not trigger a rule. They press RUN SELF-TEST and show the five PASS lines and the "5/5 SELF-TESTS PASSED" summary. They may resize the window to 320px to show the responsive layout, and toggle the OS colour scheme to show the dark theme.
Relevant inputs and decisions. Which sample to load next; whether to show the calculation or the findings first; whether to run the self-test before or after the manual walkthrough.
Interactions with other accepted participants. The Demonstrator's work is presentational and does not change the Recipient's analysis. The Demonstrator may narrate the Recipient's experience, but the two roles have different success criteria: the Recipient needs understanding, the Demonstrator needs verifiable proof.
Observable success. The self-test reports "5/5 SELF-TESTS PASSED", every sample lands on its expected level, the calculation is visible on screen, the highlights are safe and clickable, the console shows no errors, and the app works with the network disconnected.
CHECK MESSAGE. The analyzer runs locally.aria-live region: the stamp shows the risk level, the score appears in the "86 / 100" form, and the text progress bar fills to match.round(100 x (1 - e^(-sum/45))), and the final score.CLEAR and tries again.CLEAR, pastes a second message, and repeats the flow, or moves to Practice to rehearse.SCAM button and a SAFE button.SCAM.SAFE and the feedback confirms that cautionary language is not itself a warning sign.RUN SELF-TEST.The creative direction is authoritative for this section. The muse is Peter Saville: a single borrowed artefact carrying the whole identity, coded colour, precise small metadata type, and a great deal of silence. The headline idea is "one pasted message becomes the artefact; the rule engine becomes the colour code; the risk verdict becomes the one exact spot colour stamped on the sheet." The register is cold, forensic, and procedural — institutional and quiet, with one decisive colour statement. It is not playful, not corporate-friendly, and not neon-cyberpunk.
| Role | Hex | Use |
|---|---|---|
| Background (desk) | #E7EBEF | Pale blue-grey workspace ground |
| Surface (sheet) | #FBFCFD | Near-white evidence sheets |
| Text / primary (ink) | #131A26 | Dark navy ink for all type and rules |
| Accent (spot colour) | #B0121F | Deep red — reserved for the rubber-stamp verdict, the taped evidence labels, and the risk bar for HIGH/CRITICAL, and nothing else |
| Muted | #6B7684 | Metadata, counters, secondary labels |
| Amber (level code) | #A87411 | MEDIUM only, always paired with the word |
| Green (level code) | #3F6B4A | Clear / LOW only, always paired with the word |
| Role | Hex | Use |
|---|---|---|
| Background (paper) | #10161F | Dark blue-grey paper |
| Surface (sheet) | #18202B | Sheet surface |
| Text / primary (ink) | #E6EBF1 | Light ink |
| Accent (spot colour) | #C4162A | Deep red stamp, tape, and HIGH/CRITICAL bar |
| Amber (level code) | #D19A3E | MEDIUM only, always paired with the word |
| Green (level code) | #7FA98A | Clear / LOW only, always paired with the word |
The risk ladder is a coded colour alphabet, not a gradient: LOW is a green rule, MEDIUM amber, HIGH deep red, CRITICAL deep red with a doubled rule and the word set twice in the stamp. Every coded colour is always accompanied by a word, so meaning never rests on colour alone.
letter-spacing: -0.02em and in sentence case. The BITSHIELD wordmark is all-caps with wide 0.14em tracking at small size, like a stamped file reference. The risk level itself is set enormous — 800 weight, all-caps, tight leading — so it reads as a printed verdict rather than a headline.0.95rem with 0.02em tracking.clamp(44px, 9vw, 72px), section title 28/34, card title 20/22, body 16/17, evidence mono 15/16, metadata 12/13 with 0.08em tracking.Hard edges everywhere: 2px radius maximum on cards and buttons, 0px on the stamp and the evidence tape. Rules and dividers are 1px hairlines in a slightly darker blue-grey. The only curves in the whole interface are the CSS shield mark (a single filled polygon with a notched bottom) and the circular risk gauge behind the score. No pills, no soft shadows — depth comes from a 1px border plus a single 2px offset hairline on the sheet edge, like a paper stack.
Desktop at 1280px: a fixed 12-column grid with a 1180px max width. LEFT column (7 cols) holds Submit the Evidence, the highlighted original message rendered as a monospace evidence sheet, and Warning Signs Detected. RIGHT column (5 cols, sticky from the top) holds the stamp verdict, Scam Type, Stage Tracker, Reality Check, What To Do Now, Checked and Clear, Practice Mode, and Self-Test. A thin horizontal rule with a small all-caps label separates every section, and each section is numbered 01–09 in the left margin like a lab report. Mobile at 320–390px: single column in the same numbered order, all buttons full width, and the stamp verdict moved directly under the header so it is seen first.
No photography, no illustration, no icons except the CSS shield. Imagery is the interface itself: the monospace evidence sheet, the ruled data rows, the taped labels, the coded colour bars, the numbered sections. The one graphic gesture is the shield mark — a flat navy polygon at 26px with a 2px inner hairline and a small red notch, drawn entirely in CSS clip-path.
The first screen is a desk, not a hero.
A full-width pale blue-grey ground (#E7EBEF) with a 1px hairline running the entire width beneath the header. On the left: the BITSHIELD wordmark in all-caps Bricolage with 0.14em tracking; the three status labels — OFFLINE DEMO, NO REAL CRYPTO, NO DATA SENT — as small outlined chips in muted grey monospace; and the one-sentence description set at 17px in IBM Plex Sans at a 62-character measure.
To the right of the header block, immediately visible without scrolling on desktop and stacked directly beneath on mobile, sits the verdict artefact: a near-white evidence sheet (#FBFCFD) with the sample message already loaded in monospace on the left half and, rotated -3.2deg on the right half, a deep-red double-ruled rubber stamp reading CRITICAL with 86 / 100 beneath it in the same red. A 1px red progress rule runs the full width of the sheet under the stamp.
No gradient, no blob, no floating panel — one sheet, one stamp, one exact red.
Signature moves carried through the whole app:
-3.2deg, with the risk level set in 800-weight all-caps Bricolage at clamp(44px, 9vw, 72px) and the score beneath it as "86 / 100" in IBM Plex Mono, printed over the corner of the evidence sheet so it slightly overlaps the sheet's hairline border.0.95rem. Hovering or focusing lifts a tiny all-caps label above it reading the rule id (for example "R-03 GIVEAWAY"), and clicking focuses the matching finding card, which then gets a 1px red left border.Interaction Model: Static Motion Tempo: still Hero Dimensionality: flat
-3.2deg, with the 1px red progress rule beneath it.-3.2deg rotation. The progress bar fills with a 260ms width transition. Highlight hover raises the tape label by 1px.prefers-reduced-motion, the fade, the slide, the rotation transition, and the bar fill are all removed. The verdict card, the stamp at its static rotation, and the progress bar at its final width are shown immediately and whole.NFR-01 — Offline operation (explicit) The application must work fully offline, with no network requests of any kind. Rationale: the authoritative requirement states "Must work fully offline" and forbids external requests; the demo must run with the network disconnected.
NFR-02 — Single-file delivery (explicit)
The application must be delivered as one self-contained HTML file with HTML, a single <style> block, and a single <script> block. Rationale: explicit technology constraint.
NFR-03 — No frameworks, libraries, backend, API, database, wallet, blockchain, or external requests (explicit) None of these may be used or contacted. Rationale: explicit technology constraint.
NFR-04 — Safe DOM rendering (explicit)
User text must never be passed through innerHTML; rendering must use textContent, createElement, and appendChild. Rationale: explicit security constraint; pasted content must never be interpreted as markup.
NFR-05 — No dynamic code execution (explicit)
eval and the Function constructor must not appear anywhere in the implementation. Rationale: explicit security constraint.
NFR-06 — Safe regular expressions (explicit)
Every rule regex must avoid nested quantifiers and use bounded wildcards such as [\s\S]{0,60}. Rationale: explicit constraint; the analyzer must not hang or catastrophically backtrack during a live demo.
NFR-07 — No raw error exposure (explicit)
Analysis must be wrapped in try/catch and raw errors must never be shown to the user. Rationale: explicit constraint; the user must always see a friendly message.
NFR-08 — No console errors (explicit) The application must produce no console errors during load or during any interaction. Rationale: explicit final-check requirement; the console is visible during the demo.
NFR-09 — Accessibility (explicit)
Proper labels, keyboard navigation, visible focus, aria-live regions, WCAG AA contrast, meaning never carried by colour alone, and touch-friendly buttons. Rationale: explicit accessibility requirement.
NFR-10 — Responsive with no horizontal scroll (explicit) The layout must work at 320px, 360px, 390px, tablet, and desktop with no horizontal scroll. Rationale: explicit responsive requirement.
NFR-11 — Theme following system preference (explicit)
Light and dark themes must be driven by CSS variables following prefers-color-scheme. Rationale: explicit theme requirement.
NFR-12 — Reduced-motion support (explicit)
All motion must be disabled under prefers-reduced-motion. Rationale: explicit animation constraint.
NFR-13 — Safe optional storage (explicit)
Any localStorage use must be optional and wrapped in try/catch. Rationale: explicit constraint; the app must not break when storage is blocked.
NFR-14 — Sample/test data only (explicit) The app must never handle real Bitcoin, keys, or payments. Rationale: explicit safety constraint.
NFR-15 — Correct sample classification (explicit) Fake Giveaway, Guaranteed Profit, and Fake Support must classify as CRITICAL; Withdrawal Fee as HIGH; Normal Question as LOW. Rationale: explicit acceptance target; the self-test verifies it.
NFR-16 — Negation correctness (explicit) "Never share your seed phrase" and "Do not send Bitcoin" must not trigger any rule. Rationale: explicit correctness constraint.
NFR-17 — Bonus correctness (explicit) The +12 bonus must be applied to the sum when urgency AND payment rules both match, before the formula is evaluated. Rationale: explicit scoring constraint.
NFR-18 — Formula always shown (explicit) The full calculation must always be shown to the user. Rationale: explicit transparency requirement.
NFR-19 — Highlight safety and interactivity (explicit) Highlighting must always be produced through the DOM and must support click and focus navigation to the matching finding. Rationale: explicit requirement.
NFR-20 — Practice completeness (explicit) All six practice scenarios must display, accept an answer, and give a rationale. Rationale: explicit requirement.
NFR-21 — Self-test authenticity (explicit) The self-test must run real analysis on all five samples and output correct pass/fail lines. Rationale: explicit requirement; hardcoded results would defeat the demo.
NFR-22 — External link safety (explicit)
The India Cyber Crime Portal link must open in a new tab with rel="noopener noreferrer". Rationale: explicit constraint and reference directive.
<style> block, using CSS custom properties for the light and dark themes and prefers-color-scheme for the switch. No CSS frameworks.<script> block. No frameworks, no libraries, no build step."Bricolage Grotesque", Arial, system-ui; body "IBM Plex Sans", system-ui; evidence text "IBM Plex Mono", ui-monospace, monospace. No font files are fetched.localStorage is optional and, if used, wrapped in try/catch. No database.Assumptions
Constraints
<style> + vanilla JS in <script>.innerHTML with user text; use textContent / createElement / appendChild.eval or Function.[\s\S]{0,60}.prefers-reduced-motion.try/catch.rel="noopener noreferrer".#B0121F (light) / #C4162A (dark).bitshield-3.id, label, weight, regex, explanation, tip, family, and stage.round(100 x (1 - e^(-sum/45))), capped at 100.-3.2deg carrying the risk level and the score, printed over the corner of the evidence sheet.RUN SELF-TEST control that really runs the analyzer on all five samples and reports per-sample PASS/FAIL lines and a summary count.SCAM and SAFE buttons, feedback, and explanations.No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No completed page designs yet.
Completed design pages will appear here when they are ready to preview.
No comments yet. Be the first!