qfai 1.7.13 → 1.7.15
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 +35 -8
- package/assets/init/.qfai/assistant/agents/frontend-engineer.md +2 -2
- package/assets/init/.qfai/assistant/agents/product-experience-architect.md +2 -2
- package/assets/init/.qfai/assistant/agents/product-surface-reviewer.md +1 -1
- package/assets/init/.qfai/assistant/instructions/agent-selection.md +2 -0
- package/assets/init/.qfai/assistant/instructions/shared-skill-delegation-baseline.md +88 -0
- package/assets/init/.qfai/assistant/instructions/shared-skill-operating-baseline.md +49 -0
- package/assets/init/.qfai/assistant/skills/qfai-atdd/SKILL.md +28 -88
- package/assets/init/.qfai/assistant/skills/qfai-configure/SKILL.md +50 -114
- package/assets/init/.qfai/assistant/skills/qfai-discussion/SKILL.md +137 -208
- package/assets/init/.qfai/assistant/skills/qfai-discussion/references/design-md-brand-catalog.md +90 -0
- package/assets/init/.qfai/assistant/skills/qfai-discussion/references/discussion-completion-matrix.md +26 -0
- package/assets/init/.qfai/assistant/skills/qfai-discussion/references/discussion-coverage-checklist.md +20 -0
- package/assets/init/.qfai/assistant/skills/qfai-discussion/references/example-mapping-guide.md +18 -0
- package/assets/init/.qfai/assistant/skills/qfai-discussion/references/oq-and-deferred-rules.md +41 -0
- package/assets/init/.qfai/assistant/skills/qfai-discussion/references/review-cycle-playbook.md +22 -0
- package/assets/init/.qfai/assistant/skills/qfai-discussion/references/ui-bearing-playbook.md +50 -0
- package/assets/init/.qfai/assistant/skills/qfai-discussion/references/ui_ux/platform_baselines.md +107 -0
- package/assets/init/.qfai/assistant/skills/qfai-discussion/references/ui_ux/review_audit_playbook.md +104 -0
- package/assets/init/.qfai/assistant/skills/qfai-discussion/references/ui_ux/trend_scan_playbook.md +76 -0
- package/assets/init/.qfai/assistant/skills/qfai-discussion/references/ui_ux_best_practices.md +143 -1005
- package/assets/init/.qfai/assistant/skills/qfai-discussion/templates/01_Context.md +9 -0
- package/assets/init/.qfai/assistant/skills/qfai-discussion/templates/03_Story-Workshop.md +1 -1
- package/assets/init/.qfai/assistant/skills/qfai-discussion/templates/04_Sources.md +83 -32
- package/assets/init/.qfai/assistant/skills/qfai-discussion/templates/14_Review-Request.md +7 -7
- package/assets/init/.qfai/assistant/skills/qfai-discussion/templates/prototyping.yaml +12 -4
- package/assets/init/.qfai/assistant/skills/qfai-discussion/templates/review/Rxx_reviewer.md +2 -2
- package/assets/init/.qfai/assistant/skills/qfai-discussion/templates/review/review_request.md +2 -2
- package/assets/init/.qfai/assistant/skills/qfai-discussion/templates/uiux/10_implementation_strategy.md +31 -13
- package/assets/init/.qfai/assistant/skills/qfai-discussion/templates/uiux/12_design_system.md +115 -0
- package/assets/init/.qfai/assistant/skills/qfai-discussion/templates/uiux/21_design_eval_trend_derived.md +86 -24
- package/assets/init/.qfai/assistant/skills/qfai-discussion/templates/uiux/23_design_eval_aggregate.md +12 -0
- package/assets/init/.qfai/assistant/skills/qfai-discussion/templates/uiux/40_screen_contracts.md +1 -1
- package/assets/init/.qfai/assistant/skills/qfai-discussion/templates/uiux/50_review_input_bundle.md +2 -0
- package/assets/init/.qfai/assistant/skills/qfai-implement/SKILL.md +27 -27
- package/assets/init/.qfai/assistant/skills/qfai-prototyping/SKILL.md +145 -155
- package/assets/init/.qfai/assistant/skills/qfai-sdd/SKILL.md +118 -355
- package/assets/init/.qfai/assistant/skills/qfai-sdd/references/review-cycle-playbook.md +30 -0
- package/assets/init/.qfai/assistant/skills/qfai-sdd/references/sdd-execution-playbook.md +29 -0
- package/assets/init/.qfai/assistant/skills/qfai-sdd/references/sdd-phase-checklists.md +37 -0
- package/assets/init/.qfai/assistant/skills/qfai-sdd/references/sdd-quality-gate.md +32 -0
- package/assets/init/.qfai/assistant/skills/qfai-sdd/references/spec-traceability-rules.md +33 -0
- package/assets/init/.qfai/assistant/skills/qfai-verify/SKILL.md +50 -115
- package/assets/init/.qfai/assistant/steering/agent-catalog.yml +1 -1
- package/assets/init/.qfai/assistant/steering/agent-routing.yml +20 -8
- package/assets/init/.qfai/assistant/steering/manifest.md +4 -7
- package/assets/init/.qfai/assistant/steering/product.md +6 -6
- package/assets/init/.qfai/assistant/steering/review-profiles.yml +3 -0
- package/assets/init/.qfai/assistant/steering/ui-definition-protocol.md +7 -7
- package/assets/init/.qfai/contracts/README.md +15 -8
- package/assets/init/.qfai/contracts/ui/README.md +24 -26
- package/assets/init/.qfai/discussion/README.md +35 -32
- package/assets/init/.qfai/evidence/README.md +65 -181
- package/assets/init/.qfai/evidence/calibration.yaml +26 -0
- package/assets/init/.qfai/review/README.md +56 -11
- package/assets/init/.qfai/specs/README.md +2 -2
- package/assets/init/root/qfai.config.yaml +5 -6
- package/assets/scripts/capture-screenshots.js +128 -0
- package/assets/uix-rev/comparison-review.md +3 -15
- package/assets/uix-rev/contracts-review.md +5 -2
- package/assets/uix-rev/scoring-review.md +10 -2
- package/assets/uix-rev/strategy-review.md +11 -7
- package/dist/cli/index.cjs +8532 -4204
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.mjs +8599 -4271
- package/dist/cli/index.mjs.map +1 -1
- package/dist/index.cjs +9808 -5532
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +467 -277
- package/dist/index.d.ts +467 -277
- package/dist/index.mjs +8909 -4647
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/assets/uix-rev/migration-review.md +0 -17
package/dist/index.d.cts
CHANGED
|
@@ -14,7 +14,7 @@ type TestFileScan = {
|
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
type IssueSeverity = "info" | "warning" | "error";
|
|
17
|
-
type IssueCategory = "canonical" | "
|
|
17
|
+
type IssueCategory = "canonical" | "change";
|
|
18
18
|
type IssueLocation = {
|
|
19
19
|
line: number;
|
|
20
20
|
column?: number;
|
|
@@ -142,9 +142,6 @@ type QfaiUiuxAuditConfig = {
|
|
|
142
142
|
maxRawTokenLiteralWarnings?: number;
|
|
143
143
|
maxDuplicateFindingsPerRule?: number;
|
|
144
144
|
};
|
|
145
|
-
type QfaiUiuxMigrationConfig = {
|
|
146
|
-
strict?: boolean;
|
|
147
|
-
};
|
|
148
145
|
type QfaiUiuxConfig = {
|
|
149
146
|
platform?: string;
|
|
150
147
|
designTokensDir?: string;
|
|
@@ -153,20 +150,11 @@ type QfaiUiuxConfig = {
|
|
|
153
150
|
requireResearchSummary?: boolean;
|
|
154
151
|
competitive_refs_min?: number;
|
|
155
152
|
warning_as_error_override?: string[];
|
|
156
|
-
phase1ReleaseDate?: string;
|
|
157
153
|
renderEvidence?: RenderEvidenceConfig;
|
|
158
154
|
audit?: QfaiUiuxAuditConfig;
|
|
159
|
-
migration?: QfaiUiuxMigrationConfig;
|
|
160
155
|
};
|
|
161
156
|
type QfaiPrototypingCalibrationConfig = {
|
|
162
157
|
packPath?: string;
|
|
163
|
-
thresholds?: {
|
|
164
|
-
accept?: number;
|
|
165
|
-
refine?: number;
|
|
166
|
-
};
|
|
167
|
-
maxIterations?: number;
|
|
168
|
-
plateauDelta?: number;
|
|
169
|
-
plateauLookback?: number;
|
|
170
158
|
};
|
|
171
159
|
type QfaiPrototypingConfig = {
|
|
172
160
|
calibration?: QfaiPrototypingCalibrationConfig;
|
|
@@ -174,7 +162,6 @@ type QfaiPrototypingConfig = {
|
|
|
174
162
|
targetUrl?: string | null;
|
|
175
163
|
browserProvider?: string;
|
|
176
164
|
renderProvider?: string;
|
|
177
|
-
reviewer?: string;
|
|
178
165
|
};
|
|
179
166
|
};
|
|
180
167
|
type QfaiConfig = {
|
|
@@ -322,12 +309,13 @@ declare function extractAcSpecNumber(acId: string): string | null;
|
|
|
322
309
|
declare function extractCaseSpecNumber(caseId: string): string | null;
|
|
323
310
|
declare function extractScSpecNumber(scId: string): string | null;
|
|
324
311
|
|
|
325
|
-
|
|
312
|
+
declare const CANONICAL_PROTOTYPING_SURFACES: readonly ["web", "mobile", "desktop", "cli", "mixed"];
|
|
313
|
+
type CanonicalPrototypingSurface = (typeof CANONICAL_PROTOTYPING_SURFACES)[number];
|
|
314
|
+
|
|
315
|
+
type PrototypingMode = "full-harness";
|
|
326
316
|
type ModeSelectionSource = "explicit-request" | "discussion-recommendation" | "system-default";
|
|
327
|
-
type PrototypingSurface =
|
|
328
|
-
|
|
329
|
-
type LegacyPrototypingSurface = "web-ui" | "mobile-ui" | "desktop-ui";
|
|
330
|
-
type DiscussionRecommendationSourceSchema = "canonical-namespaced" | "legacy-top-level";
|
|
317
|
+
type PrototypingSurface = CanonicalPrototypingSurface;
|
|
318
|
+
type DiscussionRecommendationSourceSchema = "canonical-namespaced";
|
|
331
319
|
/**
|
|
332
320
|
* Canonical validated recommendation — all 4 fields required.
|
|
333
321
|
* Parser output uses this same type; fields are always populated
|
|
@@ -363,6 +351,9 @@ type PrototypingObligations = {
|
|
|
363
351
|
requireRenderBundle: boolean;
|
|
364
352
|
requireBrowserQaBundle: boolean;
|
|
365
353
|
requireFullHarness: boolean;
|
|
354
|
+
validCombination: boolean;
|
|
355
|
+
invalidReasonCode?: string | undefined;
|
|
356
|
+
invalidReason?: string | undefined;
|
|
366
357
|
};
|
|
367
358
|
type ResolveModeInput = {
|
|
368
359
|
requested?: PrototypingMode | undefined;
|
|
@@ -376,17 +367,22 @@ type PrototypingExecutionConfig = {
|
|
|
376
367
|
};
|
|
377
368
|
type UiFidelityStatus = {
|
|
378
369
|
required: boolean;
|
|
379
|
-
status: "completed" | "failed" | "n/a";
|
|
370
|
+
status: "completed" | "failed" | "insufficient-evidence" | "n/a";
|
|
380
371
|
reason?: string;
|
|
381
372
|
};
|
|
382
373
|
|
|
374
|
+
declare const FULL_HARNESS_INVALID_COMBINATION_MESSAGE = "packages/qfai v1.7.15 \u3067\u306F prototyping \u306F full-harness / UI-only \u3067\u3059\u3002";
|
|
375
|
+
declare const UNSUPPORTED_PROTOTYPING_MODE_REASON_CODE = "unsupported_prototyping_mode";
|
|
376
|
+
declare const UNSUPPORTED_PROTOTYPING_MODE_MESSAGE = "packages/qfai v1.7.15 \u3067\u306F prototyping \u306F full-harness \u306E\u307F\u30B5\u30DD\u30FC\u30C8\u3057\u307E\u3059\u3002";
|
|
377
|
+
declare const NON_UI_PROTOTYPING_SURFACE_REASON_CODE = "unsupported_non_ui_prototyping_surface";
|
|
378
|
+
declare const NON_UI_PROTOTYPING_SURFACE_MESSAGE = "packages/qfai v1.7.15 \u3067\u306F prototyping \u306F UI-bearing surface \u306E\u307F\u30B5\u30DD\u30FC\u30C8\u3057\u307E\u3059\u3002";
|
|
383
379
|
type ParseDiscussionResult = {
|
|
384
380
|
recommendation: DiscussionModeRecommendation | null;
|
|
385
381
|
warnings: string[];
|
|
386
382
|
};
|
|
387
383
|
/**
|
|
388
384
|
* Parse a prototyping.yaml file from a discussion pack.
|
|
389
|
-
* Supports
|
|
385
|
+
* Supports only the canonical namespaced (`prototyping.*`) schema.
|
|
390
386
|
*/
|
|
391
387
|
declare function parseDiscussionModeRecommendation(filePath: string): Promise<DiscussionModeRecommendation | null>;
|
|
392
388
|
declare function parseDiscussionModeRecommendationWithWarnings(filePath: string): Promise<ParseDiscussionResult>;
|
|
@@ -409,18 +405,13 @@ declare function inferSurfaceFromRecommendationAndEvidence(input: {
|
|
|
409
405
|
hasBrowserQaBundle?: boolean | undefined;
|
|
410
406
|
hasUiRoutes?: boolean | undefined;
|
|
411
407
|
hasRuntimeGateUi?: boolean | undefined;
|
|
412
|
-
}): PrototypingSurface;
|
|
408
|
+
}): PrototypingSurface | null;
|
|
413
409
|
declare function derivePrototypingObligations(input: {
|
|
414
410
|
surface: PrototypingSurface;
|
|
415
|
-
effectiveMode:
|
|
411
|
+
effectiveMode: string;
|
|
416
412
|
}): PrototypingObligations;
|
|
417
413
|
declare function isValidPrototypingMode(value: unknown): value is PrototypingMode;
|
|
418
414
|
declare function isValidPrototypingSurface(value: unknown): value is PrototypingSurface;
|
|
419
|
-
/**
|
|
420
|
-
* Normalize a surface value: map legacy values to canonical equivalents.
|
|
421
|
-
*/
|
|
422
|
-
declare function normalizePrototypingSurface(value: string): PrototypingSurface;
|
|
423
|
-
declare function isUiBearingSurface(surface: PrototypingSurface): boolean;
|
|
424
415
|
declare function normalizeAllowedModes(modes?: string[]): PrototypingMode[];
|
|
425
416
|
|
|
426
417
|
/**
|
|
@@ -463,87 +454,47 @@ type RenderRunnerResult = {
|
|
|
463
454
|
};
|
|
464
455
|
};
|
|
465
456
|
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
output: string;
|
|
474
|
-
context: string;
|
|
475
|
-
iteration: number;
|
|
476
|
-
};
|
|
477
|
-
type CritiqueResponse = {
|
|
478
|
-
scores: Record<string, number>;
|
|
479
|
-
dimensions: string[];
|
|
480
|
-
suggestions: string[];
|
|
481
|
-
};
|
|
482
|
-
type CritiqueProvider = {
|
|
483
|
-
name: string;
|
|
484
|
-
request: (input: CritiqueInput, signal?: AbortSignal) => Promise<CritiqueResponse>;
|
|
485
|
-
};
|
|
486
|
-
type CritiqueResult = {
|
|
487
|
-
failOpen: false;
|
|
488
|
-
response: CritiqueResponse;
|
|
489
|
-
} | {
|
|
490
|
-
failOpen: true;
|
|
491
|
-
response: undefined;
|
|
492
|
-
reason: string;
|
|
493
|
-
};
|
|
494
|
-
|
|
495
|
-
/**
|
|
496
|
-
* Critique adapter with fail-open semantics (NFR-0002).
|
|
497
|
-
*
|
|
498
|
-
* Wraps external critique providers with schema validation,
|
|
499
|
-
* timeout enforcement, and fail-open on any error.
|
|
500
|
-
*/
|
|
501
|
-
|
|
502
|
-
declare class CritiqueAdapter {
|
|
503
|
-
private provider;
|
|
504
|
-
private timeoutMs;
|
|
505
|
-
constructor(options?: {
|
|
506
|
-
timeoutMs?: number;
|
|
507
|
-
});
|
|
508
|
-
register(provider: CritiqueProvider): void;
|
|
509
|
-
requestCritique(input: CritiqueInput): Promise<CritiqueResult>;
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
type SurfaceType = "web" | "mobile" | "desktop" | "cli" | "mixed" | "non-ui";
|
|
513
|
-
/** Surfaces that bear a user interface — canonical truth for UI-bearing detection. */
|
|
514
|
-
declare const UI_BEARING_SURFACES: Set<SurfaceType>;
|
|
515
|
-
/** Surfaces that do NOT bear a user interface. */
|
|
516
|
-
declare const NON_UI_SURFACES: Set<SurfaceType>;
|
|
517
|
-
/**
|
|
518
|
-
* Synchronous check: given a SurfaceType value, returns true if UI-bearing.
|
|
519
|
-
* Canonical shared helper for classification validator and prototyping mode.
|
|
520
|
-
*/
|
|
521
|
-
declare function isUiBearingSurfaceType(surface: SurfaceType): boolean;
|
|
522
|
-
|
|
523
|
-
/**
|
|
524
|
-
* Browser QA canonical types — WS-B
|
|
525
|
-
*
|
|
526
|
-
* Defines the 4-phase execution model with truthful status reporting.
|
|
527
|
-
*/
|
|
457
|
+
type SurfaceType = CanonicalPrototypingSurface | "non-ui";
|
|
458
|
+
declare const DISCUSSION_UI_BEARING_SURFACES: Set<SurfaceType>;
|
|
459
|
+
declare const DISCUSSION_NON_UI_SURFACES: Set<SurfaceType>;
|
|
460
|
+
declare const VISUAL_BROWSER_SURFACES: Set<SurfaceType>;
|
|
461
|
+
declare function isDiscussionUiBearingSurfaceType(surface: SurfaceType): boolean;
|
|
462
|
+
declare function isNonUiDiscussionSurface(surface: SurfaceType): boolean;
|
|
463
|
+
declare function requiresVisualBrowserEvidence(surface: SurfaceType): boolean;
|
|
528
464
|
|
|
529
465
|
type BrowserQaPhase = "smoke" | "interaction" | "visual" | "accessibility";
|
|
530
466
|
declare const BROWSER_QA_PHASES: readonly BrowserQaPhase[];
|
|
531
|
-
type BrowserQaPhaseStatus = "
|
|
532
|
-
type BrowserQaFindingSeverity = "info" | "warning" | "error";
|
|
533
|
-
|
|
467
|
+
type BrowserQaPhaseStatus = "passed" | "executed" | "failed" | "skipped";
|
|
468
|
+
type BrowserQaFindingSeverity = "info" | "warn" | "warning" | "error";
|
|
469
|
+
interface BrowserQaFinding {
|
|
534
470
|
phase: BrowserQaPhase;
|
|
535
|
-
route?: string;
|
|
536
|
-
selector?: string;
|
|
537
|
-
target?: string;
|
|
538
471
|
severity: BrowserQaFindingSeverity;
|
|
539
|
-
|
|
472
|
+
summary: string;
|
|
473
|
+
detail: string;
|
|
474
|
+
screen_id?: string;
|
|
475
|
+
selector?: string;
|
|
476
|
+
evidence_refs: string[];
|
|
477
|
+
repair_suggestions: string[];
|
|
478
|
+
category?: BrowserQaPhase;
|
|
479
|
+
message?: string;
|
|
480
|
+
route?: string;
|
|
540
481
|
repair_hint?: string;
|
|
482
|
+
}
|
|
483
|
+
type BrowserQaScreenContractRef = {
|
|
484
|
+
screen_id: string;
|
|
485
|
+
route?: string;
|
|
486
|
+
primary_tasks?: string[];
|
|
541
487
|
};
|
|
542
488
|
type BrowserQaPhaseResult = {
|
|
543
489
|
phase: BrowserQaPhase;
|
|
544
490
|
status: BrowserQaPhaseStatus;
|
|
545
491
|
findings: BrowserQaFinding[];
|
|
492
|
+
repair_suggestions: string[];
|
|
493
|
+
evidence_refs: string[];
|
|
494
|
+
checks_performed: string[];
|
|
546
495
|
skippedReason?: string;
|
|
496
|
+
screen_id?: string;
|
|
497
|
+
route?: string;
|
|
547
498
|
};
|
|
548
499
|
type BrowserQaInput = {
|
|
549
500
|
htmlContent?: string;
|
|
@@ -552,19 +503,24 @@ type BrowserQaInput = {
|
|
|
552
503
|
surface: SurfaceType;
|
|
553
504
|
required?: boolean;
|
|
554
505
|
executionSource?: "html" | "url" | "none";
|
|
506
|
+
screenContracts?: BrowserQaScreenContractRef[];
|
|
555
507
|
};
|
|
556
508
|
type BrowserQaRunResult = {
|
|
557
509
|
phases: BrowserQaPhaseResult[];
|
|
558
510
|
provider: string;
|
|
559
511
|
timestamp: string;
|
|
560
512
|
};
|
|
561
|
-
type BrowserQaSummary = {
|
|
513
|
+
type BrowserQaSummary$1 = {
|
|
562
514
|
providerId: string;
|
|
563
515
|
phases: Record<BrowserQaPhase, {
|
|
564
516
|
status: BrowserQaPhaseStatus;
|
|
565
517
|
findingsCount: number;
|
|
518
|
+
checksCount: number;
|
|
519
|
+
passed?: number;
|
|
520
|
+
failed?: number;
|
|
566
521
|
}>;
|
|
567
522
|
totalFindings: number;
|
|
523
|
+
totalRepairs: number;
|
|
568
524
|
skippedReasons: string[];
|
|
569
525
|
};
|
|
570
526
|
interface BrowserQaProvider {
|
|
@@ -583,11 +539,11 @@ interface BrowserQaProvider {
|
|
|
583
539
|
* absence is a valid state with fail-open semantics.
|
|
584
540
|
*
|
|
585
541
|
* WS-B: BrowserQaProvider is the canonical interface for 4-phase Browser QA.
|
|
586
|
-
* BrowserProvider
|
|
542
|
+
* BrowserProvider defines the browser QA and capture provider interface.
|
|
587
543
|
*/
|
|
588
544
|
|
|
589
545
|
type ProviderCapability = "screenshot" | "viewport" | "dom" | "interaction" | "visual" | "accessibility";
|
|
590
|
-
/**
|
|
546
|
+
/** Browser QA and capture provider. */
|
|
591
547
|
type BrowserProvider = {
|
|
592
548
|
name: string;
|
|
593
549
|
capabilities: ProviderCapability[];
|
|
@@ -637,10 +593,11 @@ type PrototypingExecutionRequest = {
|
|
|
637
593
|
providerRegistry?: ProviderRegistry;
|
|
638
594
|
renderAdapter?: RenderCaptureAdapter;
|
|
639
595
|
browserQaProviderId?: string;
|
|
640
|
-
critiqueAdapter?: CritiqueAdapter;
|
|
641
596
|
renderProviderId?: string;
|
|
642
597
|
targetUrl?: string;
|
|
643
598
|
reviewer?: string;
|
|
599
|
+
changeSummary?: string[];
|
|
600
|
+
limitations?: string[];
|
|
644
601
|
};
|
|
645
602
|
type PrototypingExecutionResult = {
|
|
646
603
|
mode: PrototypingMode;
|
|
@@ -890,13 +847,24 @@ type ReportPrototypingSummary = {
|
|
|
890
847
|
};
|
|
891
848
|
fullHarness?: {
|
|
892
849
|
enabled: boolean;
|
|
893
|
-
available?: boolean;
|
|
894
850
|
runId?: string;
|
|
851
|
+
calibrationRef?: {
|
|
852
|
+
configPath: string;
|
|
853
|
+
packPath: string;
|
|
854
|
+
packVersion: string;
|
|
855
|
+
};
|
|
895
856
|
iterationCount?: number;
|
|
896
857
|
bestIteration?: number;
|
|
858
|
+
status?: string;
|
|
897
859
|
terminationReason?: string;
|
|
860
|
+
reviewerId?: string;
|
|
898
861
|
reviewerSignoffStatus?: string;
|
|
899
862
|
scoringTraceCount?: number;
|
|
863
|
+
latestWeightedTotal?: number;
|
|
864
|
+
latestL1Total?: number;
|
|
865
|
+
latestL2Total?: number;
|
|
866
|
+
limitations?: string[];
|
|
867
|
+
reviewerLogsCount?: number;
|
|
900
868
|
};
|
|
901
869
|
render?: {
|
|
902
870
|
status?: string;
|
|
@@ -917,8 +885,11 @@ type ReportPrototypingSummary = {
|
|
|
917
885
|
totalFailed: number;
|
|
918
886
|
};
|
|
919
887
|
phaseSummary?: Record<string, {
|
|
920
|
-
|
|
921
|
-
|
|
888
|
+
status: string;
|
|
889
|
+
findingsCount: number;
|
|
890
|
+
checksCount: number;
|
|
891
|
+
passed?: number;
|
|
892
|
+
failed?: number;
|
|
922
893
|
}>;
|
|
923
894
|
modeMismatch?: boolean;
|
|
924
895
|
};
|
|
@@ -980,25 +951,8 @@ declare function validateSpecSplitByCapability(root: string, config: QfaiConfig)
|
|
|
980
951
|
|
|
981
952
|
declare function validateTraceability(root: string, config: QfaiConfig, phase: ValidationPhase): Promise<Issue[]>;
|
|
982
953
|
|
|
983
|
-
/**
|
|
984
|
-
* Browser QA runner — WS-B
|
|
985
|
-
*
|
|
986
|
-
* Orchestrates the canonical 4-phase Browser QA execution model.
|
|
987
|
-
* Provider resolution → phase execution → truthful skip/fail handling.
|
|
988
|
-
*/
|
|
989
|
-
|
|
990
|
-
/**
|
|
991
|
-
* Run the canonical 4-phase Browser QA.
|
|
992
|
-
*
|
|
993
|
-
* - provider resolved → delegate to provider methods
|
|
994
|
-
* - no provider → use built-in static analysis phases
|
|
995
|
-
* - non-ui surface → all phases skipped
|
|
996
|
-
*/
|
|
997
954
|
declare function runBrowserQaOrchestrated(input: BrowserQaInput, provider?: BrowserQaProvider): Promise<BrowserQaRunResult>;
|
|
998
|
-
|
|
999
|
-
* Summarize a BrowserQaRunResult for report output.
|
|
1000
|
-
*/
|
|
1001
|
-
declare function summarizeBrowserQaResult(result: BrowserQaRunResult): BrowserQaSummary;
|
|
955
|
+
declare function summarizeBrowserQaResult(result: BrowserQaRunResult): BrowserQaSummary$1;
|
|
1002
956
|
|
|
1003
957
|
/**
|
|
1004
958
|
* Render runner — WS-C
|
|
@@ -1018,6 +972,155 @@ declare function runRenderCapture(targets: RenderCaptureTarget[], outputDir: str
|
|
|
1018
972
|
required?: boolean;
|
|
1019
973
|
}): Promise<RenderRunnerResult>;
|
|
1020
974
|
|
|
975
|
+
interface FakeUiDetectionResult {
|
|
976
|
+
detected: boolean;
|
|
977
|
+
reasons: string[];
|
|
978
|
+
evidence_refs: string[];
|
|
979
|
+
confidence: "low" | "medium" | "high";
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
declare const FULL_HARNESS_EXIT_REASONS: readonly ["quality-threshold-met", "plateau", "budget-exhausted", "fake-ui-detected", "runtime-failure", "human-review-required"];
|
|
983
|
+
type FullHarnessExitReason = (typeof FULL_HARNESS_EXIT_REASONS)[number];
|
|
984
|
+
|
|
985
|
+
type FullHarnessHandoff = {
|
|
986
|
+
selected_build: string;
|
|
987
|
+
artifact_refs: string[];
|
|
988
|
+
outstanding_issues: string[];
|
|
989
|
+
required_human_review_points: string[];
|
|
990
|
+
exit_reason: FullHarnessExitReason;
|
|
991
|
+
next_recommended_action: string;
|
|
992
|
+
};
|
|
993
|
+
|
|
994
|
+
/**
|
|
995
|
+
* Calibration pack types for harness scoring alignment.
|
|
996
|
+
*
|
|
997
|
+
* Calibration packs are file-based YAML assets (SD-0030-003)
|
|
998
|
+
* containing scoring alignment examples and threshold configuration.
|
|
999
|
+
*/
|
|
1000
|
+
type AlignmentExample = {
|
|
1001
|
+
input: string;
|
|
1002
|
+
expectedScore: number;
|
|
1003
|
+
rationale: string;
|
|
1004
|
+
};
|
|
1005
|
+
type CalibrationOverrides = {
|
|
1006
|
+
perAxisMinimum?: number;
|
|
1007
|
+
maxIterationsByMode?: Record<string, number>;
|
|
1008
|
+
};
|
|
1009
|
+
type CalibrationPack = {
|
|
1010
|
+
version: string;
|
|
1011
|
+
examples: AlignmentExample[];
|
|
1012
|
+
thresholds: ThresholdConfig;
|
|
1013
|
+
maxIterations: number;
|
|
1014
|
+
plateauDelta: number;
|
|
1015
|
+
plateauLookback: number;
|
|
1016
|
+
overrides?: CalibrationOverrides;
|
|
1017
|
+
};
|
|
1018
|
+
type ThresholdConfig = {
|
|
1019
|
+
accept: number;
|
|
1020
|
+
refine: number;
|
|
1021
|
+
};
|
|
1022
|
+
type Decision = "accept" | "refine" | "reject";
|
|
1023
|
+
|
|
1024
|
+
/**
|
|
1025
|
+
* Full-harness mode types — v1.7.15 measurement-driven model.
|
|
1026
|
+
*
|
|
1027
|
+
* Each iteration is a real observation of code state.
|
|
1028
|
+
* No planner/generator/evaluator loop.
|
|
1029
|
+
*/
|
|
1030
|
+
|
|
1031
|
+
type FullHarnessPanelScore = {
|
|
1032
|
+
panel: "L1" | "L2";
|
|
1033
|
+
total: number;
|
|
1034
|
+
degradedScoring?: boolean;
|
|
1035
|
+
axes: Array<{
|
|
1036
|
+
axisId: string;
|
|
1037
|
+
score: number;
|
|
1038
|
+
rationale: string;
|
|
1039
|
+
evidenceRefs: string[];
|
|
1040
|
+
}>;
|
|
1041
|
+
};
|
|
1042
|
+
type FullHarnessIteration = {
|
|
1043
|
+
iteration: number;
|
|
1044
|
+
commitSha: string;
|
|
1045
|
+
reviewerId: string;
|
|
1046
|
+
timestamp: string;
|
|
1047
|
+
changeSummary: string[];
|
|
1048
|
+
limitations: string[];
|
|
1049
|
+
evidenceRefs: {
|
|
1050
|
+
render: string[];
|
|
1051
|
+
browserQa: string[];
|
|
1052
|
+
runtimeGate: string[];
|
|
1053
|
+
uiObservation: string[];
|
|
1054
|
+
specCoverage: string[];
|
|
1055
|
+
discussion: string[];
|
|
1056
|
+
screenContract: string[];
|
|
1057
|
+
trend: string[];
|
|
1058
|
+
};
|
|
1059
|
+
l1: FullHarnessPanelScore;
|
|
1060
|
+
l2: FullHarnessPanelScore;
|
|
1061
|
+
weightedTotal: number;
|
|
1062
|
+
deltaFromPrevious: number | null;
|
|
1063
|
+
decision: Decision;
|
|
1064
|
+
};
|
|
1065
|
+
type TerminationReason = "converged" | "max-iterations" | "plateau" | "manual-stop";
|
|
1066
|
+
type FinalDecision = "pending" | "accepted" | "rejected" | "abandoned";
|
|
1067
|
+
type ReviewerSignoffStatus = "pending" | "approved" | "rejected" | "abandoned";
|
|
1068
|
+
type ReviewerLogVerdict = "approve" | "revise" | "reject" | "abandon";
|
|
1069
|
+
type FullHarnessHistory = {
|
|
1070
|
+
runId: string;
|
|
1071
|
+
iterations: FullHarnessIteration[];
|
|
1072
|
+
bestIteration: number;
|
|
1073
|
+
terminationReason?: TerminationReason;
|
|
1074
|
+
scoringTrace: Array<{
|
|
1075
|
+
iteration: number;
|
|
1076
|
+
l1Total: number;
|
|
1077
|
+
l2Total: number;
|
|
1078
|
+
weightedTotal: number;
|
|
1079
|
+
deltaFromPrevious: number | null;
|
|
1080
|
+
decision: Decision;
|
|
1081
|
+
commitSha: string;
|
|
1082
|
+
}>;
|
|
1083
|
+
};
|
|
1084
|
+
type MeasurementInput = {
|
|
1085
|
+
root: string;
|
|
1086
|
+
reviewer: string;
|
|
1087
|
+
changeSummary: string[];
|
|
1088
|
+
limitations: string[];
|
|
1089
|
+
calibration: {
|
|
1090
|
+
packPath: string;
|
|
1091
|
+
thresholds: {
|
|
1092
|
+
accept: number;
|
|
1093
|
+
refine: number;
|
|
1094
|
+
};
|
|
1095
|
+
maxIterations: number;
|
|
1096
|
+
plateauDelta: number;
|
|
1097
|
+
plateauLookback: number;
|
|
1098
|
+
};
|
|
1099
|
+
renderRefs: string[];
|
|
1100
|
+
browserQaRefs: string[];
|
|
1101
|
+
runtimeGateRefs: string[];
|
|
1102
|
+
uiObservationRefs: string[];
|
|
1103
|
+
specCoverageRefs: string[];
|
|
1104
|
+
discussionRefs: string[];
|
|
1105
|
+
screenContractRefs: string[];
|
|
1106
|
+
discussionDirRelative?: string;
|
|
1107
|
+
trendRefs: string[];
|
|
1108
|
+
l1: FullHarnessPanelScore;
|
|
1109
|
+
l2: FullHarnessPanelScore;
|
|
1110
|
+
};
|
|
1111
|
+
type MeasurementResult = {
|
|
1112
|
+
iteration: FullHarnessIteration;
|
|
1113
|
+
history: FullHarnessHistory;
|
|
1114
|
+
terminationReason: TerminationReason | undefined;
|
|
1115
|
+
isTerminal: boolean;
|
|
1116
|
+
};
|
|
1117
|
+
type FullHarnessCalibrationRef = {
|
|
1118
|
+
configPath: string;
|
|
1119
|
+
packPath: string;
|
|
1120
|
+
packVersion: string;
|
|
1121
|
+
};
|
|
1122
|
+
declare const REVIEWER_PLACEHOLDERS: string[];
|
|
1123
|
+
|
|
1021
1124
|
type PrototypingSummaryBundle = {
|
|
1022
1125
|
surface: PrototypingSurface;
|
|
1023
1126
|
specs: Array<{
|
|
@@ -1037,6 +1140,11 @@ type PrototypingSummaryBundle = {
|
|
|
1037
1140
|
apiEndpoints: string[];
|
|
1038
1141
|
dbObjects: string[];
|
|
1039
1142
|
};
|
|
1143
|
+
coverageRefs?: Array<{
|
|
1144
|
+
route: string;
|
|
1145
|
+
declaredRef: string;
|
|
1146
|
+
observedRefs: string[];
|
|
1147
|
+
}>;
|
|
1040
1148
|
}>;
|
|
1041
1149
|
mode: {
|
|
1042
1150
|
requested?: PrototypingMode;
|
|
@@ -1054,20 +1162,23 @@ type PrototypingSummaryBundle = {
|
|
|
1054
1162
|
};
|
|
1055
1163
|
uiFidelityStatus?: {
|
|
1056
1164
|
required: boolean;
|
|
1057
|
-
status: "completed" | "failed" | "n/a";
|
|
1165
|
+
status: "completed" | "failed" | "insufficient-evidence" | "n/a";
|
|
1058
1166
|
reason?: string;
|
|
1059
1167
|
};
|
|
1060
1168
|
missingRequiredEvidence?: string[];
|
|
1061
1169
|
runtimeGate?: {
|
|
1062
1170
|
ui: Array<{
|
|
1171
|
+
screenId: string;
|
|
1063
1172
|
route: string;
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1173
|
+
declaredRef: string;
|
|
1174
|
+
url?: string;
|
|
1175
|
+
rendered: boolean;
|
|
1176
|
+
browserVisited: boolean;
|
|
1177
|
+
httpStatus?: number;
|
|
1178
|
+
renderEvidenceRefs: string[];
|
|
1179
|
+
browserQaEvidenceRefs: string[];
|
|
1070
1180
|
}>;
|
|
1181
|
+
evidenceRefs: string[];
|
|
1071
1182
|
};
|
|
1072
1183
|
uiFidelity?: {
|
|
1073
1184
|
mode: "interactive" | "skeleton";
|
|
@@ -1075,21 +1186,37 @@ type PrototypingSummaryBundle = {
|
|
|
1075
1186
|
};
|
|
1076
1187
|
fullHarness?: {
|
|
1077
1188
|
enabled: true;
|
|
1078
|
-
available: boolean;
|
|
1079
1189
|
runId: string;
|
|
1190
|
+
calibrationRef: FullHarnessCalibrationRef;
|
|
1080
1191
|
iterationCount: number;
|
|
1081
1192
|
bestIteration: number;
|
|
1082
|
-
|
|
1193
|
+
status: "in-progress" | "completed";
|
|
1194
|
+
terminationReason?: TerminationReason;
|
|
1195
|
+
finalDecision: FinalDecision;
|
|
1083
1196
|
reviewerSignoff: {
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
timestamp
|
|
1197
|
+
reviewerId: string;
|
|
1198
|
+
status: ReviewerSignoffStatus;
|
|
1199
|
+
timestamp?: string;
|
|
1200
|
+
source: "cli";
|
|
1087
1201
|
};
|
|
1202
|
+
reviewerLogs: Array<{
|
|
1203
|
+
iteration: number;
|
|
1204
|
+
reviewerId: string;
|
|
1205
|
+
verdict: ReviewerLogVerdict;
|
|
1206
|
+
summary: string;
|
|
1207
|
+
evidenceRefs: string[];
|
|
1208
|
+
}>;
|
|
1209
|
+
iterations: FullHarnessIteration[];
|
|
1088
1210
|
scoringTrace: Array<{
|
|
1089
1211
|
iteration: number;
|
|
1212
|
+
l1Total: number;
|
|
1213
|
+
l2Total: number;
|
|
1090
1214
|
weightedTotal: number;
|
|
1091
|
-
|
|
1215
|
+
deltaFromPrevious: number | null;
|
|
1216
|
+
decision: "accept" | "refine" | "reject";
|
|
1217
|
+
commitSha: string;
|
|
1092
1218
|
}>;
|
|
1219
|
+
limitations: string[];
|
|
1093
1220
|
};
|
|
1094
1221
|
};
|
|
1095
1222
|
declare function writeEvidenceBundles(input: {
|
|
@@ -1105,98 +1232,17 @@ declare function writeEvidenceBundles(input: {
|
|
|
1105
1232
|
mode: PrototypingMode;
|
|
1106
1233
|
};
|
|
1107
1234
|
prototyping: PrototypingSummaryBundle;
|
|
1235
|
+
fullHarnessArtifacts?: {
|
|
1236
|
+
fakeUiDetection: FakeUiDetectionResult;
|
|
1237
|
+
handoff: FullHarnessHandoff;
|
|
1238
|
+
exitReason: FullHarnessExitReason;
|
|
1239
|
+
};
|
|
1108
1240
|
}): Promise<{
|
|
1109
1241
|
prototypingPath: string;
|
|
1110
1242
|
renderPath: string;
|
|
1111
1243
|
browserQaPath: string;
|
|
1112
1244
|
}>;
|
|
1113
1245
|
|
|
1114
|
-
type ThresholdConfig = {
|
|
1115
|
-
accept: number;
|
|
1116
|
-
refine: number;
|
|
1117
|
-
};
|
|
1118
|
-
type Decision = "accept" | "refine" | "pivot";
|
|
1119
|
-
|
|
1120
|
-
/**
|
|
1121
|
-
* Full-harness mode types.
|
|
1122
|
-
*
|
|
1123
|
-
* Defines the planner/generator/evaluator loop interfaces
|
|
1124
|
-
* and evidence structures for /qfai-prototyping full-harness mode.
|
|
1125
|
-
*/
|
|
1126
|
-
|
|
1127
|
-
type HarnessConfig = {
|
|
1128
|
-
maxIterations: number;
|
|
1129
|
-
thresholds: ThresholdConfig;
|
|
1130
|
-
dimensionWeights?: Record<string, number> | undefined;
|
|
1131
|
-
dimensionFloors?: Record<string, number> | undefined;
|
|
1132
|
-
plateauDelta?: number | undefined;
|
|
1133
|
-
plateauLookback?: number | undefined;
|
|
1134
|
-
};
|
|
1135
|
-
type PlannerStrategy = {
|
|
1136
|
-
approach: string;
|
|
1137
|
-
constraints: string[];
|
|
1138
|
-
budgetGuidance: string;
|
|
1139
|
-
};
|
|
1140
|
-
type GeneratorOutput = {
|
|
1141
|
-
content: string;
|
|
1142
|
-
metadata?: Record<string, unknown> | undefined;
|
|
1143
|
-
};
|
|
1144
|
-
type DimensionScore = {
|
|
1145
|
-
dimension: string;
|
|
1146
|
-
score: number;
|
|
1147
|
-
weight: number;
|
|
1148
|
-
floor?: number | undefined;
|
|
1149
|
-
};
|
|
1150
|
-
type EvaluatorResult = {
|
|
1151
|
-
decision: Decision;
|
|
1152
|
-
weightedTotal: number;
|
|
1153
|
-
dimensionScores: DimensionScore[];
|
|
1154
|
-
feedback?: string | undefined;
|
|
1155
|
-
pivotContext?: string | undefined;
|
|
1156
|
-
};
|
|
1157
|
-
type IterationRecord = {
|
|
1158
|
-
iteration: number;
|
|
1159
|
-
plannerStrategy?: PlannerStrategy | undefined;
|
|
1160
|
-
generatorOutput: GeneratorOutput;
|
|
1161
|
-
evaluatorResult: EvaluatorResult;
|
|
1162
|
-
critiqueResult?: CritiqueResult | undefined;
|
|
1163
|
-
};
|
|
1164
|
-
type LoopStatus = "converged" | "max-iterations" | "plateau";
|
|
1165
|
-
type LoopResult = {
|
|
1166
|
-
status: LoopStatus;
|
|
1167
|
-
finalOutput: GeneratorOutput;
|
|
1168
|
-
finalScore: number;
|
|
1169
|
-
terminationReason: LoopStatus;
|
|
1170
|
-
iterationCount: number;
|
|
1171
|
-
iterations: IterationRecord[];
|
|
1172
|
-
bestIteration: number;
|
|
1173
|
-
};
|
|
1174
|
-
type HarnessEvidence = {
|
|
1175
|
-
runId: string;
|
|
1176
|
-
timestamp: string;
|
|
1177
|
-
status: LoopStatus;
|
|
1178
|
-
iterationCount: number;
|
|
1179
|
-
finalScore: number;
|
|
1180
|
-
terminationReason: LoopStatus;
|
|
1181
|
-
iterations: IterationRecord[];
|
|
1182
|
-
bestIteration: number;
|
|
1183
|
-
};
|
|
1184
|
-
type ReviewSummary = {
|
|
1185
|
-
finalScore: number;
|
|
1186
|
-
recommendation: string;
|
|
1187
|
-
iterationSummary: Array<{
|
|
1188
|
-
iteration: number;
|
|
1189
|
-
score: number;
|
|
1190
|
-
decision: Decision;
|
|
1191
|
-
}>;
|
|
1192
|
-
};
|
|
1193
|
-
type SpecInputs = {
|
|
1194
|
-
specId: string;
|
|
1195
|
-
requirements: string[];
|
|
1196
|
-
constraints?: string[] | undefined;
|
|
1197
|
-
calibrationPackPath?: string | undefined;
|
|
1198
|
-
};
|
|
1199
|
-
|
|
1200
1246
|
/**
|
|
1201
1247
|
* Harness adapters — WS-D
|
|
1202
1248
|
*
|
|
@@ -1221,89 +1267,233 @@ type HarnessObservabilityAdapter = {
|
|
|
1221
1267
|
};
|
|
1222
1268
|
type FullHarnessAdapters = {
|
|
1223
1269
|
surface: SurfaceType;
|
|
1224
|
-
render
|
|
1225
|
-
browserQa
|
|
1270
|
+
render: HarnessRenderAdapter;
|
|
1271
|
+
browserQa: HarnessBrowserQaAdapter;
|
|
1226
1272
|
observability?: HarnessObservabilityAdapter;
|
|
1227
1273
|
};
|
|
1228
1274
|
|
|
1229
1275
|
/**
|
|
1230
|
-
*
|
|
1276
|
+
* Panel scoring input DTO — v1.7.15
|
|
1231
1277
|
*
|
|
1232
|
-
*
|
|
1278
|
+
* Separates evidence collection from scoring logic.
|
|
1279
|
+
* Every field is required; missing evidence is a MeasurementError.
|
|
1280
|
+
* v1.7.15: screen-level observation, L2 evidence refs required, fail-closed.
|
|
1233
1281
|
*/
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1282
|
+
type RuntimeGateEvidence = {
|
|
1283
|
+
uiRoutes: Array<{
|
|
1284
|
+
screenId: string;
|
|
1285
|
+
route: string;
|
|
1286
|
+
url?: string;
|
|
1287
|
+
rendered: boolean;
|
|
1288
|
+
browserVisited: boolean;
|
|
1289
|
+
httpStatus?: number;
|
|
1290
|
+
renderEvidenceRefs: string[];
|
|
1291
|
+
browserQaEvidenceRefs: string[];
|
|
1292
|
+
}>;
|
|
1293
|
+
evidenceRefs: string[];
|
|
1294
|
+
};
|
|
1295
|
+
type RenderEvidenceSummary = {
|
|
1296
|
+
totalScreens: number;
|
|
1297
|
+
capturedScreens: number;
|
|
1298
|
+
failedScreens: number;
|
|
1299
|
+
viewports: string[];
|
|
1300
|
+
evidenceRefs: string[];
|
|
1301
|
+
};
|
|
1302
|
+
type BrowserQaSummary = {
|
|
1303
|
+
executed: boolean;
|
|
1304
|
+
blockingFindings: number;
|
|
1305
|
+
experienceFindings: number;
|
|
1306
|
+
visualFindings: number;
|
|
1307
|
+
totalFindings: number;
|
|
1308
|
+
phasesExecuted: string[];
|
|
1309
|
+
evidenceRefs: string[];
|
|
1310
|
+
};
|
|
1311
|
+
type ScreenObservation = {
|
|
1312
|
+
screenId: string;
|
|
1313
|
+
route: string;
|
|
1314
|
+
htmlCaptureRef: string;
|
|
1315
|
+
domLabelsFound: string[];
|
|
1316
|
+
elementsPlaced: number;
|
|
1317
|
+
actionsDeclared?: number;
|
|
1318
|
+
actionsObserved?: number;
|
|
1319
|
+
actionsWired: number;
|
|
1320
|
+
missingActions?: string[];
|
|
1321
|
+
mockPathFindings: Array<{
|
|
1322
|
+
id: string;
|
|
1323
|
+
status: "fail" | "finding";
|
|
1324
|
+
}>;
|
|
1325
|
+
browserQaEvidenceRefs: string[];
|
|
1326
|
+
browserQaObserved: boolean;
|
|
1327
|
+
evidenceMissing?: boolean;
|
|
1328
|
+
};
|
|
1329
|
+
type UiObservationSummary = {
|
|
1330
|
+
screens: ScreenObservation[];
|
|
1331
|
+
evidenceRefs: string[];
|
|
1332
|
+
};
|
|
1333
|
+
type SpecCoverageSummary = {
|
|
1334
|
+
declared: {
|
|
1335
|
+
uiRoutes: number;
|
|
1248
1336
|
};
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
phasesFailed: number;
|
|
1252
|
-
phasesSkipped: number;
|
|
1253
|
-
totalFindings: number;
|
|
1337
|
+
checked: {
|
|
1338
|
+
uiOk: number;
|
|
1254
1339
|
};
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
accept: number;
|
|
1258
|
-
refine: number;
|
|
1259
|
-
};
|
|
1340
|
+
missing: {
|
|
1341
|
+
uiRoutes: string[];
|
|
1260
1342
|
};
|
|
1261
|
-
|
|
1343
|
+
evidenceRefs: string[];
|
|
1344
|
+
};
|
|
1345
|
+
type DiscussionAxisInputs = {
|
|
1346
|
+
invariantAxes: number;
|
|
1347
|
+
trendDerivedAxes: number;
|
|
1348
|
+
productSpecificAxes: number;
|
|
1349
|
+
aggregateScore: number;
|
|
1350
|
+
evidenceRefs: string[];
|
|
1351
|
+
degradedScoring?: boolean;
|
|
1352
|
+
};
|
|
1353
|
+
type ScreenContractInputs = {
|
|
1354
|
+
totalContracts: number;
|
|
1355
|
+
coveredContracts: number;
|
|
1356
|
+
fidelityScore: number;
|
|
1357
|
+
evidenceRefs: string[];
|
|
1358
|
+
degradedScoring?: boolean;
|
|
1359
|
+
};
|
|
1360
|
+
type TrendAlignmentInputs = {
|
|
1361
|
+
trendSourcesChecked: number;
|
|
1362
|
+
translationConsistency: number;
|
|
1363
|
+
competitiveGapsCovered: number;
|
|
1364
|
+
evidenceRefs: string[];
|
|
1365
|
+
degradedScoring?: boolean;
|
|
1366
|
+
};
|
|
1367
|
+
type FullHarnessPanelInputs = {
|
|
1368
|
+
runtimeGate: RuntimeGateEvidence;
|
|
1369
|
+
renderEvidence: RenderEvidenceSummary;
|
|
1370
|
+
browserQa: BrowserQaSummary;
|
|
1371
|
+
uiObservation: UiObservationSummary;
|
|
1372
|
+
specCoverage: SpecCoverageSummary;
|
|
1373
|
+
discussionAxes: DiscussionAxisInputs;
|
|
1374
|
+
screenContract: ScreenContractInputs;
|
|
1375
|
+
trendAlignment: TrendAlignmentInputs;
|
|
1262
1376
|
};
|
|
1263
1377
|
|
|
1264
1378
|
/**
|
|
1265
|
-
*
|
|
1266
|
-
*
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
declare function generateReviewSummary(result: LoopResult): ReviewSummary;
|
|
1271
|
-
|
|
1272
|
-
/**
|
|
1273
|
-
* Full-harness runtime — WS-D
|
|
1379
|
+
* Full-harness runtime — v1.7.15
|
|
1380
|
+
*
|
|
1381
|
+
* Measurement-driven orchestration.
|
|
1382
|
+
* Does NOT contain a self-modifying loop.
|
|
1383
|
+
* Each CLI invocation records exactly one iteration of real observation.
|
|
1274
1384
|
*
|
|
1275
|
-
*
|
|
1276
|
-
*
|
|
1277
|
-
*
|
|
1385
|
+
* v1.7.15 breaking changes:
|
|
1386
|
+
* - Panel scores computed from real evidence (no dummy l1/l2=0)
|
|
1387
|
+
* - calibration pack required (no silent fallback)
|
|
1388
|
+
* - reviewer required (no placeholder)
|
|
1389
|
+
* - commitSha required (no silent failure)
|
|
1278
1390
|
*/
|
|
1279
1391
|
|
|
1280
1392
|
type FullHarnessRequest = {
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1393
|
+
root: string;
|
|
1394
|
+
reviewer: string;
|
|
1395
|
+
changeSummary: string[];
|
|
1396
|
+
limitations: string[];
|
|
1397
|
+
discussionDirRelative?: string;
|
|
1398
|
+
calibrationPack: CalibrationPack;
|
|
1399
|
+
calibrationRef: {
|
|
1400
|
+
packPath: string;
|
|
1401
|
+
packVersion: string;
|
|
1402
|
+
configPath?: string;
|
|
1403
|
+
};
|
|
1404
|
+
adapters: FullHarnessAdapters;
|
|
1405
|
+
screenContracts: Array<{
|
|
1406
|
+
screenId: string;
|
|
1407
|
+
route: string;
|
|
1408
|
+
}>;
|
|
1409
|
+
panelInputs: FullHarnessPanelInputs;
|
|
1285
1410
|
};
|
|
1286
1411
|
type FullHarnessResult = {
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1412
|
+
iteration: FullHarnessIteration;
|
|
1413
|
+
history: FullHarnessHistory;
|
|
1414
|
+
calibrationRef: FullHarnessCalibrationRef;
|
|
1415
|
+
fakeUiDetection: FakeUiDetectionResult;
|
|
1416
|
+
exitReason: FullHarnessExitReason;
|
|
1417
|
+
handoff: FullHarnessHandoff;
|
|
1418
|
+
terminationReason: TerminationReason | undefined;
|
|
1419
|
+
isTerminal: boolean;
|
|
1420
|
+
finalDecision: FinalDecision;
|
|
1421
|
+
signoffStatus: ReviewerSignoffStatus;
|
|
1422
|
+
logVerdict: ReviewerLogVerdict;
|
|
1291
1423
|
};
|
|
1292
1424
|
/**
|
|
1293
|
-
* Run
|
|
1425
|
+
* Run a single full-harness measurement iteration.
|
|
1294
1426
|
*
|
|
1295
|
-
*
|
|
1296
|
-
*
|
|
1297
|
-
*
|
|
1298
|
-
*
|
|
1299
|
-
*
|
|
1427
|
+
* This does NOT loop. Each invocation:
|
|
1428
|
+
* 1. Captures render/browserQa evidence
|
|
1429
|
+
* 2. Scores panels from real evidence inputs
|
|
1430
|
+
* 3. Appends iteration to history
|
|
1431
|
+
* 4. Computes termination
|
|
1300
1432
|
*/
|
|
1301
1433
|
declare function runFullHarness(request: FullHarnessRequest): Promise<FullHarnessResult>;
|
|
1302
1434
|
|
|
1435
|
+
/**
|
|
1436
|
+
* Panel scoring — v1.7.15
|
|
1437
|
+
*
|
|
1438
|
+
* L1 = implementation fidelity panel (runtime gate, render, browser QA blocking, screen contract, spec coverage)
|
|
1439
|
+
* L2 = product experience panel (discussion axes, screen contract fidelity, trend, visual, browser QA experience)
|
|
1440
|
+
* weightedTotal = min(L1.total, L2.total)
|
|
1441
|
+
*
|
|
1442
|
+
* Scores are computed from real evidence inputs only.
|
|
1443
|
+
* Pre-scored metadata.dimensionScores flow-through is prohibited.
|
|
1444
|
+
*/
|
|
1445
|
+
|
|
1446
|
+
declare function computeWeightedTotal(l1: FullHarnessPanelScore, l2: FullHarnessPanelScore): number;
|
|
1447
|
+
declare function determineDecision(weightedTotal: number, thresholds: {
|
|
1448
|
+
accept: number;
|
|
1449
|
+
refine: number;
|
|
1450
|
+
}): Decision;
|
|
1451
|
+
|
|
1452
|
+
/**
|
|
1453
|
+
* Iteration history management — v1.7.15
|
|
1454
|
+
*
|
|
1455
|
+
* Reads previous iterations from prototyping.json,
|
|
1456
|
+
* appends new iteration, recomputes bestIteration/scoringTrace/terminationReason.
|
|
1457
|
+
*/
|
|
1458
|
+
|
|
1459
|
+
declare function loadHistory(root: string): Promise<FullHarnessHistory | null>;
|
|
1460
|
+
declare function appendIteration(history: FullHarnessHistory | null, iteration: FullHarnessIteration): FullHarnessHistory;
|
|
1461
|
+
declare function computeTerminationReason(history: FullHarnessHistory, calibration: {
|
|
1462
|
+
maxIterations: number;
|
|
1463
|
+
plateauDelta: number;
|
|
1464
|
+
plateauLookback: number;
|
|
1465
|
+
thresholds: {
|
|
1466
|
+
accept: number;
|
|
1467
|
+
};
|
|
1468
|
+
}): TerminationReason | undefined;
|
|
1469
|
+
|
|
1470
|
+
/**
|
|
1471
|
+
* Reviewer identity validation — v1.7.15
|
|
1472
|
+
*
|
|
1473
|
+
* CLI --reviewer is mandatory for full-harness.
|
|
1474
|
+
* Placeholders are rejected.
|
|
1475
|
+
*/
|
|
1476
|
+
declare function validateReviewer(reviewer: string | undefined): string;
|
|
1477
|
+
|
|
1478
|
+
/**
|
|
1479
|
+
* Git revision resolution — v1.7.15
|
|
1480
|
+
*
|
|
1481
|
+
* Resolves current commit SHA from `.git/HEAD`, with support for:
|
|
1482
|
+
* - Standard `.git/` directory layouts
|
|
1483
|
+
* - Linked worktrees (where `.git` is a file containing `gitdir: <path>`
|
|
1484
|
+
* and the worktree gitdir has a `commondir` file pointing at the main
|
|
1485
|
+
* repository's `.git` directory; `refs/heads/*` and `packed-refs` live
|
|
1486
|
+
* in that common gitdir, not the worktree-local gitdir)
|
|
1487
|
+
* - `packed-refs` fallback when the loose ref file is absent
|
|
1488
|
+
*
|
|
1489
|
+
* Full-harness requires commitSha on every iteration.
|
|
1490
|
+
*/
|
|
1491
|
+
declare function resolveCommitSha(root: string): Promise<string>;
|
|
1492
|
+
|
|
1303
1493
|
declare function createPlaywrightRenderAdapter(input: {
|
|
1304
1494
|
targetUrl?: string;
|
|
1305
1495
|
}): RenderCaptureAdapter;
|
|
1306
1496
|
|
|
1307
1497
|
declare function createPlaywrightBrowserQaProvider(): BrowserQaProvider;
|
|
1308
1498
|
|
|
1309
|
-
export { type AtddCodeTraceabilityResult, type AtddForbiddenRef, type AtddSpecRefs, type AtddTestKind, type AtddTraceabilityMissing, type AtddTraceabilityScan, type AtddUnknownRef, type AtddUnknownRefKind, BROWSER_QA_PHASES, type ConfigLoadResult, type ConfigPathKey, type ConfigSearchResult, type DecisionGuardrail, type DecisionGuardrailEntry, type DiscussionModeRecommendation, type DiscussionRecommendationSourceSchema, type FailOn, type FullHarnessRequest, type FullHarnessResult, type GuardrailCheckResult, type GuardrailIssue, type GuardrailIssueSeverity, type GuardrailLoadError, type GuardrailLoadResult, type GuardrailType, ID_PREFIXES, type IdFormatPrefix, type IdPrefix, type Issue, type IssueCategory, type IssueLocation, type IssueSeverity, type
|
|
1499
|
+
export { type AtddCodeTraceabilityResult, type AtddForbiddenRef, type AtddSpecRefs, type AtddTestKind, type AtddTraceabilityMissing, type AtddTraceabilityScan, type AtddUnknownRef, type AtddUnknownRefKind, BROWSER_QA_PHASES, type ConfigLoadResult, type ConfigPathKey, type ConfigSearchResult, DISCUSSION_NON_UI_SURFACES, DISCUSSION_UI_BEARING_SURFACES, type DecisionGuardrail, type DecisionGuardrailEntry, type DiscussionModeRecommendation, type DiscussionRecommendationSourceSchema, FULL_HARNESS_INVALID_COMBINATION_MESSAGE, type FailOn, type FullHarnessCalibrationRef, type FullHarnessHistory, type FullHarnessIteration, type FullHarnessPanelScore, type FullHarnessRequest, type FullHarnessResult, type GuardrailCheckResult, type GuardrailIssue, type GuardrailIssueSeverity, type GuardrailLoadError, type GuardrailLoadResult, type GuardrailType, ID_PREFIXES, type IdFormatPrefix, type IdPrefix, type Issue, type IssueCategory, type IssueLocation, type IssueSeverity, type MeasurementInput, type MeasurementResult, type ModeResolutionInput, type ModeResolutionResult, type ModeSelectionSource, NON_UI_PROTOTYPING_SURFACE_MESSAGE, NON_UI_PROTOTYPING_SURFACE_REASON_CODE, type OrphanContractsPolicy, type OutputFormat, type ParseDiscussionResult, type PrototypingExecutionConfig, type PrototypingExecutionRequest, type PrototypingExecutionResult, type PrototypingMode, type PrototypingObligations, type PrototypingSurface, type QfaiConfig, type QfaiOutputConfig, type QfaiPaths, type QfaiPrototypingCalibrationConfig, type QfaiPrototypingConfig, type QfaiUiuxAuditConfig, type QfaiUiuxConfig, type QfaiValidationConfig, REVIEWER_PLACEHOLDERS, type ReportChangeType, type ReportChangeTypeSummary, type ReportChangeTypeWarning, type ReportContractCoverage, type ReportData, type ReportDeltaCoverage, type ReportFullHarnessExecution, type ReportGuardrailItem, type ReportGuardrails, type ReportIds, type ReportPrototypingSummary, type ReportRuleFinding, type ReportSpecContractRefs, type ReportSpecCoverage, type ReportSummary, type ReportSurfaceClassification, type ReportTddCoverage, type ReportTddCoverageSpec, type ReportTestStrategy, type ReportTraceability, type ReportWaivers, type ResolveModeInput, type ResolvedModeSummary, type RunSddPreflightOptions, type SddPreflightResult, type SddPreflightSource, type SddPreflightStatus, type TerminationReason, type TraceabilitySeverity, UNSUPPORTED_PROTOTYPING_MODE_MESSAGE, UNSUPPORTED_PROTOTYPING_MODE_REASON_CODE, type UiFidelityStatus, VISUAL_BROWSER_SURFACES, type ValidationCounts, type ValidationOptions, type ValidationPhase, type ValidationResult, type ValidationTraceability, type ValidationWaiverAction, type ValidationWaiverDowngradeTo, type ValidationWaiverEntry, type ValidationWaiverMatch, type ValidationWaiverScope, type ValidationWaiverSeverity, type ValidationWaiverSuppressed, type ValidationWaivers, appendIteration, checkDecisionGuardrails, computeTerminationReason, computeWeightedTotal, createPlaywrightBrowserQaProvider, createPlaywrightRenderAdapter, createReportData, defaultConfig, derivePrototypingObligations, determineDecision, evaluateAtddCodeTraceability, extractAcSpecNumber, extractAllIds, extractBrSpecNumber, extractCapSpecNumber, extractCaseSpecNumber, extractDecisionGuardrailsFromMarkdown, extractIds, extractInvalidIds, extractScSpecNumber, extractSpecNumber, extractUsSpecNumber, filterDecisionGuardrailsByKeyword, findConfigRoot, formatGuardrailsForLlm, formatReportJson, formatReportMarkdown, getConfigPath, inferSurfaceFromRecommendationAndEvidence, isDiscussionUiBearingSurfaceType, isNonUiDiscussionSurface, isValidPrototypingMode, isValidPrototypingSurface, lintSql, loadConfig, loadDecisionGuardrails, loadHistory, normalizeAllowedModes, normalizeDecisionGuardrails, normalizeSurface, parseDiscussionFromObject, parseDiscussionModeRecommendation, parseDiscussionModeRecommendationWithWarnings, requiresVisualBrowserEvidence, resolveCommitSha, resolvePath, resolvePrototypingMode, resolvePrototypingModeFromInput, resolveToolVersion, runBrowserQaOrchestrated, runFullHarness, runPrototypingExecution, runRenderCapture, runSddPreflight, sortDecisionGuardrails, summarizeBrowserQaResult, summarizeResolvedMode, validateAtddCodeTraceability, validateContracts, validateDefinedIds, validateLayeredTraceability, validateOrphanProhibition, validateProject, validateReviewer, validateSpecSplitByCapability, validateTraceability, writeEvidenceBundles };
|