@tangle-network/browser-agent-driver 0.30.0 → 0.32.0
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/dist/brain/index.d.ts +12 -0
- package/dist/brain/index.d.ts.map +1 -1
- package/dist/brain/index.js +36 -8
- package/dist/brain/index.js.map +1 -1
- package/dist/cli-ack-patch.d.ts +39 -0
- package/dist/cli-ack-patch.d.ts.map +1 -0
- package/dist/cli-ack-patch.js +47 -0
- package/dist/cli-ack-patch.js.map +1 -0
- package/dist/cli-design-audit.d.ts +12 -0
- package/dist/cli-design-audit.d.ts.map +1 -1
- package/dist/cli-design-audit.js +78 -0
- package/dist/cli-design-audit.js.map +1 -1
- package/dist/cli-jobs.d.ts +13 -0
- package/dist/cli-jobs.d.ts.map +1 -0
- package/dist/cli-jobs.js +253 -0
- package/dist/cli-jobs.js.map +1 -0
- package/dist/cli-patterns.d.ts +26 -0
- package/dist/cli-patterns.d.ts.map +1 -0
- package/dist/cli-patterns.js +49 -0
- package/dist/cli-patterns.js.map +1 -0
- package/dist/cli-reports.d.ts +12 -0
- package/dist/cli-reports.d.ts.map +1 -0
- package/dist/cli-reports.js +97 -0
- package/dist/cli-reports.js.map +1 -0
- package/dist/cli.js +29 -1
- package/dist/cli.js.map +1 -1
- package/dist/design/audit/attribution/aggregate.d.ts +16 -0
- package/dist/design/audit/attribution/aggregate.d.ts.map +1 -0
- package/dist/design/audit/attribution/aggregate.js +81 -0
- package/dist/design/audit/attribution/aggregate.js.map +1 -0
- package/dist/design/audit/attribution/store.d.ts +36 -0
- package/dist/design/audit/attribution/store.d.ts.map +1 -0
- package/dist/design/audit/attribution/store.js +108 -0
- package/dist/design/audit/attribution/store.js.map +1 -0
- package/dist/design/audit/attribution/types.d.ts +13 -0
- package/dist/design/audit/attribution/types.d.ts.map +1 -0
- package/dist/design/audit/attribution/types.js +10 -0
- package/dist/design/audit/attribution/types.js.map +1 -0
- package/dist/design/audit/build-result.d.ts +68 -0
- package/dist/design/audit/build-result.d.ts.map +1 -0
- package/dist/design/audit/build-result.js +243 -0
- package/dist/design/audit/build-result.js.map +1 -0
- package/dist/design/audit/classify-ensemble.d.ts +46 -0
- package/dist/design/audit/classify-ensemble.d.ts.map +1 -0
- package/dist/design/audit/classify-ensemble.js +207 -0
- package/dist/design/audit/classify-ensemble.js.map +1 -0
- package/dist/design/audit/ethics/check.d.ts +59 -0
- package/dist/design/audit/ethics/check.d.ts.map +1 -0
- package/dist/design/audit/ethics/check.js +137 -0
- package/dist/design/audit/ethics/check.js.map +1 -0
- package/dist/design/audit/ethics/loader.d.ts +21 -0
- package/dist/design/audit/ethics/loader.d.ts.map +1 -0
- package/dist/design/audit/ethics/loader.js +207 -0
- package/dist/design/audit/ethics/loader.js.map +1 -0
- package/dist/design/audit/ethics/rules/finance.yaml +37 -0
- package/dist/design/audit/ethics/rules/kids.yaml +37 -0
- package/dist/design/audit/ethics/rules/legal.yaml +35 -0
- package/dist/design/audit/ethics/rules/medical.yaml +36 -0
- package/dist/design/audit/evaluate.d.ts.map +1 -1
- package/dist/design/audit/evaluate.js +4 -1
- package/dist/design/audit/evaluate.js.map +1 -1
- package/dist/design/audit/first-principles-mode.d.ts +42 -0
- package/dist/design/audit/first-principles-mode.d.ts.map +1 -0
- package/dist/design/audit/first-principles-mode.js +77 -0
- package/dist/design/audit/first-principles-mode.js.map +1 -0
- package/dist/design/audit/modality/android.d.ts +14 -0
- package/dist/design/audit/modality/android.d.ts.map +1 -0
- package/dist/design/audit/modality/android.js +18 -0
- package/dist/design/audit/modality/android.js.map +1 -0
- package/dist/design/audit/modality/html.d.ts +22 -0
- package/dist/design/audit/modality/html.d.ts.map +1 -0
- package/dist/design/audit/modality/html.js +51 -0
- package/dist/design/audit/modality/html.js.map +1 -0
- package/dist/design/audit/modality/index.d.ts +8 -0
- package/dist/design/audit/modality/index.d.ts.map +1 -0
- package/dist/design/audit/modality/index.js +15 -0
- package/dist/design/audit/modality/index.js.map +1 -0
- package/dist/design/audit/modality/ios.d.ts +16 -0
- package/dist/design/audit/modality/ios.d.ts.map +1 -0
- package/dist/design/audit/modality/ios.js +19 -0
- package/dist/design/audit/modality/ios.js.map +1 -0
- package/dist/design/audit/modality/types.d.ts +9 -0
- package/dist/design/audit/modality/types.d.ts.map +1 -0
- package/dist/design/audit/modality/types.js +9 -0
- package/dist/design/audit/modality/types.js.map +1 -0
- package/dist/design/audit/patches/generate.d.ts +45 -0
- package/dist/design/audit/patches/generate.d.ts.map +1 -0
- package/dist/design/audit/patches/generate.js +161 -0
- package/dist/design/audit/patches/generate.js.map +1 -0
- package/dist/design/audit/patches/index.d.ts +8 -0
- package/dist/design/audit/patches/index.d.ts.map +1 -0
- package/dist/design/audit/patches/index.js +5 -0
- package/dist/design/audit/patches/index.js.map +1 -0
- package/dist/design/audit/patches/parse.d.ts +29 -0
- package/dist/design/audit/patches/parse.d.ts.map +1 -0
- package/dist/design/audit/patches/parse.js +153 -0
- package/dist/design/audit/patches/parse.js.map +1 -0
- package/dist/design/audit/patches/render.d.ts +20 -0
- package/dist/design/audit/patches/render.d.ts.map +1 -0
- package/dist/design/audit/patches/render.js +55 -0
- package/dist/design/audit/patches/render.js.map +1 -0
- package/dist/design/audit/patches/severity-enforcement.d.ts +23 -0
- package/dist/design/audit/patches/severity-enforcement.d.ts.map +1 -0
- package/dist/design/audit/patches/severity-enforcement.js +42 -0
- package/dist/design/audit/patches/severity-enforcement.js.map +1 -0
- package/dist/design/audit/patches/validate.d.ts +40 -0
- package/dist/design/audit/patches/validate.d.ts.map +1 -0
- package/dist/design/audit/patches/validate.js +60 -0
- package/dist/design/audit/patches/validate.js.map +1 -0
- package/dist/design/audit/patterns/match.d.ts +24 -0
- package/dist/design/audit/patterns/match.d.ts.map +1 -0
- package/dist/design/audit/patterns/match.js +48 -0
- package/dist/design/audit/patterns/match.js.map +1 -0
- package/dist/design/audit/patterns/mine.d.ts +31 -0
- package/dist/design/audit/patterns/mine.d.ts.map +1 -0
- package/dist/design/audit/patterns/mine.js +35 -0
- package/dist/design/audit/patterns/mine.js.map +1 -0
- package/dist/design/audit/patterns/store.d.ts +14 -0
- package/dist/design/audit/patterns/store.d.ts.map +1 -0
- package/dist/design/audit/patterns/store.js +53 -0
- package/dist/design/audit/patterns/store.js.map +1 -0
- package/dist/design/audit/patterns/types.d.ts +53 -0
- package/dist/design/audit/patterns/types.d.ts.map +1 -0
- package/dist/design/audit/patterns/types.js +13 -0
- package/dist/design/audit/patterns/types.js.map +1 -0
- package/dist/design/audit/pipeline.d.ts +12 -0
- package/dist/design/audit/pipeline.d.ts.map +1 -1
- package/dist/design/audit/pipeline.js +81 -5
- package/dist/design/audit/pipeline.js.map +1 -1
- package/dist/design/audit/rubric/anchor-loader.d.ts +44 -0
- package/dist/design/audit/rubric/anchor-loader.d.ts.map +1 -0
- package/dist/design/audit/rubric/anchor-loader.js +210 -0
- package/dist/design/audit/rubric/anchor-loader.js.map +1 -0
- package/dist/design/audit/rubric/anchors/blog.yaml +33 -0
- package/dist/design/audit/rubric/anchors/dashboard.yaml +35 -0
- package/dist/design/audit/rubric/anchors/docs.yaml +35 -0
- package/dist/design/audit/rubric/anchors/ecommerce.yaml +33 -0
- package/dist/design/audit/rubric/anchors/marketing.yaml +34 -0
- package/dist/design/audit/rubric/anchors/saas-app.yaml +38 -0
- package/dist/design/audit/rubric/anchors/social.yaml +33 -0
- package/dist/design/audit/rubric/anchors/tool.yaml +33 -0
- package/dist/design/audit/rubric/anchors/utility.yaml +33 -0
- package/dist/design/audit/rubric/fragments/audience-clinician.md +42 -0
- package/dist/design/audit/rubric/fragments/audience-developer.md +40 -0
- package/dist/design/audit/rubric/fragments/audience-kids.md +35 -0
- package/dist/design/audit/rubric/fragments/audience-vulnerability-minor-facing.md +37 -0
- package/dist/design/audit/rubric/fragments/first-principles.md +65 -0
- package/dist/design/audit/rubric/fragments/modality-mobile.md +39 -0
- package/dist/design/audit/rubric/fragments/modality-tablet.md +35 -0
- package/dist/design/audit/rubric/fragments/regulatory-coppa.md +32 -0
- package/dist/design/audit/rubric/fragments/regulatory-gdpr.md +33 -0
- package/dist/design/audit/rubric/fragments/regulatory-hipaa.md +36 -0
- package/dist/design/audit/rubric/loader.d.ts +26 -6
- package/dist/design/audit/rubric/loader.d.ts.map +1 -1
- package/dist/design/audit/rubric/loader.js +45 -26
- package/dist/design/audit/rubric/loader.js.map +1 -1
- package/dist/design/audit/rubric/rollup-weights.d.ts +25 -0
- package/dist/design/audit/rubric/rollup-weights.d.ts.map +1 -0
- package/dist/design/audit/rubric/rollup-weights.js +51 -0
- package/dist/design/audit/rubric/rollup-weights.js.map +1 -0
- package/dist/design/audit/score-types.d.ts +431 -0
- package/dist/design/audit/score-types.d.ts.map +1 -0
- package/dist/design/audit/score-types.js +26 -0
- package/dist/design/audit/score-types.js.map +1 -0
- package/dist/design/audit/score.d.ts +49 -0
- package/dist/design/audit/score.d.ts.map +1 -0
- package/dist/design/audit/score.js +211 -0
- package/dist/design/audit/score.js.map +1 -0
- package/dist/design/audit/types.d.ts +28 -0
- package/dist/design/audit/types.d.ts.map +1 -1
- package/dist/discover/index.d.ts +16 -0
- package/dist/discover/index.d.ts.map +1 -0
- package/dist/discover/index.js +25 -0
- package/dist/discover/index.js.map +1 -0
- package/dist/discover/wayback.d.ts +49 -0
- package/dist/discover/wayback.d.ts.map +1 -0
- package/dist/discover/wayback.js +123 -0
- package/dist/discover/wayback.js.map +1 -0
- package/dist/jobs/anti-bot.d.ts +19 -0
- package/dist/jobs/anti-bot.d.ts.map +1 -0
- package/dist/jobs/anti-bot.js +64 -0
- package/dist/jobs/anti-bot.js.map +1 -0
- package/dist/jobs/cost-estimate.d.ts +12 -0
- package/dist/jobs/cost-estimate.d.ts.map +1 -0
- package/dist/jobs/cost-estimate.js +21 -0
- package/dist/jobs/cost-estimate.js.map +1 -0
- package/dist/jobs/cost-history.d.ts +19 -0
- package/dist/jobs/cost-history.d.ts.map +1 -0
- package/dist/jobs/cost-history.js +42 -0
- package/dist/jobs/cost-history.js.map +1 -0
- package/dist/jobs/index.d.ts +31 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +37 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/orchestrator.d.ts +42 -0
- package/dist/jobs/orchestrator.d.ts.map +1 -0
- package/dist/jobs/orchestrator.js +282 -0
- package/dist/jobs/orchestrator.js.map +1 -0
- package/dist/jobs/queue.d.ts +45 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +114 -0
- package/dist/jobs/queue.js.map +1 -0
- package/dist/jobs/retry.d.ts +36 -0
- package/dist/jobs/retry.d.ts.map +1 -0
- package/dist/jobs/retry.js +77 -0
- package/dist/jobs/retry.js.map +1 -0
- package/dist/jobs/store.d.ts +31 -0
- package/dist/jobs/store.d.ts.map +1 -0
- package/dist/jobs/store.js +92 -0
- package/dist/jobs/store.js.map +1 -0
- package/dist/jobs/types.d.ts +106 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +13 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/reports/aggregate.d.ts +38 -0
- package/dist/reports/aggregate.d.ts.map +1 -0
- package/dist/reports/aggregate.js +145 -0
- package/dist/reports/aggregate.js.map +1 -0
- package/dist/reports/index.d.ts +21 -0
- package/dist/reports/index.d.ts.map +1 -0
- package/dist/reports/index.js +15 -0
- package/dist/reports/index.js.map +1 -0
- package/dist/reports/narrate.d.ts +19 -0
- package/dist/reports/narrate.d.ts.map +1 -0
- package/dist/reports/narrate.js +40 -0
- package/dist/reports/narrate.js.map +1 -0
- package/dist/reports/templates.d.ts +43 -0
- package/dist/reports/templates.d.ts.map +1 -0
- package/dist/reports/templates.js +200 -0
- package/dist/reports/templates.js.map +1 -0
- package/dist/reports/tokens.d.ts +69 -0
- package/dist/reports/tokens.d.ts.map +1 -0
- package/dist/reports/tokens.js +74 -0
- package/dist/reports/tokens.js.map +1 -0
- package/dist/reports/tools.d.ts +76 -0
- package/dist/reports/tools.d.ts.map +1 -0
- package/dist/reports/tools.js +205 -0
- package/dist/reports/tools.js.map +1 -0
- package/dist/reports/types.d.ts +51 -0
- package/dist/reports/types.d.ts.map +1 -0
- package/dist/reports/types.js +9 -0
- package/dist/reports/types.js.map +1 -0
- package/dist/run-state.d.ts +36 -1
- package/dist/run-state.d.ts.map +1 -1
- package/dist/run-state.js +36 -1
- package/dist/run-state.js.map +1 -1
- package/dist/runner/runner.d.ts.map +1 -1
- package/dist/runner/runner.js +73 -3
- package/dist/runner/runner.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AuditResult builder.
|
|
3
|
+
*
|
|
4
|
+
* Composes the per-dimension scores, ensemble classification, and rollup
|
|
5
|
+
* into the canonical `AuditResult` that downstream consumers (jobs, reports,
|
|
6
|
+
* brand-evolution, orchestrator) read.
|
|
7
|
+
*/
|
|
8
|
+
import type { Brain } from '../../brain/index.js';
|
|
9
|
+
import type { PageState } from '../../types.js';
|
|
10
|
+
import type { PageAuditResult, ComposedRubric, MeasurementBundle } from './types.js';
|
|
11
|
+
import { type AuditResult, type DesignFinding, type Dimension, type DimensionScore, type EnsembleClassification } from './score-types.js';
|
|
12
|
+
import { renderAnchor, type CalibrationAnchor } from './rubric/anchor-loader.js';
|
|
13
|
+
export interface BuildAuditResultInput {
|
|
14
|
+
brain: Brain;
|
|
15
|
+
state: PageState;
|
|
16
|
+
pageRef: string;
|
|
17
|
+
ensemble: EnsembleClassification;
|
|
18
|
+
rubric: ComposedRubric;
|
|
19
|
+
measurements: MeasurementBundle;
|
|
20
|
+
v1Result: PageAuditResult;
|
|
21
|
+
anchor?: CalibrationAnchor;
|
|
22
|
+
/** Reuse the pipeline runId so envelopes correlate. */
|
|
23
|
+
runId?: string;
|
|
24
|
+
/** Optional override (e.g. test fixtures). When set, skip the LLM call. */
|
|
25
|
+
precomputedScores?: Record<Dimension, DimensionScore>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Produce a complete `AuditResult`. When `precomputedScores` is set we
|
|
29
|
+
* skip the LLM call entirely (used by deterministic tests + the
|
|
30
|
+
* `--audit-passes auto` legacy fallback path).
|
|
31
|
+
*/
|
|
32
|
+
export declare function buildAuditResult(input: BuildAuditResultInput): Promise<AuditResult>;
|
|
33
|
+
declare function renderMeasurementSummary(measurements: MeasurementBundle): string;
|
|
34
|
+
/**
|
|
35
|
+
* Stamp stable ids + dimension + kind onto v1 findings. Patches are parsed
|
|
36
|
+
* separately by parseAndAttachPatches so the patch generator (which runs
|
|
37
|
+
* between adaptFindingsLite and parseAndAttachPatches) can populate
|
|
38
|
+
* `rawPatches` first.
|
|
39
|
+
*/
|
|
40
|
+
declare function adaptFindingsLite(v1Findings: PageAuditResult['findings']): DesignFinding[];
|
|
41
|
+
/**
|
|
42
|
+
* After the patch generator has run, parse each finding's `rawPatches` array
|
|
43
|
+
* into typed Patch objects. The findingId on each parsed patch is overridden
|
|
44
|
+
* with the finding's stable id so it always points at the right place — even
|
|
45
|
+
* if the LLM emitted its own placeholder.
|
|
46
|
+
*/
|
|
47
|
+
declare function parseAndAttachPatches(findings: DesignFinding[]): DesignFinding[];
|
|
48
|
+
/**
|
|
49
|
+
* Layer 2 enforcement — validate every patch against the page snapshot
|
|
50
|
+
* (drops patches whose `diff.before` isn't actually present), then run the
|
|
51
|
+
* severity policy: major/critical findings without ≥1 valid patch downgrade
|
|
52
|
+
* to minor.
|
|
53
|
+
*/
|
|
54
|
+
declare function enforceFindingPolicy(findings: DesignFinding[], snapshot: string): DesignFinding[];
|
|
55
|
+
declare function mapCategoryToDimension(category: string): Dimension;
|
|
56
|
+
declare function computeTopFixes(findings: DesignFinding[]): DesignFinding[];
|
|
57
|
+
declare function synthesizeScoresFromLegacy(v1: PageAuditResult): Record<Dimension, DimensionScore>;
|
|
58
|
+
export declare const BUILD_RESULT_INTERNALS: {
|
|
59
|
+
renderMeasurementSummary: typeof renderMeasurementSummary;
|
|
60
|
+
adaptFindingsLite: typeof adaptFindingsLite;
|
|
61
|
+
parseAndAttachPatches: typeof parseAndAttachPatches;
|
|
62
|
+
enforceFindingPolicy: typeof enforceFindingPolicy;
|
|
63
|
+
mapCategoryToDimension: typeof mapCategoryToDimension;
|
|
64
|
+
computeTopFixes: typeof computeTopFixes;
|
|
65
|
+
synthesizeScoresFromLegacy: typeof synthesizeScoresFromLegacy;
|
|
66
|
+
};
|
|
67
|
+
export { renderAnchor };
|
|
68
|
+
//# sourceMappingURL=build-result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-result.d.ts","sourceRoot":"","sources":["../../../src/design/audit/build-result.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EACV,eAAe,EAEf,cAAc,EACd,iBAAiB,EAClB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAG5B,MAAM,kBAAkB,CAAA;AAMzB,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAMhF,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,SAAS,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,sBAAsB,CAAA;IAChC,MAAM,EAAE,cAAc,CAAA;IACtB,YAAY,EAAE,iBAAiB,CAAA;IAC/B,QAAQ,EAAE,eAAe,CAAA;IACzB,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;CACtD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAiFzF;AAED,iBAAS,wBAAwB,CAAC,YAAY,EAAE,iBAAiB,GAAG,MAAM,CAOzE;AAED;;;;;GAKG;AACH,iBAAS,iBAAiB,CAAC,UAAU,EAAE,eAAe,CAAC,UAAU,CAAC,GAAG,aAAa,EAAE,CAanF;AAED;;;;;GAKG;AACH,iBAAS,qBAAqB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAOzE;AAaD;;;;;GAKG;AACH,iBAAS,oBAAoB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAa1F;AAED,iBAAS,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAe3D;AAQD,iBAAS,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAMnE;AAWD,iBAAS,0BAA0B,CAAC,EAAE,EAAE,eAAe,GAAG,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAgB1F;AAMD,eAAO,MAAM,sBAAsB;;;;;;;;CAQlC,CAAA;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AuditResult builder.
|
|
3
|
+
*
|
|
4
|
+
* Composes the per-dimension scores, ensemble classification, and rollup
|
|
5
|
+
* into the canonical `AuditResult` that downstream consumers (jobs, reports,
|
|
6
|
+
* brand-evolution, orchestrator) read.
|
|
7
|
+
*/
|
|
8
|
+
import { randomUUID, createHash } from 'node:crypto';
|
|
9
|
+
import { DIMENSIONS, } from './score-types.js';
|
|
10
|
+
import { buildEvalPrompt, computeRollup, parseAuditResponse, } from './score.js';
|
|
11
|
+
import { renderAnchor } from './rubric/anchor-loader.js';
|
|
12
|
+
import { parsePatches } from './patches/parse.js';
|
|
13
|
+
import { validatePatch } from './patches/validate.js';
|
|
14
|
+
import { enforcePatchPolicy } from './patches/severity-enforcement.js';
|
|
15
|
+
import { generatePatches } from './patches/generate.js';
|
|
16
|
+
/**
|
|
17
|
+
* Produce a complete `AuditResult`. When `precomputedScores` is set we
|
|
18
|
+
* skip the LLM call entirely (used by deterministic tests + the
|
|
19
|
+
* `--audit-passes auto` legacy fallback path).
|
|
20
|
+
*/
|
|
21
|
+
export async function buildAuditResult(input) {
|
|
22
|
+
const { brain, state, pageRef, ensemble, rubric, measurements, v1Result, anchor, runId } = input;
|
|
23
|
+
const measurementSummary = renderMeasurementSummary(measurements);
|
|
24
|
+
const prompt = buildEvalPrompt({
|
|
25
|
+
pageType: ensemble.type,
|
|
26
|
+
rubricBody: rubric.body,
|
|
27
|
+
anchor,
|
|
28
|
+
measurementSummary,
|
|
29
|
+
intent: ensemble.intent,
|
|
30
|
+
});
|
|
31
|
+
let scores;
|
|
32
|
+
let llmTokens = 0;
|
|
33
|
+
if (input.precomputedScores) {
|
|
34
|
+
scores = input.precomputedScores;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
try {
|
|
38
|
+
const llm = await brain.auditDesign(state, 'Multi-dimensional audit', [], prompt);
|
|
39
|
+
llmTokens = llm.tokensUsed ?? 0;
|
|
40
|
+
const parsed = parseAuditResponse(llm.raw);
|
|
41
|
+
scores = parsed.scores;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Fall back: synthesize per-dim scores from the v1 result. Conservative —
|
|
45
|
+
// every dim gets the v1 score, range +/- 1, confidence 'low'.
|
|
46
|
+
scores = synthesizeScoresFromLegacy(v1Result);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const rollup = computeRollup(scores, ensemble.type);
|
|
50
|
+
// Layer 2 — two-call patch flow. The findings prompt above stayed slim
|
|
51
|
+
// and focused on scoring; now ask the LLM for one patch per major/critical
|
|
52
|
+
// finding (skipped when precomputedScores is set, since tests can supply
|
|
53
|
+
// findings with rawPatches already attached).
|
|
54
|
+
let findings = adaptFindingsLite(v1Result.findings);
|
|
55
|
+
if (!input.precomputedScores) {
|
|
56
|
+
try {
|
|
57
|
+
const generated = await generatePatches({
|
|
58
|
+
brain,
|
|
59
|
+
snapshot: state.snapshot,
|
|
60
|
+
findings: findings,
|
|
61
|
+
});
|
|
62
|
+
findings = generated.findings;
|
|
63
|
+
llmTokens += generated.tokensUsed;
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
// Patch generator failure is non-fatal — Layer 2 enforcement below will
|
|
67
|
+
// still downgrade major/critical findings that lack a valid patch.
|
|
68
|
+
console.warn(`[audit/patches] generator failed: ${err.message}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Now parse rawPatches → typed Patches, validate against the snapshot,
|
|
72
|
+
// and enforce the severity policy (downgrade major/critical without a
|
|
73
|
+
// valid patch). adaptFindingsLite wires the parser; enforceFindingPolicy
|
|
74
|
+
// wires the validator + downgrade rule.
|
|
75
|
+
findings = parseAndAttachPatches(findings);
|
|
76
|
+
findings = enforceFindingPolicy(findings, state.snapshot);
|
|
77
|
+
const topFixes = computeTopFixes(findings).slice(0, 5).map((f) => f.id);
|
|
78
|
+
const promptHash = sha1(prompt);
|
|
79
|
+
const rubricHash = sha1(rubric.body);
|
|
80
|
+
const totalTokens = (v1Result.tokensUsed ?? 0) + llmTokens;
|
|
81
|
+
return {
|
|
82
|
+
runId: runId ?? randomUUID(),
|
|
83
|
+
pageRef,
|
|
84
|
+
classification: ensemble,
|
|
85
|
+
scores,
|
|
86
|
+
rollup,
|
|
87
|
+
findings,
|
|
88
|
+
topFixes,
|
|
89
|
+
measurements,
|
|
90
|
+
ethicsViolations: [],
|
|
91
|
+
matchedPatterns: [],
|
|
92
|
+
modality: 'html',
|
|
93
|
+
evaluatedAt: new Date().toISOString(),
|
|
94
|
+
promptHash,
|
|
95
|
+
rubricHash,
|
|
96
|
+
tokensUsed: totalTokens > 0 ? totalTokens : undefined,
|
|
97
|
+
passes: ['multidim'],
|
|
98
|
+
...(v1Result.error ? { error: v1Result.error } : {}),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function renderMeasurementSummary(measurements) {
|
|
102
|
+
const aaFails = measurements.contrast.aaFailures.length;
|
|
103
|
+
const a11y = measurements.a11y.violations.length;
|
|
104
|
+
return [
|
|
105
|
+
`contrast AA failures: ${aaFails} of ${measurements.contrast.totalChecked} text elements`,
|
|
106
|
+
`axe violations: ${a11y}${a11y > 0 ? ` (top: ${measurements.a11y.violations.slice(0, 3).map((v) => `${v.id}/${v.impact}`).join(', ')})` : ''}`,
|
|
107
|
+
].join('\n');
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Stamp stable ids + dimension + kind onto v1 findings. Patches are parsed
|
|
111
|
+
* separately by parseAndAttachPatches so the patch generator (which runs
|
|
112
|
+
* between adaptFindingsLite and parseAndAttachPatches) can populate
|
|
113
|
+
* `rawPatches` first.
|
|
114
|
+
*/
|
|
115
|
+
function adaptFindingsLite(v1Findings) {
|
|
116
|
+
return v1Findings.map((f, idx) => {
|
|
117
|
+
const id = `finding-${idx + 1}-${sha1(`${f.category}|${f.description}`).slice(0, 8)}`;
|
|
118
|
+
const dimension = mapCategoryToDimension(f.category);
|
|
119
|
+
const kind = inferKind(f);
|
|
120
|
+
return {
|
|
121
|
+
...f,
|
|
122
|
+
id,
|
|
123
|
+
dimension,
|
|
124
|
+
kind,
|
|
125
|
+
patches: [],
|
|
126
|
+
};
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* After the patch generator has run, parse each finding's `rawPatches` array
|
|
131
|
+
* into typed Patch objects. The findingId on each parsed patch is overridden
|
|
132
|
+
* with the finding's stable id so it always points at the right place — even
|
|
133
|
+
* if the LLM emitted its own placeholder.
|
|
134
|
+
*/
|
|
135
|
+
function parseAndAttachPatches(findings) {
|
|
136
|
+
return findings.map(f => {
|
|
137
|
+
const rawPatches = (f.rawPatches ?? []);
|
|
138
|
+
if (rawPatches.length === 0)
|
|
139
|
+
return f;
|
|
140
|
+
const parsed = parsePatches(rawPatches.map(p => withFindingId(p, f.id)));
|
|
141
|
+
return { ...f, patches: parsed.patches };
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Inject `findingId` into a raw patch object before parsing, so the finding's
|
|
146
|
+
* stable id always wins over whatever placeholder the LLM emitted.
|
|
147
|
+
*/
|
|
148
|
+
function withFindingId(raw, findingId) {
|
|
149
|
+
if (raw && typeof raw === 'object') {
|
|
150
|
+
return { ...raw, findingId };
|
|
151
|
+
}
|
|
152
|
+
return raw;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Layer 2 enforcement — validate every patch against the page snapshot
|
|
156
|
+
* (drops patches whose `diff.before` isn't actually present), then run the
|
|
157
|
+
* severity policy: major/critical findings without ≥1 valid patch downgrade
|
|
158
|
+
* to minor.
|
|
159
|
+
*/
|
|
160
|
+
function enforceFindingPolicy(findings, snapshot) {
|
|
161
|
+
// Step 1: per-finding patch validation — keep only valid patches.
|
|
162
|
+
const validated = findings.map(f => {
|
|
163
|
+
const validPatches = (f.patches ?? []).filter(p => validatePatch(p, snapshot).valid);
|
|
164
|
+
return { ...f, patches: validPatches };
|
|
165
|
+
});
|
|
166
|
+
// Step 2: severity downgrade — collect valid patch ids and let the policy
|
|
167
|
+
// decide which findings keep their declared severity.
|
|
168
|
+
const validPatchIds = new Set();
|
|
169
|
+
for (const f of validated) {
|
|
170
|
+
for (const p of f.patches ?? [])
|
|
171
|
+
validPatchIds.add(p.patchId);
|
|
172
|
+
}
|
|
173
|
+
return enforcePatchPolicy(validated, validPatchIds).findings;
|
|
174
|
+
}
|
|
175
|
+
function mapCategoryToDimension(category) {
|
|
176
|
+
switch (category) {
|
|
177
|
+
case 'visual-bug':
|
|
178
|
+
case 'spacing':
|
|
179
|
+
case 'typography':
|
|
180
|
+
case 'alignment':
|
|
181
|
+
case 'layout':
|
|
182
|
+
return 'visual_craft';
|
|
183
|
+
case 'contrast':
|
|
184
|
+
case 'accessibility':
|
|
185
|
+
return 'visual_craft';
|
|
186
|
+
case 'ux':
|
|
187
|
+
default:
|
|
188
|
+
return 'product_intent';
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function inferKind(f) {
|
|
192
|
+
if (f.category === 'contrast' || f.category === 'accessibility')
|
|
193
|
+
return 'measurement';
|
|
194
|
+
if (f.category === 'ux')
|
|
195
|
+
return 'job';
|
|
196
|
+
return 'polish';
|
|
197
|
+
}
|
|
198
|
+
function computeTopFixes(findings) {
|
|
199
|
+
return [...findings].sort((a, b) => {
|
|
200
|
+
const aScore = (a.impact ?? 0) * blastWeight(a.blast);
|
|
201
|
+
const bScore = (b.impact ?? 0) * blastWeight(b.blast);
|
|
202
|
+
return bScore - aScore;
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
function blastWeight(blast) {
|
|
206
|
+
switch (blast) {
|
|
207
|
+
case 'system': return 4;
|
|
208
|
+
case 'component': return 3;
|
|
209
|
+
case 'section': return 2;
|
|
210
|
+
default: return 1;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function synthesizeScoresFromLegacy(v1) {
|
|
214
|
+
const fallback = Math.max(1, Math.min(10, Math.round(v1.score)));
|
|
215
|
+
const out = {};
|
|
216
|
+
for (const dim of DIMENSIONS) {
|
|
217
|
+
out[dim] = {
|
|
218
|
+
score: fallback,
|
|
219
|
+
range: [
|
|
220
|
+
Math.max(1, fallback - 1),
|
|
221
|
+
Math.min(10, fallback + 1),
|
|
222
|
+
],
|
|
223
|
+
confidence: 'low',
|
|
224
|
+
summary: 'Synthesized from v1 score (LLM call unavailable).',
|
|
225
|
+
primaryFindings: [],
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
return out;
|
|
229
|
+
}
|
|
230
|
+
function sha1(s) {
|
|
231
|
+
return createHash('sha1').update(s).digest('hex');
|
|
232
|
+
}
|
|
233
|
+
export const BUILD_RESULT_INTERNALS = {
|
|
234
|
+
renderMeasurementSummary,
|
|
235
|
+
adaptFindingsLite,
|
|
236
|
+
parseAndAttachPatches,
|
|
237
|
+
enforceFindingPolicy,
|
|
238
|
+
mapCategoryToDimension,
|
|
239
|
+
computeTopFixes,
|
|
240
|
+
synthesizeScoresFromLegacy,
|
|
241
|
+
};
|
|
242
|
+
export { renderAnchor };
|
|
243
|
+
//# sourceMappingURL=build-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-result.js","sourceRoot":"","sources":["../../../src/design/audit/build-result.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensemble classifier — Layer 1 of the world-class design-audit architecture.
|
|
3
|
+
*
|
|
4
|
+
* Three-signal vote (URL pattern + DOM heuristic + LLM) decides the page type
|
|
5
|
+
* and reports an ensemble confidence so downstream layers (first-principles
|
|
6
|
+
* fallback, rubric loader, telemetry) can act on uncertainty honestly.
|
|
7
|
+
*
|
|
8
|
+
* Vote logic:
|
|
9
|
+
* - URL + DOM agree on a type AND combined confidence > 0.7 → accept (skip LLM)
|
|
10
|
+
* - else → run LLM, take majority
|
|
11
|
+
* - if LLM confidence < 0.5 AND signals disagree → return 'unknown' with dissent
|
|
12
|
+
*/
|
|
13
|
+
import type { Brain } from '../../brain/index.js';
|
|
14
|
+
import type { PageState } from '../../types.js';
|
|
15
|
+
import type { PageType } from './types.js';
|
|
16
|
+
import type { ClassifierSignal, DomHeuristics, EnsembleClassification } from './score-types.js';
|
|
17
|
+
interface UrlPatternRule {
|
|
18
|
+
pattern: RegExp;
|
|
19
|
+
type: PageType;
|
|
20
|
+
confidence: number;
|
|
21
|
+
rationale: string;
|
|
22
|
+
}
|
|
23
|
+
export interface EnsembleClassifyInput {
|
|
24
|
+
brain: Brain;
|
|
25
|
+
state: PageState;
|
|
26
|
+
url: string;
|
|
27
|
+
/** Optional pre-captured DOM heuristics. If absent, we attempt to derive them from the snapshot. */
|
|
28
|
+
domHeuristics?: DomHeuristics;
|
|
29
|
+
}
|
|
30
|
+
/** Public entry point. */
|
|
31
|
+
export declare function classifyEnsemble(input: EnsembleClassifyInput): Promise<EnsembleClassification>;
|
|
32
|
+
export declare function classifyByUrl(url: string): ClassifierSignal | null;
|
|
33
|
+
export declare function classifyByDom(dom: DomHeuristics): ClassifierSignal | null;
|
|
34
|
+
/**
|
|
35
|
+
* Best-effort DOM heuristic derivation from the accessibility-tree snapshot.
|
|
36
|
+
* Pipelines that capture true DOM heuristics via Playwright should pass them
|
|
37
|
+
* in directly; this fallback works against the @ref-snapshot text.
|
|
38
|
+
*/
|
|
39
|
+
export declare function deriveHeuristics(state: PageState): DomHeuristics;
|
|
40
|
+
export declare const ENSEMBLE_INTERNALS: {
|
|
41
|
+
URL_PATTERN_RULES: UrlPatternRule[];
|
|
42
|
+
ENSEMBLE_AGREEMENT_THRESHOLD: number;
|
|
43
|
+
LLM_FALLBACK_CONFIDENCE: number;
|
|
44
|
+
};
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=classify-ensemble.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify-ensemble.d.ts","sourceRoot":"","sources":["../../../src/design/audit/classify-ensemble.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,KAAK,EAAsB,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,KAAK,EACV,gBAAgB,EAEhB,aAAa,EACb,sBAAsB,EACvB,MAAM,kBAAkB,CAAA;AAEzB,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,QAAQ,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAoBD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,SAAS,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,oGAAoG;IACpG,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B;AAED,0BAA0B;AAC1B,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAgFpG;AA8BD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAkBlE;AAID,wBAAgB,aAAa,CAAC,GAAG,EAAE,aAAa,GAAG,gBAAgB,GAAG,IAAI,CA8BzE;AAQD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,aAAa,CAchE;AAYD,eAAO,MAAM,kBAAkB;;;;CAI9B,CAAA"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensemble classifier — Layer 1 of the world-class design-audit architecture.
|
|
3
|
+
*
|
|
4
|
+
* Three-signal vote (URL pattern + DOM heuristic + LLM) decides the page type
|
|
5
|
+
* and reports an ensemble confidence so downstream layers (first-principles
|
|
6
|
+
* fallback, rubric loader, telemetry) can act on uncertainty honestly.
|
|
7
|
+
*
|
|
8
|
+
* Vote logic:
|
|
9
|
+
* - URL + DOM agree on a type AND combined confidence > 0.7 → accept (skip LLM)
|
|
10
|
+
* - else → run LLM, take majority
|
|
11
|
+
* - if LLM confidence < 0.5 AND signals disagree → return 'unknown' with dissent
|
|
12
|
+
*/
|
|
13
|
+
import { classifyPage, defaultClassification } from './classify.js';
|
|
14
|
+
/**
|
|
15
|
+
* URL pattern rules — straight from the RFC. Order matters: more specific
|
|
16
|
+
* patterns first. Each rule's confidence is the URL signal's contribution to
|
|
17
|
+
* the ensemble vote.
|
|
18
|
+
*/
|
|
19
|
+
const URL_PATTERN_RULES = [
|
|
20
|
+
{ pattern: /\/(docs|reference|api|guide|help|faq)(\/|$)/, type: 'docs', confidence: 0.85, rationale: 'URL contains a docs path segment' },
|
|
21
|
+
{ pattern: /\/(checkout|cart|pay|order|billing)(\/|$)/, type: 'ecommerce', confidence: 0.85, rationale: 'URL contains a commerce path segment' },
|
|
22
|
+
{ pattern: /\/(app|dashboard|workspace|admin)(\/|$)/, type: 'saas-app', confidence: 0.75, rationale: 'URL contains an app/dashboard path segment' },
|
|
23
|
+
{ pattern: /\/(login|signup|auth|sign-in)(\/|$)/, type: 'utility', confidence: 0.85, rationale: 'URL contains an auth path segment' },
|
|
24
|
+
{ pattern: /\/(pricing|plans|features|product)(\/|$)/, type: 'marketing', confidence: 0.7, rationale: 'URL contains a marketing path segment' },
|
|
25
|
+
{ pattern: /\/(blog|articles|news|stories)(\/|$)/, type: 'blog', confidence: 0.8, rationale: 'URL contains a blog path segment' },
|
|
26
|
+
{ pattern: /\/$/, type: 'marketing', confidence: 0.4, rationale: 'URL is a root path — weak marketing default' },
|
|
27
|
+
];
|
|
28
|
+
const ENSEMBLE_AGREEMENT_THRESHOLD = 0.7;
|
|
29
|
+
const LLM_FALLBACK_CONFIDENCE = 0.5;
|
|
30
|
+
/** Public entry point. */
|
|
31
|
+
export async function classifyEnsemble(input) {
|
|
32
|
+
const signals = [];
|
|
33
|
+
// ── 1. URL pattern signal ──
|
|
34
|
+
const urlSignal = classifyByUrl(input.url);
|
|
35
|
+
if (urlSignal)
|
|
36
|
+
signals.push(urlSignal);
|
|
37
|
+
// ── 2. DOM heuristic signal ──
|
|
38
|
+
const dom = input.domHeuristics ?? deriveHeuristics(input.state);
|
|
39
|
+
const domSignal = classifyByDom(dom);
|
|
40
|
+
if (domSignal)
|
|
41
|
+
signals.push(domSignal);
|
|
42
|
+
// ── Quick path: URL + DOM agree with combined confidence > threshold ──
|
|
43
|
+
if (urlSignal &&
|
|
44
|
+
domSignal &&
|
|
45
|
+
urlSignal.type === domSignal.type &&
|
|
46
|
+
urlSignal.confidence + domSignal.confidence > ENSEMBLE_AGREEMENT_THRESHOLD) {
|
|
47
|
+
const ensembleConfidence = clamp01(Math.min(1, (urlSignal.confidence + domSignal.confidence) / 1.6));
|
|
48
|
+
return finalize({
|
|
49
|
+
type: urlSignal.type,
|
|
50
|
+
base: defaultClassification(),
|
|
51
|
+
signals,
|
|
52
|
+
ensembleConfidence,
|
|
53
|
+
signalsAgreed: true,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
// ── 3. LLM tiebreaker ──
|
|
57
|
+
const llmClass = await classifyPage(input.brain, input.state).catch(() => defaultClassification());
|
|
58
|
+
signals.push({
|
|
59
|
+
source: 'llm',
|
|
60
|
+
type: llmClass.type,
|
|
61
|
+
confidence: llmClass.confidence,
|
|
62
|
+
rationale: llmClass.intent || 'LLM page classification',
|
|
63
|
+
});
|
|
64
|
+
// ── Vote ──
|
|
65
|
+
const tally = new Map();
|
|
66
|
+
for (const sig of signals) {
|
|
67
|
+
tally.set(sig.type, (tally.get(sig.type) ?? 0) + sig.confidence);
|
|
68
|
+
}
|
|
69
|
+
const sortedVotes = [...tally.entries()].sort((a, b) => b[1] - a[1]);
|
|
70
|
+
const winner = sortedVotes[0];
|
|
71
|
+
const winningType = winner ? winner[0] : 'unknown';
|
|
72
|
+
const winningTotal = winner ? winner[1] : 0;
|
|
73
|
+
// Compute aggregate confidence: average over participating signals, weighted by agreement.
|
|
74
|
+
const winningSignals = signals.filter((s) => s.type === winningType);
|
|
75
|
+
const agreementShare = winningSignals.length / signals.length;
|
|
76
|
+
const meanConfidence = winningSignals.reduce((acc, s) => acc + s.confidence, 0) / Math.max(winningSignals.length, 1);
|
|
77
|
+
const ensembleConfidence = clamp01(meanConfidence * agreementShare + 0.05 * (winningTotal - meanConfidence));
|
|
78
|
+
const signalsAgreed = signals.every((s) => s.type === winningType);
|
|
79
|
+
const dissent = signals.filter((s) => s.type !== winningType).map((s) => ({ source: s.source, type: s.type }));
|
|
80
|
+
// ── Low-confidence + disagreement → 'unknown' with dissent ──
|
|
81
|
+
if (!signalsAgreed && llmClass.confidence < LLM_FALLBACK_CONFIDENCE) {
|
|
82
|
+
return finalize({
|
|
83
|
+
type: 'unknown',
|
|
84
|
+
base: llmClass,
|
|
85
|
+
signals,
|
|
86
|
+
ensembleConfidence: Math.min(ensembleConfidence, 0.5),
|
|
87
|
+
signalsAgreed: false,
|
|
88
|
+
dissent,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return finalize({
|
|
92
|
+
type: winningType,
|
|
93
|
+
base: llmClass,
|
|
94
|
+
signals,
|
|
95
|
+
ensembleConfidence,
|
|
96
|
+
signalsAgreed,
|
|
97
|
+
dissent: signalsAgreed ? undefined : dissent,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function finalize(args) {
|
|
101
|
+
const { type, base, signals, ensembleConfidence, signalsAgreed } = args;
|
|
102
|
+
const firstPrinciplesMode = !signalsAgreed || ensembleConfidence < 0.6;
|
|
103
|
+
const out = {
|
|
104
|
+
...base,
|
|
105
|
+
type,
|
|
106
|
+
confidence: ensembleConfidence,
|
|
107
|
+
signals,
|
|
108
|
+
signalsAgreed,
|
|
109
|
+
ensembleConfidence,
|
|
110
|
+
firstPrinciplesMode,
|
|
111
|
+
};
|
|
112
|
+
if (args.dissent && args.dissent.length > 0)
|
|
113
|
+
out.dissent = args.dissent;
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
// ── URL-pattern classifier ──────────────────────────────────────────────────
|
|
117
|
+
export function classifyByUrl(url) {
|
|
118
|
+
let pathname;
|
|
119
|
+
try {
|
|
120
|
+
pathname = new URL(url).pathname || '/';
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
for (const rule of URL_PATTERN_RULES) {
|
|
126
|
+
if (rule.pattern.test(pathname)) {
|
|
127
|
+
return {
|
|
128
|
+
source: 'url-pattern',
|
|
129
|
+
type: rule.type,
|
|
130
|
+
confidence: rule.confidence,
|
|
131
|
+
rationale: `${rule.rationale} (${pathname})`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
// ── DOM-heuristic classifier ────────────────────────────────────────────────
|
|
138
|
+
export function classifyByDom(dom) {
|
|
139
|
+
// docs: lots of paragraphs + code blocks, modest nav
|
|
140
|
+
if (dom.codeBlockCount >= 3 && dom.paragraphCount >= 6) {
|
|
141
|
+
return signal('dom-heuristic', 'docs', 0.7, `code blocks=${dom.codeBlockCount}, paragraphs=${dom.paragraphCount}`);
|
|
142
|
+
}
|
|
143
|
+
// dashboard: many table rows or charts + sidebar
|
|
144
|
+
if ((dom.tableRowCount >= 8 || dom.chartCount >= 2) && dom.hasSidebar) {
|
|
145
|
+
return signal('dom-heuristic', 'dashboard', 0.7, `rows=${dom.tableRowCount}, charts=${dom.chartCount}, sidebar=true`);
|
|
146
|
+
}
|
|
147
|
+
// saas-app: sidebar + multiple forms or many inputs
|
|
148
|
+
if (dom.hasSidebar && (dom.formCount >= 1 || dom.inputCount >= 4)) {
|
|
149
|
+
return signal('dom-heuristic', 'saas-app', 0.65, `sidebar=true, forms=${dom.formCount}, inputs=${dom.inputCount}`);
|
|
150
|
+
}
|
|
151
|
+
// utility: single dominant form, no hero, no sidebar
|
|
152
|
+
if (dom.formCount >= 1 && dom.inputCount >= 2 && !dom.hasHeroSection && !dom.hasSidebar) {
|
|
153
|
+
return signal('dom-heuristic', 'utility', 0.7, `single form, no hero, no sidebar`);
|
|
154
|
+
}
|
|
155
|
+
// ecommerce: forms + many nav items + footer links (storefront chrome)
|
|
156
|
+
if (dom.formCount >= 1 && dom.navItems >= 6 && dom.hasFooterLinks) {
|
|
157
|
+
return signal('dom-heuristic', 'ecommerce', 0.6, `nav=${dom.navItems}, footer-links, form present`);
|
|
158
|
+
}
|
|
159
|
+
// blog: long body of paragraphs without forms or tables
|
|
160
|
+
if (dom.paragraphCount >= 8 && dom.formCount === 0 && dom.tableRowCount === 0) {
|
|
161
|
+
return signal('dom-heuristic', 'blog', 0.65, `paragraphs=${dom.paragraphCount}, no forms or tables`);
|
|
162
|
+
}
|
|
163
|
+
// marketing: hero + footer-link cloud + few paragraphs
|
|
164
|
+
if (dom.hasHeroSection && dom.hasFooterLinks && dom.paragraphCount < 8) {
|
|
165
|
+
return signal('dom-heuristic', 'marketing', 0.6, `hero present, footer-links, paragraphs=${dom.paragraphCount}`);
|
|
166
|
+
}
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
function signal(source, type, confidence, rationale) {
|
|
170
|
+
return { source, type, confidence, rationale };
|
|
171
|
+
}
|
|
172
|
+
// ── DOM heuristic derivation from snapshot ──────────────────────────────────
|
|
173
|
+
/**
|
|
174
|
+
* Best-effort DOM heuristic derivation from the accessibility-tree snapshot.
|
|
175
|
+
* Pipelines that capture true DOM heuristics via Playwright should pass them
|
|
176
|
+
* in directly; this fallback works against the @ref-snapshot text.
|
|
177
|
+
*/
|
|
178
|
+
export function deriveHeuristics(state) {
|
|
179
|
+
const snapshot = state.snapshot ?? '';
|
|
180
|
+
return {
|
|
181
|
+
formCount: countMatches(snapshot, /\bform\b/gi),
|
|
182
|
+
inputCount: countMatches(snapshot, /\b(textbox|searchbox|combobox|spinbutton|input)\b/gi),
|
|
183
|
+
tableRowCount: countMatches(snapshot, /\brow\b/gi),
|
|
184
|
+
chartCount: countMatches(snapshot, /\b(graphics-document|graphics-symbol|figure)\b/gi),
|
|
185
|
+
navItems: countMatches(snapshot, /\bnavigation\b/gi),
|
|
186
|
+
hasFooterLinks: /\bcontentinfo\b/i.test(snapshot),
|
|
187
|
+
hasHeroSection: /\bhero\b/i.test(snapshot) || /\bbanner\b/i.test(snapshot),
|
|
188
|
+
hasSidebar: /\bcomplementary\b/i.test(snapshot) || /\bsidebar\b/i.test(snapshot),
|
|
189
|
+
paragraphCount: countMatches(snapshot, /\bparagraph\b/gi),
|
|
190
|
+
codeBlockCount: countMatches(snapshot, /\bcode\b/gi),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
function countMatches(haystack, pattern) {
|
|
194
|
+
const m = haystack.match(pattern);
|
|
195
|
+
return m ? m.length : 0;
|
|
196
|
+
}
|
|
197
|
+
function clamp01(n) {
|
|
198
|
+
if (Number.isNaN(n))
|
|
199
|
+
return 0;
|
|
200
|
+
return Math.max(0, Math.min(1, n));
|
|
201
|
+
}
|
|
202
|
+
export const ENSEMBLE_INTERNALS = {
|
|
203
|
+
URL_PATTERN_RULES,
|
|
204
|
+
ENSEMBLE_AGREEMENT_THRESHOLD,
|
|
205
|
+
LLM_FALLBACK_CONFIDENCE,
|
|
206
|
+
};
|
|
207
|
+
//# sourceMappingURL=classify-ensemble.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify-ensemble.js","sourceRoot":"","sources":["../../../src/design/audit/classify-ensemble.ts"],"names":[],"mappings":"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"}
|