Sprint summary
The v11 Strategy Sprint is complete on main (commit 4d16fcc).
The sprint locked the forensic data surface for the full multi-profile product (Racer / Research / Shop & Repair / Factory & QA / Gov & Mil / Advanced / Default) without building billing, cloud, or cosmetic polish.
What shipped
- Case metadata — 30+ optional fields covering operational context, platform/system, human/org, and investigation outcome. Fully backward-compatible (unknown keys filtered on load).
- Attachment model —
Attachment dataclass + AttachmentType enum. Full CRUD routes under /api/cases/{id}/attachments/... with per-case manifest.
- Profile system — Data-driven
ProfileConfig registry for all 7 profiles, WordingPack for profile-specific terminology, get_profile() with default fallback. Exposed via GET /api/profiles and GET /api/profiles/{id}.
- Timeline — Formal
TimelineEvent model with type and category enums. build_timeline_from_findings, build_timeline_from_flight, build_full_timeline. Persisted as analysis/timeline.json during analyze runs. Route now returns v2.0 schema with legacy fallback.
- Hypothesis — New fields
category, recommendations, related_timeline_events, generated_by. Lifting assigns category per theme, attaches default recommendations, and applies a missing-data confidence penalty from ParseDiagnostics.stream_coverage.
- Feature gating scaffold —
goose.features.FeatureGate with EntitlementLevel (OSS_CORE → LOCAL_PRO → HOSTED_TEAM → ENTERPRISE_GOV) and CapabilityGroup. GET /api/features exposes current state. No billing logic; OSS build always runs at OSS_CORE.
- Quick Analysis flow —
POST /api/quick-analysis runs the full forensic pipeline (parser + plugins + hypotheses + signal quality + timeline) without persisting anything. Profile-driven plugin selection. POST /api/quick-analysis/save-as-case promotes the result into a real Investigation Case.
- GUI welcome screen — Three entry paths (Quick Analysis, Investigation Case, Open Recent Case). Profile selector on the Quick Analysis panel, inline result rendering, and a one-click Save-as-Case action. Default tab switched to
welcome on boot.
Tests
- 59 new tests in
tests/test_profiles/:
test_profiles.py — profile registry, roundtrip, API (15)
test_case_metadata.py — case metadata, attachment model, attachment API (16)
test_feature_gating.py — entitlement levels + /api/features (15)
test_timeline.py — timeline event builders + serialization (8)
test_quick_analysis.py — quick-analysis pipeline + save-as-case (5)
- 2 pre-existing timeline route tests updated for the v2.0 schema.
- 620 tests passing (561 baseline + 59 new).
Engineering rules honored
- No billing / cloud / licensing code in the core.
- Quick Analysis persists nothing to disk.
- Profile system never changes forensic truth — same parser, plugins, canonical models.
- Font size ≥ 12px in all new GUI elements.
- Vanilla JS only.
- All new dataclasses have
to_dict / from_dict with unknown-key filtering.
Deferred
- Billing + entitlement enforcement.
- Hosted collaboration, org admin, batch processing UIs.
- Profile-aware report generators.
- Real plugin matches for some profile-declared ids (e.g.
ekf_health, ekf_innovation chart preset) — profiles accept unknown plugin ids safely; runner filters to PLUGIN_REGISTRY membership.
Recommended next sprint
- Wire profile defaults into the case-based analyze route (currently only Quick Analysis consumes
default_plugins).
- Render profile wording + field visibility in the GUI case detail view.
- Profile-aware chart presets on the results view.
- Add an
ekf_health plugin to match Research / Gov-Mil profile expectations.
- First profile-specific report generator (Mishap Investigation Report for Gov/Mil).
Sprint summary
The v11 Strategy Sprint is complete on
main(commit4d16fcc).The sprint locked the forensic data surface for the full multi-profile product (Racer / Research / Shop & Repair / Factory & QA / Gov & Mil / Advanced / Default) without building billing, cloud, or cosmetic polish.
What shipped
Attachmentdataclass +AttachmentTypeenum. Full CRUD routes under/api/cases/{id}/attachments/...with per-case manifest.ProfileConfigregistry for all 7 profiles,WordingPackfor profile-specific terminology,get_profile()with default fallback. Exposed viaGET /api/profilesandGET /api/profiles/{id}.TimelineEventmodel with type and category enums.build_timeline_from_findings,build_timeline_from_flight,build_full_timeline. Persisted asanalysis/timeline.jsonduring analyze runs. Route now returns v2.0 schema with legacy fallback.category,recommendations,related_timeline_events,generated_by. Lifting assigns category per theme, attaches default recommendations, and applies a missing-data confidence penalty fromParseDiagnostics.stream_coverage.goose.features.FeatureGatewithEntitlementLevel(OSS_CORE → LOCAL_PRO → HOSTED_TEAM → ENTERPRISE_GOV) andCapabilityGroup.GET /api/featuresexposes current state. No billing logic; OSS build always runs atOSS_CORE.POST /api/quick-analysisruns the full forensic pipeline (parser + plugins + hypotheses + signal quality + timeline) without persisting anything. Profile-driven plugin selection.POST /api/quick-analysis/save-as-casepromotes the result into a real Investigation Case.welcomeon boot.Tests
tests/test_profiles/:test_profiles.py— profile registry, roundtrip, API (15)test_case_metadata.py— case metadata, attachment model, attachment API (16)test_feature_gating.py— entitlement levels +/api/features(15)test_timeline.py— timeline event builders + serialization (8)test_quick_analysis.py— quick-analysis pipeline + save-as-case (5)Engineering rules honored
to_dict/from_dictwith unknown-key filtering.Deferred
ekf_health,ekf_innovationchart preset) — profiles accept unknown plugin ids safely; runner filters toPLUGIN_REGISTRYmembership.Recommended next sprint
default_plugins).ekf_healthplugin to match Research / Gov-Mil profile expectations.