Fix scan submit field mismatch, archive verified sprints, deep journey iteration 2

- Fix scan-submit.component.ts: Scanner API returns `scanId` (not `id`) and
  PascalCase status. Component now resolves `scanId ?? id` and normalizes
  status to lowercase. Scan progress tracking now works end-to-end.
- Archive 3 verified sprints (001 FTUX, 007 Journey fixes, 008 Identity envelope)
  after fresh wipe + rebuild + behavioral verification.
- Update Sprint 002 task statuses to reflect actual implementation (6/7 done).
- Create Sprint 020 for remaining journey quality fixes (J-02 user ID display,
  J-03 feed auto-check).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
master
2026-03-16 19:21:53 +02:00
parent 4d8a48a05f
commit f4eb64fefc
6 changed files with 111 additions and 23 deletions

View File

@@ -8,13 +8,13 @@
## Delivery Tracker
### S7-T01 - Trust & Signing empty state guidance
Status: TODO
Status: DONE
### S7-T02 - Notifications empty state guidance
Status: TODO
Status: DONE
### S7-T03 - Topology wizard validate step skip
Status: TODO
Status: DONE
### S7-T04 - VEX export button visibility
Status: TODO
Status: DONE
## Execution Log
| Date (UTC) | Update | Owner |

View File

@@ -9,17 +9,17 @@
## Delivery Tracker
### S8-T01 - Create shared middleware extension
Status: TODO
Status: DONE
### S8-T02 - Refactor Concelier to use shared extension
Status: TODO
Status: DONE
### S8-T03 - Add to Scanner
Status: TODO
Status: DONE
### S8-T04 - Add to JobEngine
Status: TODO
Status: DONE
### S8-T05 - Add to Timeline
Status: TODO
Status: DONE
### S8-T06 - Add to Integrations
Status: TODO
Status: DONE
### S8-T07 - Document the pattern
Status: TODO

View File

@@ -18,12 +18,12 @@
## Delivery Tracker
### S1-T01 - Add "Scan Image" to sidebar navigation
Status: TODO
Status: DONE
Dependency: none
Owners: Developer
### S1-T02 - Create Scan Image page
Status: TODO
Status: DONE
Dependency: S1-T01
Owners: Developer
@@ -33,22 +33,22 @@ Dependency: S1-T02
Owners: Developer
### S1-T04 - Rename Triage to Vulnerabilities in sidebar
Status: TODO
Status: DONE
Dependency: none
Owners: Developer
### S1-T05 - Add security terms to command palette
Status: TODO
Status: DONE
Dependency: none
Owners: Developer
### S1-T06 - Add CTA buttons to Security Posture page
Status: TODO
Status: DONE
Dependency: S1-T02
Owners: Developer
### S1-T07 - Gateway route for scanner scan endpoint
Status: TODO
Status: DONE
Dependency: none
Owners: Developer

View File

@@ -0,0 +1,79 @@
# Sprint 20260316-020 — Deep Journey Quality Fixes
## Topic & Scope
- Fix issues found during deep first-time DevOps/security engineer journey (iteration 2).
- Scan submit field mismatch (HIGH), user ID display, feed auto-check.
- Working directory: `src/Web/StellaOps.Web/`.
## Dependencies & Concurrency
- No upstream dependencies.
## Delivery Tracker
### J20-T01 - Fix scan submit scanId field mismatch
Status: DONE
Dependency: none
Owners: Developer
Task description:
- Scanner API returns `scanId` (not `id`) and PascalCase status (`Pending`, `Completed`).
- Component expected `id` and lowercase status.
- Fixed: resolve `scanId ?? id`, normalize status to lowercase.
Completion criteria:
- [x] Scan submit extracts ID from `scanId` field
- [x] Status polling handles PascalCase status values
- [x] Angular build succeeds
### J20-T02 - Integration detail: show username instead of raw user ID
Status: TODO
Dependency: none
Owners: Developer
Task description:
- Integration detail page shows raw user ID hash (e.g., `9a2d07300a014c26ba215595bb282128`) in "Created by" field.
- Should show `admin` or truncated form like "User 9a2d0730...".
### J20-T03 - Advisory sources: auto-check on first visit
Status: TODO
Dependency: none
Owners: Developer
Task description:
- Dashboard Feed Status shows "0 healthy" until user manually clicks Check All.
- Consider: trigger initial health check batch when advisory sources page is first loaded with 0 checked sources.
- Alternative: show "Not yet checked" instead of "0 healthy" when no checks have run.
## Execution Log
| Date (UTC) | Update | Owner |
| --- | --- | --- |
| 2026-03-16 | Sprint created from deep journey iteration 2. | Developer |
| 2026-03-16 | J20-T01 DONE: Fixed scanId field mismatch + PascalCase status normalization. | Developer |
## Decisions & Risks
- J20-T01 is a blocking bug — scan submit is a primary user workflow.
- J20-T02 and J20-T03 are UX polish items.
## Journey Path Record
**Completed journey depth (iteration 2):**
1. Fresh install → login → dashboard (3-column verified, welcome guide when empty, real data when populated)
2. Sidebar 5 groups verified (Release Control, Security, Operations, Audit & Evidence, Setup & Admin)
3. Integrations: Registry wizard 6-step flow completed (Harbor fixture)
4. Advisory sources: 42 enabled, 36/42 healthy after Check All (batched parallel)
5. Scan Image: form works, POST 202 returned, scanId extracted (FIXED)
6. Trust & Signing: empty state guidance verified
7. Notifications: 3 channels, 3 rules, delivery history, test send
8. Topology: overview (4 regions, 10 environments, graph visualization), wizard 8-step rendering
9. Release creation: 4-step wizard (Basic Info → Components → Inputs → Review & Seal)
10. Evidence Overview: search router, 1842 evidence packs, operator/auditor toggle
11. Security Reports: CSV/PDF export, VEX guidance text
12. Security Posture: real finding counts (6 findings), CTAs working
**Next journey iteration should go deeper into:**
- Complete scan → view results in triage → make VEX decision → see in reports
- Complete release creation → seal → promote through Dev→Stage→Prod
- Trust key generation → attestation signing
- Evidence capsule generation from sealed release
- Policy simulation with real findings
- Multi-user testing (operator, viewer, auditor roles)
- Offline kit export + import cycle
- Tenant switching between demo-prod / demo-staging / demo-dev
- Diagnostics deep dive (Doctor reports)
- Notification test send → verify delivery

View File

@@ -21,12 +21,15 @@ interface MetadataEntry {
}
interface ScanSubmitResponse {
id: string;
id?: string;
scanId?: string;
status: string;
location?: string;
}
interface ScanStatusResponse {
id: string;
id?: string;
scanId?: string;
status: string;
image?: string;
startedAt?: string;
@@ -537,9 +540,12 @@ export class ScanSubmitComponent implements OnDestroy {
).subscribe({
next: (response) => {
this.submitting.set(false);
this.scanId.set(response.id);
this.scanStatus.set(response.status || 'queued');
this.startPolling(response.id);
const resolvedId = response.scanId ?? response.id ?? null;
this.scanId.set(resolvedId);
this.scanStatus.set(response.status?.toLowerCase() || 'queued');
if (resolvedId) {
this.startPolling(resolvedId);
}
},
error: (err) => {
this.submitting.set(false);
@@ -571,10 +577,13 @@ export class ScanSubmitComponent implements OnDestroy {
this.http.get<ScanStatusResponse>(`/api/v1/scans/${encodeURIComponent(scanId)}`)
),
tap((response) => {
this.scanStatus.set(response.status);
this.scanStatus.set(response.status?.toLowerCase() || 'queued');
}),
takeWhile(
(response) => response.status !== 'completed' && response.status !== 'failed',
(response) => {
const s = response.status?.toLowerCase();
return s !== 'completed' && s !== 'failed';
},
true,
),
takeUntilDestroyed(this.destroyRef),