{"ns":"gate","title":"Sentinel Gate","version":"4.3","summary":"Sentinel Gate is a sign-in portal that verifies a password and then a human-verification challenge bound to the account: distorted text, canvas math, a 3x3 image grid, a jigsaw slider, drag-shapes-to-outlines, rotate-upright, or a three-stage chain. Repeated failures lock the browser tab for 30 seconds. After sign-in, a security overview shows a score, the signed-in devices, an access log and recovery codes that sit behind a step-up challenge.","problem":"Account owners need a sign-in that stops scripted guessing without locking out real people, and a clear view of which devices are signed in so they can remove the ones they do not recognise.","personas":[{"name":"Account owner","need":"Sign in with a short, fair challenge and manage trusted devices afterwards."},{"name":"Security-minded user","need":"Keep recovery codes hidden until identity is re-verified and see every sign-in event in a log."},{"name":"Operator","need":"Be sure that wrong answers are always refused, repeated failures lock the tab, and the browser never receives the correct answers."}],"goals":["Only a correct password plus a correct challenge answer signs a user in.","Three consecutive failures lock the tab for 30 seconds, whether the failure was a password or a challenge.","Device actions affect exactly the device the user clicked, and the security score always reflects the device list."],"features":[{"id":"PWD","title":"Password step","summary":"First step of sign-in; a correct password reveals the account’s challenge.","reqs":[{"id":"FR-PWD-01","weight":"Must","text":"The sign-in card requires a username and password; \"Continue\" stays disabled until both are filled, and a valid pair replaces the form with the verification card.","accept":["Opening the portal shows the sign-in card with Username, Password and a disabled \"Continue\"","Valid credentials show the challenge assigned to that account"]},{"id":"FR-PWD-02","weight":"Should","text":"A wrong password is refused with a counter that feeds the lockout.","accept":["Message \"Username or password is incorrect\" with \"1 of 3\" and \"2 of 3\" on the first two failures","The third failure locks the tab (see lockout)"]}]},{"id":"TXT","title":"Text captcha","summary":"A five-character code drawn on a noisy canvas.","reqs":[{"id":"FR-TXT-01","weight":"Must","text":"Typing the drawn code signs the user in.","accept":["Title \"Type the characters you see\", stage chip \"1 / 1\" and a 90 s countdown","Five characters from A–Z and 2–9 (no 0, O, 1, I or L)","Success flashes green and opens the security overview; the access log starts with \"Signed in\" followed by \"Challenge · text passed\""]},{"id":"FR-TXT-02","weight":"Must","text":"The answer is not case-sensitive, as the ⓘ hint promises.","accept":["Tooltip \"Letters are not case-sensitive\"","The code typed in lowercase or UPPERCASE is accepted"]},{"id":"FR-TXT-03","weight":"Must","text":"A wrong answer is refused, a fresh code is drawn and one attempt pip turns red.","accept":["Message \"That was not right — try this one\"; the input is cleared and focused","The first of three pips is filled red","The log records a red \"Challenge · text answered incorrectly\" row"]},{"id":"FR-TXT-04","weight":"Could","text":"The ↻ icon draws a new code at most five times; refreshing is not a failure.","accept":["Caption counts \"4 refreshes left\" down to \"0 refreshes left\" and the icon is disabled with tooltip \"Refresh limit reached — answer this challenge\"","All pips stay hollow"]}]},{"id":"MTH","title":"Math captcha","summary":"A short sum drawn on a canvas.","reqs":[{"id":"FR-MTH-01","weight":"Should","text":"An expression of two numbers with +, − or × is drawn; the correct result (which may be negative) is accepted and a wrong one is refused with a new expression.","accept":["Title \"Solve to continue\"","A wrong answer fills the first pip red and draws a new expression","After sign-in the greeting reads \"Welcome back, <first name>\" with the account chip \"math\""]}]},{"id":"GRD","title":"Image grid","summary":"Select every tile of a 3x3 grid that shows the named object.","reqs":[{"id":"FR-GRD-01","weight":"Must","text":"Selecting exactly the tiles that show the named object, in any row, passes the challenge.","accept":["Banner \"Select all squares with\" and the object name; nine pictogram tiles without text","A clicked tile shows a blue ✓ disc and clicking it again deselects it; \"n selected\" matches the ticks","A correct selection that includes bottom-row tiles signs the user in and logs \"Challenge · grid passed\""]},{"id":"FR-GRD-02","weight":"Must","text":"A selection that misses a target tile or includes a wrong tile is refused and the grid is redrawn.","accept":["Message \"That was not right — try this one\" and one red pip","The new grid may show a different object"]}]},{"id":"SLD","title":"Jigsaw slider","summary":"Drag the piece into the notch of a textured picture.","reqs":[{"id":"FR-SLD-01","weight":"Should","text":"Releasing the handle with the piece on the notch (within a few pixels) passes; the release auto-submits.","accept":["Title \"Slide to complete the puzzle\"; the piece follows the handle and the \"Drag →\" label hides while dragging","The track turns green with ✓ and the user is signed in; log shows \"Challenge · slider passed\""]},{"id":"FR-SLD-02","weight":"Should","text":"Releasing far from the notch fails: the track flashes red, the handle snaps back, a new picture with a different notch is shown and one pip turns red."}]},{"id":"MAT","title":"Drag-to-match","summary":"Drag four coloured shapes onto lookalike dashed outlines.","reqs":[{"id":"FR-MAT-01","weight":"Must","text":"Each shape must be placed on the outline of its own shape; correct placement of all four passes.","accept":["Title \"Drag each shape onto its outline\"; at least two outlines are lookalikes (e.g. pentagon vs hexagon, square vs diamond)","A shape glows over an outline and snaps in on drop; dragging it back to the tray empties the outline and disables \"Verify\" until all four are placed","A correct mapping signs the user in and logs \"Challenge · match passed\""]},{"id":"FR-MAT-02","weight":"Must","text":"Any wrong mapping is refused, even when all four outlines are filled.","accept":["Swapping lookalike shapes, or placing every shape on a wrong outline, shows \"That was not right — try this one\"","One pip turns red and a new set of shapes and outlines is shown"]}]},{"id":"ROT","title":"Rotate upright","summary":"Turn a tilted picture upright with ↺ and ↻.","reqs":[{"id":"FR-ROT-01","weight":"Should","text":"A scene tilted by a multiple of 45° is passed when turned upright; the readout shows the total turn.","accept":["Title \"Rotate the picture upright\"; icon-only ↺ and ↻ buttons either side of a \"0°\" readout","One ↻ click turns the picture 45° clockwise and the readout shows \"+45°\"","Verifying an upright scene signs the user in"]}]},{"id":"CHN","title":"Chained verification","summary":"Accounts with a three-stage challenge: grid, then match, then text.","reqs":[{"id":"FR-CHN-01","weight":"Must","text":"Stages run in order with a visible stage chip and progress dots; a failure in a later stage does not restart earlier stages.","accept":["Chip \"1 / 3\" with the first dot filled; passing a stage advances to \"2 / 3\" and \"3 / 3\"","A wrong match answer shows a red pip, stays on \"2 / 3\" with new shapes, not back at the grid","After the last stage the overview chip reads \"grid → match → text\", and the \"Single-stage verification\" finding is not shown","Log order, newest first: Signed in, text passed (stage 3/3), match passed (stage 2/3), match answered incorrectly, grid passed (stage 1/3)"]}]},{"id":"LCK","title":"Attempts and lockout","summary":"Three failures lock the tab; challenges expire.","reqs":[{"id":"FR-LCK-01","weight":"Must","text":"Three consecutive failures, password or challenge, lock sign-in for 30 seconds.","accept":["The card becomes a lock panel with \"Too many attempts. Try again in 30 s\" and a ring countdown; no input is available","Reloading keeps the lock and the remaining seconds","When the countdown ends the empty sign-in form returns and all three pips are hollow"]},{"id":"FR-LCK-02","weight":"Should","text":"A challenge expires 90 seconds after it is issued and an expired challenge cannot be answered.","accept":["Countdown turns amber below 15 s; at 0 the card shows \"Expired\" over a dimmed canvas with a \"New challenge\" button","\"New challenge\" issues a fresh challenge with the timer back at 90 and no failure recorded"]}]},{"id":"DEV","title":"Security overview and devices","summary":"Score, device list, trust and revoke.","reqs":[{"id":"FR-DEV-01","weight":"Should","text":"The device list shows five devices with OS icon, status dot and a trust shield.","accept":["Order: This browser, Work laptop, Phone, Tablet, Build agent","Dots: This browser blue ring (current); Work laptop green; Phone grey; Tablet grey; Build agent green","Filled shield (trusted) for the first three; outline shield for Tablet and Build agent","Build agent last-seen tooltip shows a timestamp about 9 days ago"]},{"id":"FR-DEV-02","weight":"Must","text":"Revoking signs out exactly the device whose ✕ was used (after an inline \"Yes\" confirmation), raises the score and is logged.","accept":["Tooltip \"Revoke\"; inline confirm \"Revoke Tablet? Yes / No\"","Only that row turns grey with a red \"revoked\" dot and a struck-through name; all others are unchanged","Findings change from \"2 untrusted devices still signed in\" to \"1 untrusted device still signed in\" and the log shows \"Device revoked · Tablet (Chrome 140)\""]},{"id":"FR-DEV-03","weight":"Could","text":"The current browser cannot be revoked: its ✕ is disabled with tooltip \"You cannot revoke the browser you are using — sign out instead\"."},{"id":"FR-DEV-04","weight":"Could","text":"Clicking the shield toggles trust and updates the score.","accept":["Trusting Build agent fills the shield (tooltip \"Trusted — click to untrust\") and raises the score","Clicking again restores the outline shield and the previous score"]},{"id":"FR-DEV-05","weight":"Should","text":"The security score is 100 minus 12 per untrusted live device, minus 10 per active device unseen for over 7 days, minus 6 for single-stage accounts, never below 0.","accept":["A score below 100 shows an amber arc with matching findings"]}]},{"id":"REC","title":"Recovery codes","summary":"Eight recovery codes revealed only after a step-up challenge.","reqs":[{"id":"FR-REC-01","weight":"Must","text":"Recovery codes are blurred until the user passes a fresh drag-to-match challenge, then stay available for 2 minutes and are identical on every reveal.","accept":["Eight blurred chips and a \"Reveal\" button; \"Reveal\" opens \"Verify it’s you\" with a drag-to-match challenge","After success: eight codes in XXXX-XXXX form and a \"hides in 2:00\" timer","\"Hide\" blurs them; \"Reveal\" within 2 minutes shows the same codes without a new challenge","Without a passed step-up the codes are refused with \"Verify it is you first\""]}]},{"id":"SES","title":"Session","summary":"Sign-out and access to the signed-in area.","reqs":[{"id":"FR-SES-01","weight":"Must","text":"The security overview requires a signed-in session; after sign-out it is not reachable, including via Back.","accept":["\"Sign out\" from the avatar menu returns to the sign-in card","Opening the overview directly redirects to the sign-in card and Back does not show it","The overview API without a session answers 401 \"Sign in first\""]}]}],"nfr":[{"id":"NFR-01","weight":"Must","text":"Challenge answers never leave the server: the challenge sent to the browser contains no plain-text answer or list of correct indices.","accept":["An incorrect answer through the API answers 422 \"That was not right\" with a new challenge id","A replaced or expired challenge id is refused"]},{"id":"NFR-02","weight":"Should","text":"Controls without a visible label (↻, ↺, ✕, shield, drag handle) carry a tooltip describing their action."}],"glossary":[{"term":"Attempt pips","meaning":"Three dots under the challenge title; one turns red per failure."},{"term":"Step-up","meaning":"A fresh challenge required to view recovery codes; valid for 2 minutes."},{"term":"Trusted device","meaning":"A device the owner marked trusted; untrusted live devices lower the score."}],"outOfScope":["Audio captcha (the speaker icon is decorative)","Account recovery and password reset","Real device fingerprinting"]}