Public questionnaire research harness (PRD-013 / TAT-380 Step 3)
This is an offline, synthetic research harness, not a completed study or an Industry Pack. Read the study design and the codebook first. All unresolved execution gates in the design still apply. No live collection, model downloads, model inference, form submissions, contact, outreach, deployment or spending happened here.Run locally — $0, no network in the harness
With repository development dependencies installed:--dry-run and reads the invented, CC0-1.0 HTML in
fixtures/. It never resolves fixture URLs, fetches pages,
executes JavaScript or CSS, opens a browser, follows links, authenticates or submits
forms. It writes captures.json, frequency.json and frequency.csv under
research/out/ (gitignored). JSON envelopes explicitly mark the results synthetic;
the adjacent CSV is the same synthetic demonstration, not empirical frequencies.
Delete that directory to remove the local output. No actual sampling targets,
search settings, sample sizes, agreement quantities or evaluator prices are set.
Collection boundary and provenance
scraper/harness.ts exports the frozen study queries (tattoo first, then laser
removal, agency websites and combined auto wraps / PPF / tint), a transient HTML
extractor, a capture function, a deterministic tagger and frequency writers.
There were no seed URLs in the design; no real provider URLs were invented.
The fixture URLs are reserved .example identifiers, not discovery results.
There is deliberately no live network transport or search integration.
capture(source, html) processes already supplied, permission-reviewed transient
HTML; it is not authorization to acquire a real page. Before any future transport
is implemented or real material is supplied, Gavin must resolve the design’s
sampling, retention, analysis and permission gates. A future transport must enforce
public-only destinations (including DNS/redirect checks), robots.txt for its actual
user agent/path, terms, bounded requests, and site objections before fetching.
Do not retrofit this API into an unrestricted crawler.
Each source must name an allowlisted discovery query, industry/subtype,
provider/template references, and a permission-review reference with recorded
source license, public status, service relevance, completeness, explicit robots
and terms decisions and transient-processing permission. These are human review
attestations, not an automated robots parser or proof of permission. Disallowed,
unclear or missing permission means skip and log; no text hash/tags are produced.
Fixture permission flags cover only our synthetic source, never any real site.
Only sanitized public HTTPS identifiers without credentials, query parameters or
nonstandard ports are accepted. Metadata must be reviewed and contain no personal
information or tokens; URL validation alone cannot establish public access.
Captures retain URL, Pacific capture time with UTC offset and timezone name,
industry, review/license references, backend/codebook revisions, status, reason,
and a SHA-256 of visible questionnaire text after NFC normalization, whitespace
collapse and trim (nfc-whitespace-v1). Text exists only transiently. No HTML,
verbatim prompt, screenshot or full text is written. Inputs/textarea answers,
script/template content and navigation are omitted. Source licenses do not license
models or authorize reuse by themselves.
The static extractor supports form labels, legends, associated select choices,
and explicit policy paragraphs inside forms. Generic free text,
contact-only pages and marketing outside forms do not establish factor presence.
Hidden/aria-hidden/inert elements are ignored. Dynamic scripts, CSS-dependent
rendering and frames make completeness unresolved; they are not rendered or
probed. This is intentionally conservative and not a browser visibility proof.
A reviewer must establish that a static questionnaire is complete before absence
can be asserted. Login/password and recognizable CAPTCHA flows are excluded;
never attempt to reveal hidden steps. Unsupported/unreadable flows are missing.
An objection immediately quarantines the new record without text processing.
Aggregation removes prior captures for that same origin across industries from
pending outputs too. Maintain objections when rerunning; do not drop objection
records to resurrect captures. Stop acquisition and processing, pause publication,
and let Gavin resolve retention/deletion. The harness does not contact the site or
automatically delete previously written output; existing output must be treated
as quarantined and withdrawn pending that review. Publish only reviewed aggregates.
Factor decisions and $0 backend
deterministic-keywords-v1 maps visible prompt cues to exact tattoo codebook IDs;
style means color treatment, not an arbitrary art-style name. Evidence consists
only of generated locators and non-verbatim rationales. Ambiguous cues and unknown variables require human review; the rules do not
resolve semantic conflicts. other pricing cues abstain for human
paraphrasing instead of forcing a tattoo id. No non-tattoo codebook is approved,
so those inputs are excluded and their output has only an empty other placeholder.
Laser-removal Pack #2 remains Step 4, outside this change.
The experimental “Noul” field is explicitly uncalibrated rule strength on 0–1:
matched cue = 0.9, complete/no cue = 0.5, unresolved/unmapped = 0. These are software
heuristic constants, not approved study thresholds, calibrated probabilities,
factor importance or pricing weights. No score cutoff filters observations.
Incomplete records use uncertain instead of absent for unobserved factors and
never enter a frequency denominator. Golden fixtures lock the deterministic
behavior; they do not validate recall on real websites. False positives/negatives
are possible; independent blinded human coding and the design’s agreement plan
remain required before interpreting results.
No verified model artifact or model license was supplied for offline inference.
We therefore selected no model: no Kev/Laya/Decider/Apache license claim, no
paid API, no paid download, no hosted inference. TaggerBackend is the future
local interface; OfflineOpenWeightStub fails closed. Before implementing it,
record artifact/revision, source, actual license text, weight/code coverage,
restrictions, reviewer/date, and verify offline operation and Apache-2.0 suitability.
Hosted TypeSafe Jev is forbidden without a CFA check plus Gavin’s explicit OK.
Do not send page text to third parties or introduce hosted fallbacks.