icarus prospects

Icarus Prospects

A web-based save editor for Icarus prospect files. Served at /prospects on the portal as a Flask Blueprint. Allows users to reset completed missions with full dependency cascading.


Project Details

Field Value
GitLab Project icarus/prospects
GitLab Project ID 4
Repository https://git.eurekaendeavors.com/icarus/prospects
Visibility private
License GPL v3
Portal route /prospects
Package name icarus-prospects
Depends on icarus/core
Status ✅ Live — 165+ uploads processed

What It Does

Users upload a prospect save file (.json), select missions to reset, and download the modified file. All in the browser, no installation required.

Supported features: - Reset Great Hunts mission chains (with full dependency cascading) - Reset Open World missions (with expedition → biome cascading) - Reset PRO and ELY story chains (sequential dependencies) - All missions shown with display names, descriptions, and difficulty - Session-based: no user accounts required, no persistent storage of save data - WCAG 2.1 Level A accessibility


Package Architecture

Extracted into a standalone pip package (icarus_prospects) on 2026-03-17 as part of the submodule-first migration (#140). The portal blueprint is now thin wiring via create_blueprint() factory with _state.py dependency injection.

icarus/prospects (submodule at icarus-prospects/)
├── icarus_prospects/
│   ├── __init__.py
│   ├── blueprint.py         create_blueprint() factory
│   ├── models.py            SQLAlchemy models (sessions, visits, events)
│   ├── routes.py            Upload, editor, API routes
│   ├── services/
│   │   └── mission_service.py  Cascade logic, mission parsing, reset application
│   ├── data/
│   │   ├── gh_chains.json      GH chain definitions (9 chains, 3 maps)
│   │   └── mission_metadata.json  Display names from catalog
│   ├── templates/prospects/
│   └── static/
├── pyproject.toml
└── tests/

Dependency Cascading

Mission dependencies are enforced automatically when toggling missions:

Great Hunts (GH) Chains

  • Uncheck: Cascades downstream — all later missions also unchecked
  • Check: Cascades upstream — all prerequisites also checked
  • 9 chains across Olympus, Styx, and Prometheus maps

Expedition → Biome

  • Uncheck expedition: All missions in that biome unchecked
  • Check biome mission: Expedition unlock auto-checked

Story Chains (PRO/ELY)

  • Sequential: PRO_Story_0PRO_Story_1 → ... → PRO_Story_6
  • Same cascading rules as GH chains

Session Management

  • Each upload creates a ProspectEditSession in PostgreSQL
  • Session ID stored in Flask session cookie
  • Sessions expire after PROSPECTS_SESSION_TTL_SECONDS (default 1 hour)
  • Expired sessions cleaned up periodically via before_request hook
  • All mission state held server-side (compressed blob + parsed state)
  • No save data persists after session expiry

API Endpoints

All API routes require an active session (return 404 otherwise).

Method Path Purpose
GET /prospects/ Upload page
POST /prospects/upload File upload + parse
GET /prospects/editor Mission editor UI
POST /prospects/api/toggle AJAX mission toggle with cascading
POST /prospects/api/apply Generate modified save
GET /prospects/api/download Download modified save
GET /prospects/api/state Current session state

Monetization

Prospects editing is split in the monetization plan: - Free: Marking missions as incomplete (resetting/replaying) - Premium: Marking missions as complete (skipping content)

See issue #139 for the prospects rework plan.


Accessibility (WCAG 2.1 Level A)

Feature Notes
Skip-to-content link Keyboard navigation
aria-live="polite" AJAX update announcements
:focus-visible outlines On checkboxes
role="status" On change count badge
aria-describedby Upload error linked to input
Back to Catalog