TenantAtlas/apps/platform/tests/Feature/Guards/TestLaneManifestTest.php
ahmido 0d5d1fc9f4 Spec 208: finalize heavy suite segmentation (#241)
## Summary
- add the checked-in Spec 208 heavy-suite classification and family manifest with config-driven lane generation, attribution, and budget reporting
- update Pest grouping, guard coverage, wrapper/report contracts, and spec artifacts for the segmented lane model
- complete the targeted follow-up pass that re-homes the remaining in-scope confidence hotspots into explicit heavy-governance families

## Acceptance
- confidence is repaired and now measures 389.613832s, down from 587.446894s and below the 450s lane budget
- confidence is also slightly below the post-Spec-207 baseline of 394.383441s (delta -4.769609s)
- this closes the central Spec 208 acceptance issue that had kept the spec open

## Intentionally Re-homed Families
- finding-bulk-actions-workflow
- drift-bulk-triage-all-matching
- baseline-profile-start-surfaces
- workspace-settings-slice-management
- findings-workflow-surfaces
- workspace-only-admin-surface-independence

## Explicit Residual Risk
- heavy-governance now measures 318.296962s, above its documented 300s threshold
- the cost was not removed; it was moved into the correct lane and made visible on clearly named heavy families
- this is documented residual debt, not an open Spec 208 failure

## Validation
- focused guard/support validation: 206 passed (3607 assertions)
- lane wrapper/report validation completed for confidence and heavy-governance
- no full-suite run was performed in this pass by request

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #241
2026-04-17 09:53:55 +00:00

116 lines
5.3 KiB
PHP

<?php
declare(strict_types=1);
use Tests\Support\TestLaneManifest;
it('declares the six checked-in lanes with a single fast-feedback default and the spec 208 metadata surfaces', function (): void {
$manifest = TestLaneManifest::manifest();
$laneIds = array_column($manifest['lanes'], 'id');
$defaultLanes = array_values(array_filter(
$manifest['lanes'],
static fn (array $lane): bool => $lane['defaultEntryPoint'] === true,
));
expect($manifest['version'])->toBe(1)
->and($manifest['artifactDirectory'])->toBe('storage/logs/test-lanes')
->and($manifest)->toHaveKeys([
'classifications',
'families',
'mixedFileResolutions',
'placementRules',
'driftGuards',
'budgetTargets',
'lanes',
'familyBudgets',
])
->and($laneIds)->toEqualCanonicalizing([
'fast-feedback',
'confidence',
'browser',
'heavy-governance',
'profiling',
'junit',
])
->and($defaultLanes)->toHaveCount(1)
->and($defaultLanes[0]['id'])->toBe('fast-feedback');
});
it('keeps every lane declaration populated with governance metadata, selectors, and segmented family expectations', function (): void {
foreach (TestLaneManifest::manifest()['lanes'] as $lane) {
expect(trim($lane['description']))->not->toBe('')
->and(trim($lane['intendedAudience']))->not->toBe('')
->and($lane['includedFamilies'])->not->toBeEmpty()
->and($lane['ownershipExpectations'])->not->toBe('')
->and($lane['artifacts'])->not->toBeEmpty()
->and($lane['budget']['thresholdSeconds'])->toBeGreaterThan(0)
->and($lane['budget']['baselineSource'])->toBeString()
->and($lane['dbStrategy']['connectionMode'])->toBeString();
$selectors = $lane['selectors'];
foreach ([
'includeSuites',
'includePaths',
'includeGroups',
'includeFiles',
'excludeSuites',
'excludePaths',
'excludeGroups',
'excludeFiles',
] as $selectorKey) {
expect($selectors)->toHaveKey($selectorKey);
}
}
expect(TestLaneManifest::lane('confidence')['includedFamilies'])->toContain('ui-light', 'ui-workflow')
->and(TestLaneManifest::lane('confidence')['excludedFamilies'])->toContain('surface-guard', 'discovery-heavy')
->and(TestLaneManifest::lane('heavy-governance')['includedFamilies'])->toContain('surface-guard', 'discovery-heavy');
});
it('exposes the spec 208 classification catalog and seeded family inventory with required metadata', function (): void {
$classifications = collect(TestLaneManifest::classifications())->keyBy('classificationId');
$families = collect(TestLaneManifest::families())->keyBy('familyId');
expect($classifications->keys()->all())->toEqualCanonicalizing([
'ui-light',
'ui-workflow',
'surface-guard',
'discovery-heavy',
'browser',
])
->and($classifications->get('browser')['allowedLaneIds'])->toBe(['browser'])
->and($classifications->get('surface-guard')['defaultLaneId'])->toBe('heavy-governance')
->and($classifications->get('discovery-heavy')['forbiddenLaneIds'])->toContain('fast-feedback', 'confidence')
->and($families->has('baseline-profile-start-surfaces'))->toBeTrue()
->and($families->has('findings-workflow-surfaces'))->toBeTrue()
->and($families->has('finding-bulk-actions-workflow'))->toBeTrue()
->and($families->has('drift-bulk-triage-all-matching'))->toBeTrue()
->and($families->has('policy-resource-admin-search-parity'))->toBeTrue()
->and($families->has('workspace-only-admin-surface-independence'))->toBeTrue()
->and($families->has('workspace-settings-slice-management'))->toBeTrue()
->and($families->has('baseline-compare-matrix-workflow'))->toBeTrue()
->and($families->has('browser-smoke'))->toBeTrue();
foreach (TestLaneManifest::families() as $family) {
expect(trim($family['purpose']))->not->toBe('')
->and(trim($family['currentLaneId']))->not->toBe('')
->and(trim($family['targetLaneId']))->not->toBe('')
->and($family['selectors'])->not->toBeEmpty()
->and($family['hotspotFiles'])->not->toBeEmpty()
->and(trim($family['validationStatus']))->not->toBe('');
if ($family['targetLaneId'] === 'confidence') {
expect(trim((string) ($family['confidenceRationale'] ?? '')))->not->toBe('');
}
}
});
it('keeps family budgets derived from the generic budget targets for report consumers', function (): void {
$familyBudgets = TestLaneManifest::familyBudgets();
expect($familyBudgets)->not->toBeEmpty()
->and($familyBudgets[0])->toHaveKeys(['familyId', 'targetType', 'targetId', 'selectors', 'thresholdSeconds'])
->and(collect($familyBudgets)->pluck('familyId')->all())
->toContain('action-surface-contract', 'browser-smoke', 'baseline-compare-matrix-workflow', 'baseline-profile-start-surfaces', 'drift-bulk-triage-all-matching', 'finding-bulk-actions-workflow', 'findings-workflow-surfaces', 'workspace-only-admin-surface-independence', 'workspace-settings-slice-management');
});