PASS tests/date-range-warning.test.ts
  Date-Range Warning Modal (Phase 4)
    ΓêÜ modal shows for date range > 365 days (89 ms)
    ΓêÜ clicking "Adjust Range" returns false (cancels load) (7 ms)
    ΓêÜ clicking "Continue Anyway" returns true (proceeds with load) (7 ms)
    ΓêÜ modal does not show for date range <= 365 days (2 ms)
    ΓêÜ modal displays correct day count (7 ms)
    ΓêÜ modal can be shown multiple times (6 ms)

PASS tests/local-mode-integration.test.ts (6.03 s)
  Local Mode Integration
    UI State Changes
      ΓêÜ hides download button in local mode (51 ms)
      ΓêÜ displays "Local Dashboard" in header (46 ms)
    Dataset Loading
      ΓêÜ requests dataset from configured DATASET_PATH (5 ms)
      ΓêÜ uses default path when DATASET_PATH not set (4 ms)
    Error Handling
      ΓêÜ shows error state when dataset-manifest.json missing (7 ms)
    Mode Detection
      ΓêÜ isLocalMode returns true when LOCAL_DASHBOARD_MODE is true (2 ms)
      ΓêÜ isLocalMode returns false for non-boolean truthy values (1 ms)
      ΓêÜ getLocalDatasetPath returns DATASET_PATH or default (2 ms)

PASS tests/error-codes.test.ts (6.074 s)
  Error Codes
    ErrorCodes object
      ΓêÜ defines all required error types (17 ms)
      ΓêÜ each error has required fields (13 ms)
      ΓêÜ defines predictions-specific errors (1 ms)
      ΓêÜ defines AI insights-specific errors (1 ms)
    getErrorByCode
      ΓêÜ finds error by code string
      ΓêÜ returns null for unknown code
      ΓêÜ finds predictions error codes (1 ms)
    createErrorMessage
      ΓêÜ creates message from error key (30 ms)
      ΓêÜ includes optional details in message
      ΓêÜ falls back to UNKNOWN for invalid key

PASS tests/sdk-bundling.test.ts
  SDK Bundling Integrity
    VSS.SDK.min.js
      ΓêÜ exists in extension/ui folder (2 ms)
      ΓêÜ is non-empty (1 ms)
      ΓêÜ contains VSS namespace definition
    index.html
      ΓêÜ references local SDK file
      ΓêÜ does not reference versioned CDN URL (1 ms)
      ΓêÜ loads SDK before other scripts
    settings.html
      ΓêÜ references local SDK file (2 ms)
      ΓêÜ does not reference versioned CDN URL
      ΓêÜ loads SDK before settings.js (1 ms)
    package.json
      ΓêÜ includes vss-web-extension-sdk dependency

PASS tests/metrics.test.ts
  Metrics Collector (Phase 4)
    ΓêÜ Production mode ignores __DASHBOARD_DEBUG__ (1 ms)
    ΓêÜ Production mode ignores ?debug param (1 ms)
    ΓêÜ Debug mode enables metrics with __DASHBOARD_DEBUG__
    ΓêÜ Debug mode enables metrics with ?debug param (1 ms)
    ΓêÜ Metrics collector mark() creates performance mark (2 ms)
    ΓêÜ Metrics collector measure() creates performance measure (2 ms)
    ΓêÜ Metrics collector reset() clears all metrics (1 ms)

  console.warn
    Advisory: innerHTML patterns that may need review: [
      'E:\\projects\\ado-git-repo-insights\\extension\\ui\\dashboard.ts:1260: innerHTML with arrow - consider using escapeHtml()',
      'E:\\projects\\ado-git-repo-insights\\extension\\ui\\dashboard.ts:1260: innerHTML with sign - consider using escapeHtml()',
      'E:\\projects\\ado-git-repo-insights\\extension\\ui\\dashboard.ts:1260: innerHTML with absChange.toFixed(0) - consider using escapeHtml()',
      'E:\\projects\\ado-git-repo-insights\\extension\\ui\\dashboard.ts:1701: innerHTML with svgContent - consider using escapeHtml()',
      'E:\\projects\\ado-git-repo-insights\\extension\\ui\\dashboard.ts:1701: innerHTML with legendHtml - consider using escapeHtml()'
    ]

    [0m [90m 148 |[39m     [90m// The violations list helps identify areas that may need additional review[39m
     [90m 149 |[39m     [36mif[39m (violations[33m.[39mlength [33m>[39m [35m0[39m) {
    [31m[1m>[22m[39m[90m 150 |[39m       console[33m.[39mwarn(
     [90m     |[39m               [31m[1m^[22m[39m
     [90m 151 |[39m         [32m"Advisory: innerHTML patterns that may need review:"[39m[33m,[39m
     [90m 152 |[39m         violations[33m.[39mslice([35m0[39m[33m,[39m [35m5[39m)[33m,[39m
     [90m 153 |[39m       )[33m;[39m[0m

      at Object.<anonymous> (tests/security-invariants.test.ts:150:15)

PASS tests/security-invariants.test.ts (6.417 s)
  Security Invariants
    ΓêÜ No shell: true in extension source code (20 ms)
    ΓêÜ No innerHTML with template literals containing variables in UI source (63 ms)
    ΓêÜ Python executable allowlist is enforced (1 ms)
    ΓêÜ Path traversal protection utility exists (1 ms)

PASS tests/ado-sdk.test.ts
  ADO SDK Mocks
    createSdkMock
      ΓêÜ creates mock with default values (2 ms)
      ΓêÜ allows custom access token
      ΓêÜ allows custom web context (1 ms)
      ΓêÜ provides required SDK methods (1 ms)
    createBuildApiMock
      ΓêÜ returns successful runs and artifacts for SUCCESS scenario (1 ms)
      ΓêÜ returns empty runs for NO_RUNS scenario (1 ms)
      ΓêÜ returns empty artifacts for NO_ARTIFACTS scenario (1 ms)
      ΓêÜ throws 403 for PERMISSION_DENIED scenario (1 ms)
      ΓêÜ throws 404 for NOT_FOUND scenario
      ΓêÜ throws 503 for TRANSIENT_ERROR scenario (1 ms)
      ΓêÜ generates artifact content URLs
    installSdkMocks
      ΓêÜ installs SDK on global object (1 ms)
      ΓêÜ returns the created SDK
    BuildApiScenarios
      ΓêÜ defines all required scenarios

PASS tests/vsix-packaging.test.ts
  VSIX Packaging Contract (Tier A)
    Addressable Files Configuration
      ΓêÜ must package dist/ui (compiled), not ui (source) (3 ms)
      ΓêÜ dist/ui directory must exist at test time (1 ms)
    Contribution URI Validation (ALL entrypoints)
      ΓêÜ every contribution with a URI must reference an existing file (1 ms)
      ΓêÜ all hub contributions must reference dist/ui/ (2 ms)
      ΓêÜ no contribution URI should reference old ui/ path (1 ms)
    dist/ui Contains Required Assets
      ΓêÜ must contain dashboard.js (1 ms)
      ΓêÜ must contain settings.js
      ΓêÜ must contain index.html (1 ms)
      ΓêÜ must contain settings.html (31 ms)
      ΓêÜ must contain styles.css (1 ms)
      ΓêÜ must contain VSS.SDK.min.js
      ΓêÜ must contain error-types.js (1 ms)
      ΓêÜ must contain artifact-client.js
      ΓêÜ must contain dataset-loader.js
    No TypeScript Source in dist/ui
      ΓêÜ must NOT contain any source .ts files (excluding .d.ts declarations)
    IIFE Format Invariant (Critical - Prevents tsc Overwrite)
      ΓêÜ dashboard.js must be IIFE format (no import/export) (2 ms)
      ΓêÜ settings.js must be IIFE format (no import/export) (2 ms)
      ΓêÜ dataset-loader.js must be IIFE format (no import/export) (1 ms)
      ΓêÜ artifact-client.js must be IIFE format (no import/export) (3 ms)
      ΓêÜ error-types.js must be IIFE format (no import/export) (1 ms)
      ΓêÜ dashboard.js must expose expected global (1 ms)
      ΓêÜ settings.js must expose expected global (1 ms)
    HTML References Correct JS Files
      ΓêÜ index.html must reference .js files (not .ts) (1 ms)
      ΓêÜ settings.html must reference .js files (not .ts) (1 ms)

PASS tests/api-patterns.test.ts
  Build API Call Patterns
    getDefinitions queryOrder requirement
      ΓêÜ should verify ALL getDefinitions calls in dashboard.ts have queryOrder at position 5 (23 ms)
      ΓêÜ should verify ALL getDefinitions calls in settings.ts have queryOrder at position 5 (16 ms)
      ΓêÜ should have at least 3 getDefinitions calls in dashboard.ts with correct pattern (1 ms)
      ΓêÜ should document the API parameter signature for reference (1 ms)
    DefinitionQueryOrder enum values
      ΓêÜ should have definitionNameAscending = 2 (1 ms)
      ΓêÜ should use definitionNameAscending (2) as the standard queryOrder value

PASS tests/pipeline-artifact-url.test.ts
  Artifact File Access
    downloadUrl Construction
      ΓêÜ replaces format=zip with format=file (17 ms)
      ΓêÜ adds format=file if not present (1 ms)
      ΓêÜ adds subPath parameter with URL-encoded path (4 ms)
      ΓêÜ normalizes path to have leading slash
      ΓêÜ handles nested paths correctly (1 ms)
    Artifact File Paths
      ΓêÜ manifest is at artifact ROOT, not in aggregates subfolder
      ΓêÜ dimensions.json is inside aggregates subfolder (1 ms)
      ΓêÜ weekly rollup paths from manifest include aggregates prefix
      ΓêÜ distribution paths from manifest include aggregates prefix (1 ms)
    Regression Prevention
      ΓêÜ Build API does NOT support $format=file
      ΓêÜ downloadUrl is the correct approach for Pipeline Artifacts
      ΓêÜ subPath must have leading slash for root-level files (1 ms)

  console.warn
    Could not clear stale setting: Error: Storage error
        at Object.<anonymous> (E:\projects\ado-git-repo-insights\extension\tests\production-issues.test.ts:393:47)
        at Promise.then.completed (E:\projects\ado-git-repo-insights\extension\node_modules\jest-circus\build\utils.js:298:28)
        at new Promise (<anonymous>)
        at callAsyncCircusFn (E:\projects\ado-git-repo-insights\extension\node_modules\jest-circus\build\utils.js:231:10)
        at _callCircusTest (E:\projects\ado-git-repo-insights\extension\node_modules\jest-circus\build\run.js:316:40)
        at processTicksAndRejections (node:internal/process/task_queues:103:5)
        at _runTest (E:\projects\ado-git-repo-insights\extension\node_modules\jest-circus\build\run.js:252:3)
        at _runTestsForDescribeBlock (E:\projects\ado-git-repo-insights\extension\node_modules\jest-circus\build\run.js:126:9)
        at _runTestsForDescribeBlock (E:\projects\ado-git-repo-insights\extension\node_modules\jest-circus\build\run.js:121:9)
        at _runTestsForDescribeBlock (E:\projects\ado-git-repo-insights\extension\node_modules\jest-circus\build\run.js:121:9)
        at run (E:\projects\ado-git-repo-insights\extension\node_modules\jest-circus\build\run.js:71:3)
        at runAndTransformResultsToJestFormat (E:\projects\ado-git-repo-insights\extension\node_modules\jest-circus\build\legacy-code-todo-rewrite\jestAdapterInit.js:122:21)
        at jestAdapter (E:\projects\ado-git-repo-insights\extension\node_modules\jest-circus\build\legacy-code-todo-rewrite\jestAdapter.js:79:19)
        at runTestInternal (E:\projects\ado-git-repo-insights\extension\node_modules\jest-runner\build\runTest.js:367:16)
        at runTest (E:\projects\ado-git-repo-insights\extension\node_modules\jest-runner\build\runTest.js:444:34)
        at Object.worker (E:\projects\ado-git-repo-insights\extension\node_modules\jest-runner\build\testWorker.js:106:12)

    [0m [90m 400 |[39m           })[33m;[39m
     [90m 401 |[39m         } [36mcatch[39m (e) {
    [31m[1m>[22m[39m[90m 402 |[39m           console[33m.[39mwarn([32m"Could not clear stale setting:"[39m[33m,[39m e)[33m;[39m
     [90m     |[39m                   [31m[1m^[22m[39m
     [90m 403 |[39m           [90m// Don't rethrow - this is best-effort cleanup[39m
     [90m 404 |[39m         }
     [90m 405 |[39m       }[33m;[39m[0m

      at clearStalePipelineSetting (tests/production-issues.test.ts:402:19)
      at Object.<anonymous> (tests/production-issues.test.ts:408:7)

PASS tests/cross-project-settings.test.ts (6.89 s)
  Cross-Project Settings
    dashboard.ts configuration
      ΓêÜ should have SETTINGS_KEY_PROJECT constant (13 ms)
      ΓêÜ should have SETTINGS_KEY_PIPELINE constant (1 ms)
      ΓêÜ should have getSourceConfig function that returns both projectId and pipelineId (9 ms)
      ΓêÜ should read project setting with SETTINGS_KEY_PROJECT (1 ms)
      ΓêÜ should log source project origin (14 ms)
      ΓêÜ should use targetProjectId for ArtifactClient initialization (2 ms)
      ΓêÜ should pass targetProjectId to resolveFromPipelineId (13 ms)
      ΓêÜ should pass targetProjectId to discoverAndResolve (2 ms)
    settings.ts configuration
      ΓêÜ should have SETTINGS_KEY_PROJECT constant matching dashboard (1 ms)
      ΓêÜ should have SETTINGS_KEY_PIPELINE constant matching dashboard
      ΓêÜ should have tryLoadProjectDropdown for graceful degradation (1 ms)
      ΓêÜ should have getOrganizationProjects for dropdown population (20 ms)
      ΓêÜ should have projectDropdownAvailable flag
      ΓêÜ should save project ID separately from pipeline ID
    settings keys consistency
      ΓêÜ should use the same settings keys in both files (1 ms)
    vss-extension.json manifest
      ΓêÜ should have vso.project scope for listing projects
      ΓêÜ should have vso.build scope for accessing artifacts
      ΓêÜ should have vso.settings scope for extension data

PASS tests/production-issues.test.ts (6.925 s)
  Issue 1: PartiallySucceeded Builds Acceptance
    resultFilter bitmask
      ΓêÜ should use resultFilter=6 to include both Succeeded and PartiallySucceeded (40 ms)
      ΓêÜ resultFilter=2 excludes PartiallySucceeded builds (1 ms)
      ΓêÜ resultFilter=6 includes PartiallySucceeded builds
      ΓêÜ resultFilter=6 includes Succeeded builds
      ΓêÜ resultFilter=6 excludes Failed builds (31 ms)
    Build filtering logic
      ΓêÜ old resultFilter=2 would miss first-run PartiallySucceeded builds (2 ms)
      ΓêÜ new resultFilter=6 includes first-run PartiallySucceeded builds (1 ms)
      ΓêÜ new resultFilter=6 still excludes Failed and Canceled builds (1 ms)
    First-run scenario simulation
      ΓêÜ first run build should be detected with new resultFilter (1 ms)
      ΓêÜ subsequent successful runs should still be detected
    Error message clarity
      ΓêÜ error message mentions PartiallySucceeded as acceptable (1 ms)
      ΓêÜ error message explains why first runs may be partial (1 ms)
  Issue 2: Stale Settings and Auto-Discovery Fallback
    Settings persistence behavior
      ΓêÜ Extension Data Service settings persist across reinstalls
    Configuration resolution with fallback
      ΓêÜ uses saved pipelineId when valid (4 ms)
      ΓêÜ falls back to discovery when saved pipelineId is invalid (1 ms)
      ΓêÜ clears stale setting automatically on fallback (1 ms)
      ΓêÜ does NOT fall back when query pipelineId fails (explicit override) (60 ms)
      ΓêÜ uses discovery when no settings exist (1 ms)
    clearStalePipelineSetting behavior
      ΓêÜ sets pipeline setting to null (1 ms)
      ΓêÜ handles errors gracefully without throwing (105 ms)
    Settings page validation
      ΓêÜ returns valid=true for existing pipeline with builds (1 ms)
      ΓêÜ returns valid=false when pipeline definition not found (deleted) (2 ms)
      ΓêÜ returns valid=false when no successful builds exist (1 ms)
    Re-discover pipelines functionality
      ΓêÜ discovers pipelines with aggregates artifact (1 ms)
      ΓêÜ returns empty when no pipelines have aggregates
      ΓêÜ skips pipelines with no successful builds (1 ms)
    End-to-end scenario: Extension reinstall
      ΓêÜ automatically discovers new pipeline after reinstall (1 ms)
      ΓêÜ next load uses discovery directly after stale setting cleared (1 ms)
  Combined: First-run PartiallySucceeded + Auto-discovery
    ΓêÜ discovers first-run PartiallySucceeded build after reinstall (1 ms)
    ΓêÜ old resultFilter would have missed first-run after reinstall
  Regression Prevention
    resultFilter value must be 6
      ΓêÜ resolveFromPipelineId should use resultFilter=6
      ΓêÜ discoverInsightsPipelines should use resultFilter=6
    Fallback behavior must be preserved
      ΓêÜ saved pipeline errors should trigger discovery fallback
      ΓêÜ query param errors should NOT trigger discovery fallback (1 ms)
    Settings clearing must be automatic
      ΓêÜ stale settings should be cleared on fallback (1 ms)
  Phase 5 Feature Flag (Predictions & AI Insights)
    Feature flag behavior
      ΓêÜ ENABLE_PHASE5_FEATURES should be true (Phase 5 enabled) (20 ms)
      ΓêÜ Phase 5 tabs should be hidden when feature flag is false (2 ms)
      ΓêÜ Phase 5 tabs should be visible when feature flag is true (1 ms)
    initializePhase5Features function
      ΓêÜ does not modify tabs when flag is false (4 ms)
      ΓêÜ shows tabs when flag is true (2 ms)
    Coming Soon state
      ΓêÜ Phase 5 tabs have "hidden" class by default in HTML (116 ms)
      ΓêÜ Phase 5 tabs have "phase5-tab" marker class (9 ms)
      ΓêÜ Phase 5 content shows "Coming Soon" message (15 ms)
      ΓêÜ Phase 5 content has "coming-soon" CSS class (22 ms)
    Regression prevention
      ΓêÜ Phase 5 feature flag constant must exist (3 ms)
      ΓêÜ When Phase 5 is enabled, tabs should become visible (25 ms)

FAIL tests/synthetic-fixtures.test.ts
  ΓùÅ Test suite failed to run

    tests/synthetic-fixtures.test.ts:157:37 - error TS2339: Property 'users' does not exist on type 'DimensionsData'.

    157     expect(Array.isArray(dimensions.users)).toBe(true);
                                            ~~~~~

PASS tests/dataset-loader-nested.test.ts (7.077 s)
  DatasetLoader Nested Layout Resolution
    DATASET_CANDIDATE_PATHS
      ΓêÜ includes only supported candidate paths in priority order (13 ms)
    resolveDatasetRoot
      ΓêÜ finds manifest at root (base URL) (4 ms)
      ΓêÜ finds manifest in aggregates/ subdirectory (2 ms)
      ΓêÜ deprecated aggregates/aggregates layout is NOT supported (1 ms)
      ΓêÜ returns null when manifest not found in any candidate (1 ms)
      ΓêÜ handles network errors gracefully and continues probing (1 ms)
      ΓêÜ caches result and returns same value on subsequent calls (1 ms)
      ΓêÜ works with empty base URL (1 ms)
    loadManifest with nested layouts
      ΓêÜ auto-resolves dataset root before loading manifest (2 ms)
      ΓêÜ uses resolved effective base URL for all subsequent paths (2 ms)
    resolvePath with effective base URL
      ΓêÜ uses effective base URL after resolution (1 ms)
      ΓêÜ falls back to base URL when resolution finds nothing

PASS tests/auth-pattern.test.ts (7.204 s)
  ArtifactClient Authentication Pattern
    initialize()
      ΓêÜ should use VSS.getAccessToken() for authentication (12 ms)
      ΓêÜ should NOT use VSS.getService() for authentication (2 ms)
      ΓêÜ should extract token from getAccessToken result correctly (1 ms)
      ΓêÜ should handle getAccessToken returning token in correct format (1 ms)
    SDK ServiceIds verification
      ΓêÜ should verify AuthTokenService is NOT in bundled SDK ServiceIds (1 ms)
      ΓêÜ should verify VSS.getAccessToken exists as the correct auth method (2 ms)
    authenticated fetch behavior
      ΓêÜ should use Bearer token in Authorization header (2 ms)

  console.log
    [DatasetLoader] Found manifest at: E:\projects\ado-git-repo-insights\extension\tests\fixtures\legacy-datasets/dataset-manifest.json

      at DatasetLoader.resolveDatasetRoot (ui/dataset-loader.ts:371:19)

  console.log
    [DatasetLoader] Found manifest at: E:\projects\ado-git-repo-insights\extension\tests\fixtures\legacy-datasets/dataset-manifest.json

      at DatasetLoader.resolveDatasetRoot (ui/dataset-loader.ts:371:19)

  console.log
    [DatasetLoader] Found manifest at: E:\projects\ado-git-repo-insights\extension\tests\fixtures\legacy-datasets/dataset-manifest.json

      at DatasetLoader.resolveDatasetRoot (ui/dataset-loader.ts:371:19)

  console.log
    [DatasetLoader] Found manifest at: E:\projects\ado-git-repo-insights\extension\tests\fixtures\legacy-datasets/dataset-manifest.json

      at DatasetLoader.resolveDatasetRoot (ui/dataset-loader.ts:371:19)

  console.log
    [DatasetLoader] Found manifest at: E:\projects\ado-git-repo-insights\extension\tests\fixtures\legacy-datasets/dataset-manifest.json

      at DatasetLoader.resolveDatasetRoot (ui/dataset-loader.ts:371:19)

  console.log
    [DatasetLoader] Found manifest at: E:\projects\ado-git-repo-insights\extension\tests\fixtures\legacy-datasets/dataset-manifest.json

      at DatasetLoader.resolveDatasetRoot (ui/dataset-loader.ts:371:19)

PASS tests/version-adapter-integration.test.ts (7.193 s)
  Version Adapter Integration
    getWeeklyRollups (synchronous loading)
      ΓêÜ normalizes v1.0 rollup (minimal fields) (84 ms)
      ΓêÜ normalizes v1.1 rollup (with cycle times) (5 ms)
      ΓêÜ normalizes v1.2 rollup (with contributors) (4 ms)
      ΓêÜ preserves current schema without data loss (8 ms)
    getWeeklyRollupsWithProgress (concurrent loading)
      ΓêÜ normalizes rollups in concurrent path (10 ms)
    Graceful degradation
      ΓêÜ handles malformed rollup gracefully (4 ms)

PASS tests/fixtures.test.ts (7.319 s)
  Golden Fixtures
    Fixture files exist
      ΓêÜ has dataset-manifest.json (35 ms)
      ΓêÜ has dimensions.json
      ΓêÜ has weekly rollup fixture
      ΓêÜ has predictions fixture (1 ms)
      ΓêÜ has insights fixture (1 ms)
    Fixture schema validation
      ΓêÜ manifest has required schema versions (1 ms)
      ΓêÜ manifest has required feature flags (1 ms)
      ΓêÜ predictions fixture passes schema validation (1 ms)
      ΓêÜ insights fixture passes schema validation
    Fixture content validation
      ΓêÜ weekly rollup has expected structure (2 ms)
      ΓêÜ dimensions has filter values
      ΓêÜ predictions has forecasts array
      ΓêÜ insights has all severity levels (1 ms)

  console.error
    [DatasetLoader] Invalid predictions schema: Unsupported schema version: 99

    [0m [90m 828 |[39m       [36mconst[39m validationResult [33m=[39m [36mthis[39m[33m.[39mvalidatePredictionsSchema(predictions)[33m;[39m
     [90m 829 |[39m       [36mif[39m ([33m![39mvalidationResult[33m.[39mvalid) {
    [31m[1m>[22m[39m[90m 830 |[39m         console[33m.[39merror(
     [90m     |[39m                 [31m[1m^[22m[39m
     [90m 831 |[39m           [32m"[DatasetLoader] Invalid predictions schema:"[39m[33m,[39m
     [90m 832 |[39m           validationResult[33m.[39merror[33m,[39m
     [90m 833 |[39m         )[33m;[39m[0m

      at DatasetLoader.loadPredictions (ui/dataset-loader.ts:830:17)
      at Object.<anonymous> (tests/dataset-loader.test.ts:226:22)

  console.error
    [DatasetLoader] Invalid predictions schema: Unsupported schema version: 99

    [0m [90m 828 |[39m       [36mconst[39m validationResult [33m=[39m [36mthis[39m[33m.[39mvalidatePredictionsSchema(predictions)[33m;[39m
     [90m 829 |[39m       [36mif[39m ([33m![39mvalidationResult[33m.[39mvalid) {
    [31m[1m>[22m[39m[90m 830 |[39m         console[33m.[39merror(
     [90m     |[39m                 [31m[1m^[22m[39m
     [90m 831 |[39m           [32m"[DatasetLoader] Invalid predictions schema:"[39m[33m,[39m
     [90m 832 |[39m           validationResult[33m.[39merror[33m,[39m
     [90m 833 |[39m         )[33m;[39m[0m

      at DatasetLoader.loadPredictions (ui/dataset-loader.ts:830:17)
      at Object.<anonymous> (tests/dataset-loader.test.ts:273:24)

  console.error
    [DatasetLoader] Invalid insights schema: Unsupported schema version: 99

    [0m [90m 877 |[39m       [36mconst[39m validationResult [33m=[39m [36mthis[39m[33m.[39mvalidateInsightsSchema(insights)[33m;[39m
     [90m 878 |[39m       [36mif[39m ([33m![39mvalidationResult[33m.[39mvalid) {
    [31m[1m>[22m[39m[90m 879 |[39m         console[33m.[39merror(
     [90m     |[39m                 [31m[1m^[22m[39m
     [90m 880 |[39m           [32m"[DatasetLoader] Invalid insights schema:"[39m[33m,[39m
     [90m 881 |[39m           validationResult[33m.[39merror[33m,[39m
     [90m 882 |[39m         )[33m;[39m[0m

      at DatasetLoader.loadInsights (ui/dataset-loader.ts:879:17)
      at Object.<anonymous> (tests/dataset-loader.test.ts:321:22)

PASS tests/dataset-loader.test.ts (7.416 s)
  DatasetLoader
    validatePredictionsSchema
      ΓêÜ returns { valid: true } for valid input (10 ms)
      ΓêÜ returns { valid: false, error } for missing data (1 ms)
      ΓêÜ returns { valid: false, error } for missing schema_version (18 ms)
      ΓêÜ returns { valid: false, error } for unsupported schema version (1 ms)
      ΓêÜ returns { valid: false, error } for missing forecasts array (1 ms)
      ΓêÜ returns { valid: false, error } for invalid forecast structure
    validateInsightsSchema
      ΓêÜ returns { valid: true } for valid input (1 ms)
      ΓêÜ returns typed error object, never throws (1 ms)
      ΓêÜ returns { valid: false, error } for missing schema_version (1 ms)
      ΓêÜ returns { valid: false, error } for missing insights array
      ΓêÜ returns { valid: false, error } for invalid insight structure
    loadPredictions state machine
      ΓêÜ returns { state: "disabled" } when feature flag is false
      ΓêÜ returns { state: "missing" } on 404 (1 ms)
      ΓêÜ returns { state: "auth" } on 401 (1 ms)
      ΓêÜ returns { state: "auth" } on 403 (1 ms)
      ΓêÜ returns { state: "invalid" } on schema failure (72 ms)
      ΓêÜ returns { state: "ok", data } on success (1 ms)
      ΓêÜ always returns typed state object (never null or undefined) (16 ms)
    loadInsights state machine
      ΓêÜ returns { state: "disabled" } when feature flag is false (1 ms)
      ΓêÜ returns { state: "missing" } on 404
      ΓêÜ returns { state: "auth" } on 401 (1 ms)
      ΓêÜ returns { state: "invalid" } on schema failure (9 ms)
      ΓêÜ returns { state: "ok", data } on success
    isFeatureEnabled
      ΓêÜ returns false when manifest is not loaded
      ΓêÜ returns true when feature flag is true
      ΓêÜ returns false when feature flag is false (1 ms)

PASS tests/vsix-artifact-inspection.test.ts
  VSIX Artifact Inspection (Tier B)
    Actual VSIX Contents
      ΓêÜ VSIX contains dist/ui directory (1 ms)
      ΓêÜ VSIX contains dist/ui/*.js files (1 ms)
      ΓêÜ VSIX contains dist/ui/*.html files
      ΓêÜ VSIX does NOT contain ui/*.ts source files (1 ms)
      ΓêÜ VSIX does NOT contain top-level ui/ directory
      ΓêÜ all contribution URIs resolve to files inside the VSIX

PASS tests/smoke-render.test.ts (7.711 s)
  Smoke Render Tests (ADO Simulation)
    Settings Page
      ΓêÜ settings.html loads scripts without throwing (184 ms)
      ΓêÜ settings.html has required DOM elements (30 ms)
      ΓêÜ settings page is not blank (has visible content) (23 ms)
    Dashboard Page
      ΓêÜ index.html loads all scripts in dependency order without throwing (66 ms)
      ΓêÜ index.html has required DOM elements (48 ms)
      ΓêÜ dashboard page is not blank (has visible content) (34 ms)
      ΓêÜ dashboard exposes DatasetLoader global after script load (33 ms)
    Script Format Validation (No ESM)
      ΓêÜ dashboard.js does not use ESM import/export syntax (1 ms)
      ΓêÜ settings.js does not use ESM import/export syntax

PASS tests/dashboard.test.ts (8.05 s)
  Dashboard Rendering
    renderPredictions
      ΓêÜ handles null input safely (never throws) (16 ms)
      ΓêÜ handles undefined input safely (never throws) (4 ms)
      ΓêÜ renders stub warning when is_stub=true (4 ms)
      ΓêÜ does not render stub warning when is_stub=false (3 ms)
      ΓêÜ handles null container safely (1 ms)
    renderAIInsights
      ΓêÜ groups insights by severity correctly (10 ms)
      ΓêÜ handles null input safely (never throws) (2 ms)
      ΓêÜ handles undefined input safely (never throws) (1 ms)
      ΓêÜ renders stub warning when is_stub=true (2 ms)
    Error State Rendering
      ΓêÜ Missing state shows "Not generated yet" message for predictions (3 ms)
      ΓêÜ Invalid state shows "Unable to display" + diagnostic code for predictions (3 ms)
      ΓêÜ Empty state shows "No data yet" message for insights (2 ms)
      ΓêÜ Invalid state shows "Unable to display" + diagnostic code for insights (2 ms)
      ΓêÜ rendering functions handle null container (never throw) (2 ms)
    Date-Range Warning UX
      ΓêÜ Range > 365 days ΓåÆ modal visible, load blocked (6 ms)
      ΓêÜ "Adjust Range" click ΓåÆ modal hidden, returns false (load cancelled) (3 ms)
      ΓêÜ "Continue" click ΓåÆ modal hidden, returns true (load proceeds) (3 ms)
      ΓêÜ Modal displays correct day count (2 ms)
      ΓêÜ Modal can be shown multiple times (5 ms)
      applyCustomDates integration
        ΓêÜ Range <= 365 days ΓåÆ no modal, load proceeds immediately (2 ms)
        ΓêÜ Range exactly 366 days ΓåÆ modal shown (2 ms)
        ΓêÜ Large range + user cancels ΓåÆ load cancelled (1 ms)
  Utility Functions
    formatDuration
      ΓêÜ formats minutes correctly
      ΓêÜ formats hours correctly
      ΓêÜ formats days correctly (1 ms)
      ΓêÜ rounds minutes properly
    median
      ΓêÜ calculates median for odd-length arrays
      ΓêÜ calculates median for even-length arrays
      ΓêÜ handles edge cases (1 ms)
  Sprint 1: Trend Deltas & Metrics
    calculateMetrics
      ΓêÜ calculates metrics from rollups correctly
      ΓêÜ handles empty rollups (1 ms)
      ΓêÜ handles null/undefined rollups
      ΓêÜ handles missing fields in rollups
      ΓêÜ filters out null cycle time values
    calculatePercentChange
      ΓêÜ calculates positive change correctly (1 ms)
      ΓêÜ calculates negative change correctly
      ΓêÜ returns null for zero previous value
      ΓêÜ returns null for null/undefined values (1 ms)
      ΓêÜ handles zero current value
    getPreviousPeriod
      ΓêÜ calculates previous period correctly for 30-day range
      ΓêÜ calculates previous period correctly for 90-day range
      ΓêÜ handles year boundaries
    renderDelta
      ΓêÜ renders positive delta with up arrow (2 ms)
      ΓêÜ renders negative delta with down arrow (1 ms)
      ΓêÜ renders neutral delta for small changes (1 ms)
      ΓêÜ applies inverse logic for cycle time (lower is better) (1 ms)
      ΓêÜ clears element for null percentChange (1 ms)
      ΓêÜ handles null element without throwing
      ΓêÜ handles boundary value of exactly 2% (2 ms)
      ΓêÜ handles boundary value of -2% (1 ms)
  Sprint 3: Sparklines & Moving Average
    calculateMovingAverage
      ΓêÜ calculates 4-week moving average correctly (1 ms)
      ΓêÜ handles custom window size
      ΓêÜ handles array shorter than window (1 ms)
      ΓêÜ handles empty array
      ΓêÜ handles single element
    extractSparklineData
      ΓêÜ extracts all metric arrays from rollups (1 ms)
      ΓêÜ handles missing fields with defaults (1 ms)
      ΓêÜ filters out null/undefined cycle times
      ΓêÜ returns empty arrays for null/undefined input
    renderSparkline
      ΓêÜ renders SVG with path elements (3 ms)
      ΓêÜ limits to last 8 data points (1 ms)
      ΓêÜ clears element for insufficient data (1 ms)
      ΓêÜ clears element for null values (1 ms)
      ΓêÜ handles null element without throwing (1 ms)
      ΓêÜ handles flat data (all same values) (1 ms)
      ΓêÜ includes viewBox attribute for proper scaling (1 ms)
  Sprint 4: Charts & Tooltips
    addChartTooltips
      ΓêÜ attaches event listeners to chart dots (4 ms)
      ΓêÜ hides tooltip on mouseleave (4 ms)
      ΓêÜ updates tooltip content on different dot hover (3 ms)
    renderCycleTimeTrend
      ΓêÜ renders no-data message for empty rollups (1 ms)
      ΓêÜ renders no-data message for single rollup (1 ms)
    renderReviewerActivity
      ΓêÜ renders no-data message for empty rollups (1 ms)
      ΓêÜ renders no-data message when all reviewers_count are zero (2 ms)
  Sprint 5: Comparison Mode & Export
    showToast
      ΓêÜ creates toast with success type (3 ms)
      ΓêÜ creates toast with error type (1 ms)
      ΓêÜ defaults to success type (2 ms)
      ΓêÜ removes toast after 3 seconds (3 ms)
    exportToCsv
      ΓêÜ generates valid CSV content (1 ms)
      ΓêÜ handles missing fields gracefully (1 ms)
      ΓêÜ shows error toast for empty data
      ΓêÜ shows error toast for null data
    downloadRawDataZip
      ΓêÜ shows error when buildId is not available (1 ms)
      ΓêÜ shows error when artifact is not found (1 ms)
      ΓêÜ shows error when download URL is missing (1 ms)
      ΓêÜ adds format=zip to URL if not present
      ΓêÜ preserves format=zip if already present
      ΓêÜ handles 403 permission denied
      ΓêÜ handles 401 unauthorized
      ΓêÜ handles other fetch errors (1 ms)
      ΓêÜ hides export menu when called
    Comparison Mode State
      ΓêÜ toggles comparison mode on button click (2 ms)
      ΓêÜ exits comparison mode (2 ms)
    updateComparisonBanner
      ΓêÜ updates banner with formatted date ranges (20 ms)
    URL State Management
      ΓêÜ serializes date range to URL params (2 ms)
      ΓêÜ serializes filters to URL params (1 ms)
      ΓêÜ includes comparison mode flag
      ΓêÜ omits empty values (1 ms)
  Client-Side Filtering (applyFiltersToRollups)
    ΓêÜ returns original rollups when no filters are active
    ΓêÜ filters by repository using by_repository slices (1 ms)
    ΓêÜ aggregates metrics across multiple selected repos (1 ms)
    ΓêÜ returns zeroed metrics when selected repos not found
    ΓêÜ returns original rollup when no slices available for filter
    ΓêÜ filters by team using by_team slices (1 ms)
    ΓêÜ handles null cycle time values in aggregation
    ΓêÜ preserves other rollup fields when filtering (1 ms)
  Sprint 2: Filter Management
    createFilterChip
      ΓêÜ creates repo chip with correct structure
      ΓêÜ creates team chip with correct structure (1 ms)
    Filter UI Updates
      ΓêÜ shows clear button when filters are active (6 ms)
      ΓêÜ hides clear button when no filters (4 ms)
      ΓêÜ clears all filters on clear button click (7 ms)
    restoreFiltersFromUrl
      ΓêÜ restores repo filters from URL params (6 ms)
      ΓêÜ restores team filters from URL params (2 ms)
      ΓêÜ handles missing URL params gracefully (1 ms)
      ΓêÜ handles invalid filter values gracefully (repos not in dimensions) (3 ms)
      ΓêÜ ignores unknown URL query keys (1 ms)
      ΓêÜ handles malformed URL params gracefully (1 ms)
    URL State Round-Trip
      ΓêÜ round-trip preserves filter state
      ΓêÜ stable ordering in serialization (1 ms)
      ΓêÜ round-trip with date range
      ΓêÜ empty state produces empty URL
    populateFilterDropdowns
      ΓêÜ populates repo dropdown from dimensions using repository_name (4 ms)
      ΓêÜ populates team dropdown from dimensions using team_name (3 ms)
      ΓêÜ hides filter group when no dimensions available (2 ms)
      ΓêÜ handles null dimensions gracefully (1 ms)
      ΓêÜ filter values match by_repository keys in weekly rollups (3 ms)
      ΓêÜ filter values match by_team keys in weekly rollups (3 ms)
  Local Mode Detection
    isLocalMode
      ΓêÜ returns false when LOCAL_DASHBOARD_MODE is not set (1 ms)
      ΓêÜ returns true when LOCAL_DASHBOARD_MODE is true
      ΓêÜ returns false when LOCAL_DASHBOARD_MODE is false (7 ms)
      ΓêÜ returns false when LOCAL_DASHBOARD_MODE is a non-boolean truthy value
      ΓêÜ returns false when LOCAL_DASHBOARD_MODE is 1
    getLocalDatasetPath
      ΓêÜ returns default path when DATASET_PATH is not set (1 ms)
      ΓêÜ returns configured path when DATASET_PATH is set
      ΓêÜ returns DATASET_PATH even if empty string
    Local Mode Initialization Path
      ΓêÜ creates DatasetLoader with correct path in local mode (1 ms)
      ΓêÜ sets currentBuildId to null in local mode
  Version Adapter Pattern
    normalizeRollup
      ΓêÜ handles null input
      ΓêÜ handles undefined input (1 ms)
      ΓêÜ handles non-object input (1 ms)
      ΓêÜ preserves existing fields
      ΓêÜ provides defaults for missing fields (old schema)
      ΓêÜ does not override existing null values (1 ms)
      ΓêÜ does not override zero values
      ΓêÜ preserves by_repository slices when present
      ΓêÜ preserves by_team slices when present (1 ms)
    normalizeRollups
      ΓêÜ handles null input
      ΓêÜ handles undefined input
      ΓêÜ handles non-array input (1 ms)
      ΓêÜ handles empty array
      ΓêÜ normalizes all rollups in array
      ΓêÜ handles mixed valid and invalid entries (1 ms)
    Backward Compatibility Scenarios
      ΓêÜ v1.0 rollup (minimal fields) normalizes correctly (1 ms)
      ΓêÜ v1.1 rollup (with cycle times) normalizes correctly
      ΓêÜ v1.2 rollup (with contributor counts) normalizes correctly (1 ms)
      ΓêÜ v1.3 rollup (current with slices) stays unchanged

  console.log
    {"test":"fixture_generation_1k","duration_ms":2864.2808999999997,"budget_ms":10000,"baseline_ms":5000}

      at Object.<anonymous> (tests/performance.test.ts:76:13)

  console.log
    {"test":"manifest_parse","duration_ms":0.5471999999990658,"budget_ms":50,"baseline_ms":10}

      at Object.<anonymous> (tests/performance.test.ts:121:13)

  console.log
    {"test":"bulk_json_parse","duration_ms":14.299000000000888,"budget_ms":500,"baseline_ms":100,"files_parsed":50}

      at Object.<anonymous> (tests/performance.test.ts:165:13)

  console.log
    {"test":"memory_footprint","memory_delta_mb":0.0663299560546875,"budget_mb":20,"baseline_mb":10}

      at Object.<anonymous> (tests/performance.test.ts:223:13)

PASS tests/chunked-loading.test.ts (8.167 s)
  Phase 4: Chunked Loading
    fetchSemaphore
      ΓêÜ enforces max 4 concurrent fetches (28 ms)
      ΓêÜ processes queue in FIFO order (31 ms)
    createRollupCache with injected clock
      ΓêÜ returns cached value within TTL (1 ms)
      ΓêÜ expires cache after TTL (1 ms)
      ΓêÜ evicts oldest by touchedAt when at capacity (1 ms)
      ΓêÜ throws if cache key missing required fields (25 ms)
    getWeeklyRollupsWithProgress
      ΓêÜ returns explicit missingWeeks[] for 404s (19 ms)
      ΓêÜ returns explicit failedWeeks[] for 5xx after retry (216 ms)
      ΓêÜ throws AUTH_REQUIRED if authError && data.length === 0 (1 ms)
      ΓêÜ returns degraded state if partial auth success (1 ms)
      ΓêÜ calls onProgress with correct semantics (1 ms)
      ΓêÜ retries go through semaphore (216 ms)
      ΓêÜ stress test: randomized completion order with fixed seed (172 ms)

  console.warn
    [PERF] 1000pr-fixture-gen: 664.63ms vs baseline 335.00ms (98.4% change) - WARNING

    [0m [90m 338 |[39m           [36mthrow[39m [36mnew[39m [33mError[39m([32m`${message} - REGRESSION DETECTED`[39m)[33m;[39m
     [90m 339 |[39m         } [36melse[39m {
    [31m[1m>[22m[39m[90m 340 |[39m           console[33m.[39mwarn([32m`${message} - WARNING`[39m)[33m;[39m
     [90m     |[39m                   [31m[1m^[22m[39m
     [90m 341 |[39m         }
     [90m 342 |[39m       } [36melse[39m {
     [90m 343 |[39m         console[33m.[39mlog(message)[33m;[39m[0m

      at checkRegression (tests/performance.test.ts:340:19)
      at Object.<anonymous> (tests/performance.test.ts:376:7)

  console.log
    {"test":"fixture_generation_1000pr","duration_ms":664.6273999999994,"budget_ms":10000,"baseline_ms":335}

      at Object.<anonymous> (tests/performance.test.ts:378:15)

  console.log
    [PERF] 1000pr-manifest-parse: 0.17ms vs baseline 10.00ms (-98.3% change)

      at checkRegression (tests/performance.test.ts:343:17)

  console.log
    [PERF] 1000pr-bulk-parse: 5.70ms vs baseline 100.00ms (-94.3% change)

      at checkRegression (tests/performance.test.ts:343:17)

  console.warn
    [PERF] 5000pr-fixture-gen: 747.03ms vs baseline 345.00ms (116.5% change) - WARNING

    [0m [90m 338 |[39m           [36mthrow[39m [36mnew[39m [33mError[39m([32m`${message} - REGRESSION DETECTED`[39m)[33m;[39m
     [90m 339 |[39m         } [36melse[39m {
    [31m[1m>[22m[39m[90m 340 |[39m           console[33m.[39mwarn([32m`${message} - WARNING`[39m)[33m;[39m
     [90m     |[39m                   [31m[1m^[22m[39m
     [90m 341 |[39m         }
     [90m 342 |[39m       } [36melse[39m {
     [90m 343 |[39m         console[33m.[39mlog(message)[33m;[39m[0m

      at checkRegression (tests/performance.test.ts:340:19)
      at Object.<anonymous> (tests/performance.test.ts:376:7)

  console.log
    {"test":"fixture_generation_5000pr","duration_ms":747.0321000000004,"budget_ms":50000,"baseline_ms":345}

      at Object.<anonymous> (tests/performance.test.ts:378:15)

  console.log
    [PERF] 5000pr-manifest-parse: 0.31ms vs baseline 12.00ms (-97.4% change)

      at checkRegression (tests/performance.test.ts:343:17)

  console.log
    [PERF] 5000pr-bulk-parse: 11.00ms vs baseline 224.00ms (-95.1% change)

      at checkRegression (tests/performance.test.ts:343:17)

  console.warn
    [PERF] 10000pr-fixture-gen: 696.00ms vs baseline 341.00ms (104.1% change) - WARNING

    [0m [90m 338 |[39m           [36mthrow[39m [36mnew[39m [33mError[39m([32m`${message} - REGRESSION DETECTED`[39m)[33m;[39m
     [90m 339 |[39m         } [36melse[39m {
    [31m[1m>[22m[39m[90m 340 |[39m           console[33m.[39mwarn([32m`${message} - WARNING`[39m)[33m;[39m
     [90m     |[39m                   [31m[1m^[22m[39m
     [90m 341 |[39m         }
     [90m 342 |[39m       } [36melse[39m {
     [90m 343 |[39m         console[33m.[39mlog(message)[33m;[39m[0m

      at checkRegression (tests/performance.test.ts:340:19)
      at Object.<anonymous> (tests/performance.test.ts:376:7)

  console.log
    {"test":"fixture_generation_10000pr","duration_ms":695.9975999999988,"budget_ms":100000,"baseline_ms":341}

      at Object.<anonymous> (tests/performance.test.ts:378:15)

  console.log
    [PERF] 10000pr-manifest-parse: 0.16ms vs baseline 15.00ms (-98.9% change)

      at checkRegression (tests/performance.test.ts:343:17)

  console.log
    [PERF] 10000pr-bulk-parse: 6.14ms vs baseline 316.00ms (-98.1% change)

      at checkRegression (tests/performance.test.ts:343:17)

PASS tests/performance.test.ts (20.046 s)
  Performance Baseline Tests (Simplified)
    ΓêÜ 1k PR fixture generation completes within budget (3075 ms)
    ΓêÜ manifest parsing completes within budget (3 ms)
    ΓêÜ bulk JSON parsing (all rollups) completes within budget (16 ms)
    ΓêÜ memory footprint for 1k dataset remains within ceiling (3 ms)
  Scaling Performance at 1000 PRs
    ΓêÜ 1000 PR fixture generation within budget (3689 ms)
    ΓêÜ 1000 PR manifest parse within budget (2 ms)
    ΓêÜ 1000 PR bulk JSON parse scales sub-linearly (31 ms)
  Scaling Performance at 5000 PRs
    ΓêÜ 5000 PR fixture generation within budget (4042 ms)
    ΓêÜ 5000 PR manifest parse within budget (4 ms)
    ΓêÜ 5000 PR bulk JSON parse scales sub-linearly (73 ms)
  Scaling Performance at 10000 PRs
    ΓêÜ 10000 PR fixture generation within budget (3755 ms)
    ΓêÜ 10000 PR manifest parse within budget (2 ms)
    ΓêÜ 10000 PR bulk JSON parse scales sub-linearly (32 ms)

Summary of all failing tests
FAIL tests/synthetic-fixtures.test.ts
  ΓùÅ Test suite failed to run

    tests/synthetic-fixtures.test.ts:157:37 - error TS2339: Property 'users' does not exist on type 'DimensionsData'.

    157     expect(Array.isArray(dimensions.users)).toBe(true);
                                            ~~~~~


Test Suites: 1 failed, 22 passed, 23 total
Tests:       425 passed, 425 total
Snapshots:   0 total
Time:        22.869 s
Ran all test suites.
