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:
@@ -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 |
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user