@ia-qa/qa-discovery 0.5.0 โ 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -2
- package/TUTORIAL.md +17 -6
- package/dist/ai/classify.js +66 -3
- package/dist/ai/classify.js.map +1 -1
- package/package.json +1 -1
- package/skills/ia-qa-discover/SKILL.md +3 -2
package/README.md
CHANGED
|
@@ -472,8 +472,12 @@ Before the first request it prints what leaves and where it goes:
|
|
|
472
472
|
```
|
|
473
473
|
๐ Sending 3 pages to api.anthropic.com (anthropic ยท claude-haiku-4-5) โ your key, your account.
|
|
474
474
|
Leaves this machine: each page's URL, title and description, up to 25 headings,
|
|
475
|
-
every observed API call (method, normalised path, status),
|
|
476
|
-
|
|
475
|
+
every observed API call (method, normalised path, status), each form's method and
|
|
476
|
+
action URL, and for every field its name, type, label, whether it is required, the
|
|
477
|
+
text around it and the click path that reveals it. Headings, labels, that surrounding
|
|
478
|
+
text and those click labels are live text from your app.
|
|
479
|
+
Does NOT leave: your CSS selectors. Measured on 57 real fields, a selector adds no
|
|
480
|
+
word that the name, label or type does not already carry โ only its position.
|
|
477
481
|
Query values are stripped at capture EXCEPT an allowlist that includes `q` โ a search
|
|
478
482
|
term reaches the model as typed (`capture.safeQueryParams` in config.json narrows it).
|
|
479
483
|
Does NOT leave: page HTML, screenshots, cookies or your session file, your test files,
|
package/TUTORIAL.md
CHANGED
|
@@ -417,8 +417,18 @@ model, with **your** API key, what each form and field is for and how sensitive
|
|
|
417
417
|
|
|
418
418
|
**It is the only thing in this package that sends anything anywhere, and it says so before it
|
|
419
419
|
does**, listing exactly what goes: the page URL, title, description, up to 25 headings, the
|
|
420
|
-
observed API calls,
|
|
421
|
-
|
|
420
|
+
observed API calls, each form's method and action URL, and for every field its name, type,
|
|
421
|
+
label, whether it is required, the text around it and the click path that reveals it.
|
|
422
|
+
|
|
423
|
+
**Your CSS selectors do not leave**, and that is a measurement rather than a courtesy: over 25
|
|
424
|
+
real pages and 57 fields, the number whose selector carried one word that the name, label or
|
|
425
|
+
type did not already carry was **zero**. What a selector adds is position. Read that notice
|
|
426
|
+
before running it on a private or authenticated app.
|
|
427
|
+
|
|
428
|
+
That list is not prose someone keeps in step by hand. The payload is built field by field, and
|
|
429
|
+
a test fails on any key the notice does not name. It used to be built by copying the capture
|
|
430
|
+
object whole โ which meant a field added to the capture left for the model unannounced, and
|
|
431
|
+
three of them already had.
|
|
422
432
|
|
|
423
433
|
Two guarantees make the output usable:
|
|
424
434
|
|
|
@@ -466,10 +476,11 @@ confidence and the citations, not the sentence.**
|
|
|
466
476
|
|
|
467
477
|
### It sends less than `classify`, deliberately
|
|
468
478
|
|
|
469
|
-
No
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
479
|
+
**No observed API calls** leave for this question โ technical noise for a question about
|
|
480
|
+
people. Selectors leave for neither verb any more: they used to be the other half of this
|
|
481
|
+
sentence, until a measurement showed they carry no word the name, label or type does not, and
|
|
482
|
+
`classify` dropped them too. The notice each verb prints before its first request is derived
|
|
483
|
+
from the function that builds the payload, so it cannot promise less than it sends.
|
|
473
484
|
|
|
474
485
|
**Your footer does not leave either.** Headings that appear across your whole app โ `Legal`,
|
|
475
486
|
`Contact`, a nav title โ are the shell, not this page's content, and they are dropped from
|
package/dist/ai/classify.js
CHANGED
|
@@ -86,6 +86,65 @@ function offeredPaths(page, entryPoints) {
|
|
|
86
86
|
}
|
|
87
87
|
return out;
|
|
88
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* One entry point, field by field.
|
|
91
|
+
*
|
|
92
|
+
* It used to be `{ at, kind, ...(e.detail as object) }` โ the whole capture object, spread.
|
|
93
|
+
* That made the payload a function of the **capture type** rather than of `egressNotice`,
|
|
94
|
+
* and the notice had already drifted behind it: it announced "each form field's name, type,
|
|
95
|
+
* label and selector" while `via` (the click path to reach the field โ live UI labels),
|
|
96
|
+
* `context` (the text around it) and the form's `action` URL also left, unannounced.
|
|
97
|
+
* Demonstrated rather than argued: one attribute added to a field object reached the
|
|
98
|
+
* provider through this function and did not through `planPayload`, which enumerates.
|
|
99
|
+
*
|
|
100
|
+
* So this enumerates. A field added to `FormField` tomorrow cannot leave on its own; making
|
|
101
|
+
* it leave means writing a line here, next to the notice it owes an edit to.
|
|
102
|
+
*
|
|
103
|
+
* **Selectors do not go, and that was measured rather than argued.** The first version of this
|
|
104
|
+
* function sent exactly what the spread sent, on the grounds that narrowing it could change
|
|
105
|
+
* what the model answers and owed a measurement. The measurement was taken: 25 real pages, 57
|
|
106
|
+
* fields, and the number of fields whose selector contributes **one semantic token** that
|
|
107
|
+
* `name`, `label` or `type` does not already carry is **zero**. What a selector adds is
|
|
108
|
+
* position โ `div:nth-of-type(3) > input:nth-of-type(1)` โ and position says nothing about
|
|
109
|
+
* what a field is *for*, which is the only question this prompt asks. Dropping it and the two
|
|
110
|
+
* flags that describe it removes 54% of the bytes per field and the most sensitive half of the
|
|
111
|
+
* payload, for no information the model had.
|
|
112
|
+
*
|
|
113
|
+
* `labelSource` stays because it qualifies something that stays: `proximity` means the label
|
|
114
|
+
* was read off nearby text rather than declared, and a model should weigh it accordingly.
|
|
115
|
+
* `context` and `via` stay because they are the opposite of a selector โ they say what the
|
|
116
|
+
* field sits under and what reveals it, which is intent, not address.
|
|
117
|
+
*/
|
|
118
|
+
function entryPointPayload(e) {
|
|
119
|
+
const field = (f, path) => ({
|
|
120
|
+
// Every citable thing carries its path โ the rule this file states twice and broke here:
|
|
121
|
+
// `offeredPaths` offers `โฆ#forms[i].fields[j]`, so a model citing one was citing a path
|
|
122
|
+
// it had been offered and never shown. Third instance of the same class in this file.
|
|
123
|
+
at: path,
|
|
124
|
+
type: f.type,
|
|
125
|
+
name: f.name,
|
|
126
|
+
...(f.label !== undefined ? { label: f.label } : {}),
|
|
127
|
+
...(f.labelSource !== undefined ? { labelSource: f.labelSource } : {}),
|
|
128
|
+
required: f.required,
|
|
129
|
+
...(f.via !== undefined ? { via: f.via } : {}),
|
|
130
|
+
...(f.context !== undefined ? { context: f.context } : {}),
|
|
131
|
+
});
|
|
132
|
+
if (e.kind === 'form') {
|
|
133
|
+
const form = e.detail;
|
|
134
|
+
return {
|
|
135
|
+
at: e.path,
|
|
136
|
+
kind: e.kind,
|
|
137
|
+
method: form.method,
|
|
138
|
+
// Where the form posts. Unlike a field selector this IS intent โ `/login` and `/search`
|
|
139
|
+
// are different questions โ so it stays, and the notice names it.
|
|
140
|
+
action: form.action,
|
|
141
|
+
...(form.sameOriginAction !== undefined ? { sameOriginAction: form.sameOriginAction } : {}),
|
|
142
|
+
hasSubmit: form.hasSubmit,
|
|
143
|
+
fields: (form.fields ?? []).map((f, j) => field(f, `${e.path}.fields[${j}]`)),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return { kind: e.kind, ...field(e.detail, e.path) };
|
|
147
|
+
}
|
|
89
148
|
function buildPrompt(page, entryPoints) {
|
|
90
149
|
// EVERY citable thing carries its `at` path, including the metadata.
|
|
91
150
|
// Measured on a real run: the first version showed title/description flattened
|
|
@@ -116,7 +175,7 @@ function buildPrompt(page, entryPoints) {
|
|
|
116
175
|
// `detail` key and the model dutifully cited `#looseFields[0].detail`, a
|
|
117
176
|
// path that exists in the prompt and nowhere in the capture.
|
|
118
177
|
'ENTRY POINTS to classify, each with the path that addresses it:',
|
|
119
|
-
JSON.stringify(entryPoints.map(
|
|
178
|
+
JSON.stringify(entryPoints.map(entryPointPayload), null, 2),
|
|
120
179
|
'',
|
|
121
180
|
'RULES.',
|
|
122
181
|
`1. Answer with ONE JSON object: {"classifications":[...]}. No prose outside it.`,
|
|
@@ -255,8 +314,12 @@ function egressNotice(provider, model, pages, planned = false, baseUrl) {
|
|
|
255
314
|
const n = `${pages} page${pages === 1 ? '' : 's'}`;
|
|
256
315
|
return (`\n ๐ ${planned ? 'Would send' : 'Sending'} ${n} to ${host} (${provider} ยท ${model}) โ your key, your account.\n` +
|
|
257
316
|
` Leaves this machine: each page's URL, title and description, up to 25 headings,\n` +
|
|
258
|
-
` every observed API call (method, normalised path, status),
|
|
259
|
-
`
|
|
317
|
+
` every observed API call (method, normalised path, status), each form's method and\n` +
|
|
318
|
+
` action URL, and for every field its name, type, label, whether it is required, the\n` +
|
|
319
|
+
` text around it and the click path that reveals it. Headings, labels, that surrounding\n` +
|
|
320
|
+
` text and those click labels are live text from your app.\n` +
|
|
321
|
+
` Does NOT leave: your CSS selectors. Measured on 57 real fields, a selector adds no\n` +
|
|
322
|
+
` word that the name, label or type does not already carry โ only its position.\n` +
|
|
260
323
|
` Query values are stripped at capture EXCEPT an allowlist that includes \`q\` โ a search\n` +
|
|
261
324
|
` term reaches the model as typed (\`capture.safeQueryParams\` in config.json narrows it).\n` +
|
|
262
325
|
` Does NOT leave: page HTML, screenshots, cookies or your session file, your test files,\n` +
|
package/dist/ai/classify.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/ai/classify.ts"],"names":[],"mappings":";;;AAiGA,sCASC;AAoBD,oCAiBC;
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/ai/classify.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ia-qa/qa-discovery",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "Deterministic surface reconnaissance for an unknown web app โ crawl, capture, diff. No LLM, no hosting: runs entirely on your machine, with a local MCP server for agents.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"qa",
|
|
@@ -104,8 +104,9 @@ a `/logout` or `/delete` URL), and โ only if the user opted in โ `ia-qa-disc
|
|
|
104
104
|
|
|
105
105
|
The two `-ai` verbs announce what they send *before* they send it, on stderr, in every mode.
|
|
106
106
|
Read that announcement to the user before running either on a private or authenticated app.
|
|
107
|
-
`plan` sends strictly less than `classify`: no
|
|
108
|
-
|
|
107
|
+
`plan` sends strictly less than `classify`: no observed API calls, and not the headings the
|
|
108
|
+
whole app repeats. **Neither verb sends CSS selectors** โ measured over 57 real fields, a
|
|
109
|
+
selector carries no word the name, label or type does not already carry, only its position.
|
|
109
110
|
|
|
110
111
|
## 6. Setting up the BYOK key โ ask, never invent
|
|
111
112
|
|