Skip to content

Implement the achievement engine and a first-slice catalog #56

Description

@zoeyrose

Outcome

Deliver the reusable native Go engine required by the full achievement epic #31, then prove it with a small representative catalog.

Scope and invariants

  • Define stable achievement/category/criterion IDs, hidden/disclosure policy, non-failable invariant, progress aggregation, completion timestamps, rewards if approved, and content-version behavior.
  • Subscribe to durable metrics/events through indexed registrations; never poll all achievements or embed one-off feature callbacks.
  • Support checked simple criteria and approved typed CEL compound predicates; effects remain Go transactions.
  • Persist per-character progress/completion idempotently and expose a structured bounded catalog/state model to Rust.
  • Choose first-slice examples covering counter, distinct set, threshold, and compound behavior without settling the full M5 catalog.

Acceptance criteria

  • Tests cover duplicate/reordered events, reconnect, hidden criteria, catalog revision, already-completed state, metric reconciliation, reward failure, and bounded subscriptions.
  • Achievements never transition from complete to failed and completion side effects are idempotent.
  • The Rust client renders first-slice state without parsing server text.
  • The M5 epic Implement data-driven per-character achievements #31 links every complete catalog/content task to this engine rather than creating alternate implementations.
  • No Python or Starlark is required.

Dependencies and parallelization

Depends on #36, #39, #41, #42, and #45. Full achievement catalog migration remains in #31/M5.

Independent implementation

Implement from the preserved issue-level/product behavior and independently authored fixtures. Do not copy or mechanically translate GPL server/Python code or tests. Replacement code is MIT; consumed content and assets keep their own licenses.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Fields

    Priority

    None yet

    Effort

    None yet

    Projects

    Status
    Backlog

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions