local-test is a local credential-testing harness for a security laboratory. It sends HTTP/API requests from a local test target through an attempt controller to a candidate generator, a worker pool, a deliberately vulnerable local test authentication service, and a result/log output. The harness exists so that a lab operator can measure how weak a set of laboratory credentials is, using a target and a vulnerable test authentication service that the operator controls.
The product is a measuring instrument, not a general-purpose tool. It counts attempts per second, tracks a queue of pending, successful, and failed attempts, and returns a single verdict per candidate: the laboratory service accepted it or rejected it. Its audience is technical, hands-on, and slightly adversarial in spirit — people who want to feel the machine working: rates, counters, queues, accept/reject verdicts.
The harness is explicitly scoped to laboratory use. It is not for use against systems the operator does not control, and its password lists are locally generated test lists.
local-test is delivered as a first-party web application backed by a local service. The operator configures a run with a target they control, test username(s), a locally generated test password list, and optional concurrency settings. The harness then generates or reads candidate passwords, submits each candidate to the deliberately vulnerable local test authentication service, analyzes the controlled test application's response to decide accept or reject, and reports attempts/second, number tested, the successful laboratory credential, error counts, and runtime/logs.
Current delivery covers the full laboratory pipeline: input configuration, candidate generation, attempt execution, response analysis, concurrency and queue management, and results/logging. Run state and attempt results are retained so that queue processing and later result review are possible.
Actors:
Narrow exclusions:
local-test is a local instrument. Everything it measures happens against a target the operator controls and a deliberately vulnerable local test authentication service that the operator stands up for the experiment. The harness never reaches outside that boundary, and it does not attempt to discover, enumerate, or attack anything the operator has not explicitly supplied as a target.
The application owns the run lifecycle: configuration, candidate generation, attempt submission, response analysis, queue tracking, and result reporting. The operator owns the target and the vulnerable test authentication service; the harness treats them as external systems it is pointed at, not as things it provisions. The password list is locally generated test material supplied by the operator.
Access is open. The Landing, Run Setup, Candidates, Attempt Runner, Response Analyzer, Queue Monitor, and Results surfaces are reachable without an account, because the harness runs on the operator's own bench against their own laboratory service. No account, invitation, or provisioning step is part of the current product.
Everything described in this document is current. There is no accepted future horizon beyond the current laboratory pipeline.
Not applicable. No reference directive in this project declares a content_source.
clamp(44px, 9vw, 128px), stacked over a ruled target line, with a single amber "Arm run" control pinned beneath it. Behind the gauges, faint topographic contour lines and a very low-opacity brushed-titanium texture. The pipeline is rendered as an engraved schematic strip — six numbered nodes on a hairline rail with a travelling amber pulse that marks which stage is currently executing. No centred headline, no subtext block, no blue button, no gradient blob.FR-1 — Local credential-testing harness pipeline As a Security Lab Operator, I should have a local credential-testing harness that sends HTTP/API requests from a local test target through an attempt controller to a candidate generator, worker pool, local test auth server, and result/log output, so that the laboratory pipeline runs end to end.
FR-2 — Accepted run inputs As a Security Lab Operator, I should be able to supply the target I control, test username(s), a locally generated test password list, and optional concurrency settings, so that the harness knows what to test.
FR-3 — Candidate generation and reading As a Test Harness Maintainer, I should have a candidate generator that generates or reads candidate passwords using dictionary, rule-based, and exhaustive-combination approaches, so that the candidate set matches the experiment.
FR-4 — Attempt engine submission and recording As a Test Harness Maintainer, I should have an attempt engine that sends each candidate to a deliberately vulnerable local test authentication service and records whether the laboratory service accepts or rejects it, so that every candidate has a recorded laboratory outcome.
FR-5 — Response analysis from status codes and contents As a Test Harness Maintainer, I should have a response analyzer that determines success or failure from the controlled test application's response using HTTP status codes and response contents, so that verdicts are accurate rather than false-positive-prone.
FR-6 — Worker pool and central queue As a Test Harness Maintainer, I should have a worker pool that processes candidates and a central queue that tracks pending, successful, and failed attempts, so that concurrency is managed and every attempt is accounted for.
FR-7 — Results reporting As a Security Lab Operator, I should see attempts/second, number tested, the successful laboratory credential, error counts, and runtime/logs, so that I can judge how weak the lab credentials are.
FR-8 — Operator-supplied controlled target and vulnerable local service As a Security Lab Operator, I should provide a target I control and a deliberately vulnerable local test authentication service, so that the harness has a laboratory boundary to measure against.
FR-9 — Test usernames and locally generated test password list before execution As a Security Lab Operator, I should supply test usernames and a locally generated test password list before execution, so that the harness has laboratory credentials to test.
FR-10 — Retained run state and attempt results As a Test Harness Maintainer, I should have run state and attempt results retained, so that queue processing and later result review are supported.
Product context. The Security Lab Operator runs credential-strength experiments against a deliberately vulnerable local test authentication service they control. They work on their own bench, against their own laboratory service, and they want to know how weak a set of lab credentials is. They are technical, hands-on, and slightly adversarial in spirit.
Primary goal. Judge how weak the laboratory credentials are by running the harness and reading the resulting figures.
Distinct accepted responsibilities. The operator supplies the target they control, test username(s), a locally generated test password list, and optional concurrency settings. They start the run. They review attempts/second, number tested, the successful laboratory credential, error counts, and runtime/logs. They also supply the deliberately vulnerable local test authentication service that the harness measures against.
Relevant inputs or decisions. Which target they control to point at. Which test usernames to test. Which locally generated test password list to use. Whether to supply concurrency settings at all, since they are optional. Whether the reported successful laboratory credential is plausible given the list they supplied.
Interactions with other accepted participants. The operator hands the harness internals to the Test Harness Maintainer: the maintainer owns the candidate generator, attempt engine, response analyzer, worker pool, and central queue that the operator's run depends on. The operator's run is only as accurate as the maintainer's analyzer logic, and the operator is the one who sees the resulting verdicts.
Observable success. The Results surface reports attempts/second, number tested, the successful laboratory credential, error counts, and runtime/logs for the run, and the operator can judge the weakness of the lab credentials from those figures.
Product context. The Test Harness Maintainer owns the harness internals: the candidate generator (dictionary, rule-based, exhaustive combinations), the attempt engine that submits each candidate to the local test auth service, the response analyzer that decides accept/reject from the controlled test application's response, and the worker pool plus central queue tracking pending, successful, and failed attempts. They work on the instrument itself rather than on a single experiment.
Primary goal. Keep the harness accurate — tune concurrency and analyzer logic so results reflect the laboratory service's actual behavior rather than false positives.
Distinct accepted responsibilities. Choosing and tuning the candidate generation approach across dictionary, rule-based, and exhaustive combinations. Ensuring the attempt engine records accept or reject for every candidate. Ensuring the response analyzer uses HTTP status codes and response contents rather than status codes alone, so that verdicts are not false-positive-prone. Tuning the worker pool and central queue so pending, successful, and failed attempts are tracked correctly. Ensuring run state and attempt results are retained for queue processing and later result review.
Relevant inputs or decisions. Which generation approach to use for a given experiment. How the analyzer should weigh status codes against response contents. How much concurrency the worker pool should apply. Whether an ambiguous response should be reported as ambiguous rather than asserted as a verdict.
Interactions with other accepted participants. The maintainer's internals serve the Security Lab Operator's run. The maintainer's analyzer decisions determine whether the operator's reported successful laboratory credential is trustworthy, and the maintainer's queue and worker-pool behavior determines the attempts/second and error counts the operator reads.
Observable success. The central queue correctly tracks pending, successful, and failed attempts; the response analyzer returns verdicts grounded in both status codes and response contents; and the operator's reported results are accurate rather than false-positive-prone.
The creative direction is authoritative for this section. Muse: MARQ by Garmin — luxury instrument aesthetic. Headline: Precision instrumentation for the lab bench — titanium dark, dial data, one amber signal.
Color tokens (dark mode).
| Role | Hex | Use |
|---|---|---|
| Background | #0E1012 | Graphite-black ground, edge-to-edge |
| Surface | #17191C | Titanium panel surfaces |
| Rule | #2A2D31 | Hairline 1px rules and panel borders |
| Text | #EDE9E1 | Warm off-white body text |
| Primary | #C8A96A | Champagne/brushed-steel bezels, gauge arcs, structural rules |
| Accent | #E8A33D | The single instrument signal: live needle, accept verdict, active queue states |
| Muted | #7C8189 | Labels, units, secondary data |
| Reject | desaturated warm grey | Rejections — never a red/blue status colour |
Proportion: ~80% graphite/titanium, ~15% champagne structure, ~5% amber signal. The amber accent must stay scarce so it reads as an instrument light, not decoration.
Typography.
clamp(44px, 9vw, 128px) for the hero readout.Shape language. Circular gauges and bezels are the primary geometry — every rate, count, and queue state can be expressed as a dial, an arc, or a ring. Rounded-rectangle panels with 2px radii and hairline 1px borders for everything else. Ruled data rows with a 1px baseline under each entry, like an engraved spec sheet. No pill buttons, no large radii, no blobs. Corners are sharp-ish and machined.
Layout. Dark, edge-to-edge instrument panel. Left rail is a vertical run-status spine (target, username, mode, concurrency) that stays fixed while the right column scrolls through the pipeline: Input → Candidate Generator → Worker Pool → Local Test Auth Server → Response Analyzer → Result/Log. Each pipeline stage is a numbered instrument module with a ruled header, a status lamp, and a data readout. Queue Monitor is a full-width horizontal strip of stacked tick marks showing pending / successful / failed as three coloured bands. Results sit at the bottom as a spec-sheet table, not cards.
Imagery. No photography of people. Imagery is the instrument itself: circular gauge clusters, topographic contour lines as faint background texture, engraved technical diagrams of the request pipeline, and macro textures of brushed titanium and sapphire glass used as panel backgrounds at very low opacity. The pipeline diagram from the brief is redrawn as an engraved schematic with numbered nodes and thin luminous strokes.
Avoid. Blue/indigo status colours on white; generic dashboard card grid with hover-lift shadows; pill buttons and large soft radii; red/green traffic-light status chips (rejections stay in desaturated warm grey); photography of people, stock team imagery, or any human-centred illustration; gradient-blob or glassmorphism hero treatments; playful, bouncy, or springy easing; making the amber accent common. The generic indigo/blue-on-white SaaS template is forbidden for this project.
The public entry is an instrument face, not a marketing hero.
Full-bleed dark graphite ground (#0E1012). The dominant element is an oversized circular gauge cluster occupying the right two-thirds of the viewport: a large central dial reading attempts/second with the amber needle live, flanked by two smaller bezels for tested and accepted. The bezels and gauge arcs are champagne (#C8A96A); the needle and the accept signal are amber (#E8A33D); labels and units are muted steel (#7C8189).
The left third holds the product name in condensed uppercase at clamp(44px, 9vw, 128px), stacked over a ruled target line, with a single amber "Arm run" control pinned beneath it. Behind the gauges, faint topographic contour lines and a very low-opacity brushed-titanium texture.
Beneath the gauge cluster, the pipeline is rendered as an engraved schematic strip — six numbered nodes on a hairline rail with a travelling amber pulse that marks which stage is currently executing. The six nodes are the accepted pipeline: Input, Candidate Generator, Worker Pool, Local Test Auth Server, Response Analyzer, Result/Log.
There is no centred headline, no subtext block, no blue button, and no gradient blob. The composition is an instrument face. Every readable element — the product name, the ruled target line, the micro-labels, the numerals, and the "Arm run" control — stays whole inside the viewport and its container at 375px, 768px, and 1280px, wrapping or scaling to fit, with no other element covering any part of it.
Interaction Model: Animated Motion Tempo: restrained Hero Dimensionality: dimensional_css
Landing Hero Motion Brief
prefers-reduced-motion, needles jump to their final values, counters render statically, and tick marks appear in place. The parallax on the hero gauge cluster is removed and the cluster holds a single static composition. All readable text and controls remain whole and usable.NFR-1 — Laboratory boundary. Testing is limited to a local test target the operator controls and a deliberately vulnerable local test authentication service; the harness is not for use against systems the operator does not control. (Provenance: explicit. Rationale: explicit hard constraint in the authoritative user evidence.)
NFR-2 — Locally generated test password lists. Password lists are locally generated test lists. (Provenance: explicit. Rationale: explicit hard constraint in the authoritative user evidence.)
NFR-3 — Optional concurrency settings. Concurrency settings are optional; the harness must run correctly without them. (Provenance: explicit. Rationale: explicit hard constraint in the authoritative user evidence.)
NFR-4 — Verdict accuracy. The response analyzer must determine success or failure from HTTP status codes and response contents rather than status codes alone, because relying on only status codes can produce false positives. (Provenance: explicit. Rationale: stated in the authoritative user evidence.)
NFR-5 — Retained run state. Run state and attempt results must be retained to support queue processing and later result review. (Provenance: required_inference. Rationale: required to make the accepted run lifecycle executable.)
NFR-6 — Readable text and controls. Headlines, wordmarks, labels, numbers, and controls stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling to fit, with no other element covering any part of them. (Provenance: explicit. Rationale: stated in the creative direction.)
NFR-7 — Reduced motion. All motion respects prefers-reduced-motion: needles jump to final values, counters render statically, tick marks appear in place, and a usable static arrangement is provided. (Provenance: explicit. Rationale: stated in the creative direction.)
Assumptions.
Constraints.
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!