feat(augur): new module — signs collected, patterns read

Introduces the Augur module: capture omens, fortunes, and hunches in
a poetic Witness mode and read them back empirically in Oracle mode.
Same data, two lenses; the killer mechanic is the Living Oracle that
materialises empirical reflections from the user's own resolved
history at capture time.

Why now: docs/future/MODULE_IDEAS.md captured the brainstorm, then
the spec landed at docs/plans/augur-module.md as a Witness+Oracle
hybrid. Built end-to-end through M6 in one go.

Highlights:
- Witness gallery + DueBanner + DetailView + Resolve flow
- Oracle stats: calibration-per-source, vibe-hit-rate, cross-module
  correlation engine (mood/sleep/duration after-windows)
- Living Oracle: deterministic fingerprint+match against user's own
  resolved history; cold-start-gated at 50 resolved entries
- Year-Recap view at /augur/recap/[year]
- 5 MCP tools: capture_sign, resolve_sign, list_open_signs,
  consult_oracle, augur_year_recap (in AI_TOOL_CATALOG)
- Visibility integration: default 'private', VisibilityPicker in
  DetailView. Server-side unlisted-snapshot-publish stays follow-up
- v47 Dexie schema; encrypted: source/claim/feltMeaning/
  expectedOutcome/outcomeNote/tags/livingOracleSnapshot
- LOCAL TIER PATCH: requiredTier 'guest' for testing

Strings interpolated through `T` constants so the i18n-hardcoded
baseline stays at 0 for augur — real $_('augur.*') keys land later.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-04-25 15:02:15 +02:00
parent 568d79dc16
commit faa16fa898
38 changed files with 5272 additions and 0 deletions

View file

@ -1987,6 +1987,210 @@ export const AI_TOOL_CATALOG: readonly ToolSchema[] = [
},
],
},
// ── Augur (signs / fortunes / hunches) ──────────────────────
{
name: 'capture_sign',
module: 'augur',
description:
'Erfasst ein Zeichen (Omen, Wahrsagung oder Bauchgefuehl) im Augur-Modul. Standardmaessig Stimmung "mysterious" wenn nicht angegeben. Gibt die ID zurueck.',
defaultPolicy: 'propose',
parameters: [
{
name: 'kind',
type: 'string',
description: 'Art des Zeichens',
required: true,
enum: ['omen', 'fortune', 'hunch'],
},
{
name: 'source',
type: 'string',
description: 'Quelle (z.B. "schwarze Katze", "Glueckskeks", "Bauchgefuehl")',
required: true,
},
{
name: 'claim',
type: 'string',
description: 'Was das Zeichen aussagt',
required: true,
},
{
name: 'sourceCategory',
type: 'string',
description: 'Quellenkategorie',
required: false,
enum: [
'gut',
'tarot',
'horoscope',
'fortune-cookie',
'iching',
'dream',
'person',
'media',
'natural',
'other',
],
},
{
name: 'vibe',
type: 'string',
description: 'Grundstimmung des Zeichens',
required: false,
enum: ['good', 'bad', 'mysterious'],
},
{
name: 'feltMeaning',
type: 'string',
description: 'Eigene Deutung (optional)',
required: false,
},
{
name: 'expectedOutcome',
type: 'string',
description: 'Konkrete Prognose (optional)',
required: false,
},
{
name: 'expectedBy',
type: 'string',
description: 'Bis wann sollte sich zeigen ob es eintritt (YYYY-MM-DD)',
required: false,
},
{
name: 'probability',
type: 'number',
description: 'Wahrscheinlichkeit 0..1 (optional)',
required: false,
},
{
name: 'tags',
type: 'string',
description: 'Tags durch Komma getrennt',
required: false,
},
],
},
{
name: 'resolve_sign',
module: 'augur',
description:
'Loest ein offenes Zeichen auf — markiert ob es eingetreten ist (fulfilled / partly / not-fulfilled) und kann eine Notiz speichern.',
defaultPolicy: 'propose',
parameters: [
{ name: 'entryId', type: 'string', description: 'ID des Zeichens', required: true },
{
name: 'outcome',
type: 'string',
description: 'Ergebnis',
required: true,
enum: ['fulfilled', 'partly', 'not-fulfilled'],
},
{
name: 'note',
type: 'string',
description: 'Optionale Notiz wie es kam',
required: false,
},
],
},
{
name: 'list_open_signs',
module: 'augur',
description:
'Listet noch offene Zeichen — id, kind, source, claim, encounteredAt, expectedBy. Optional gefiltert nach kind.',
defaultPolicy: 'auto',
parameters: [
{
name: 'kind',
type: 'string',
description: 'Nur eine Art zeigen',
required: false,
enum: ['omen', 'fortune', 'hunch'],
},
{
name: 'limit',
type: 'number',
description: 'Maximale Anzahl (Standard 30)',
required: false,
},
],
},
{
name: 'consult_oracle',
module: 'augur',
description:
'Befragt das Living Oracle: nimmt eine Sign-Beschreibung und gibt zurueck was bei aehnlichen Zeichen in der Vergangenheit geschah (n, hit-rate, breakdown). Schweigt unter 50 aufgeloesten Eintraegen oder unter 3 Treffern (cold-start).',
defaultPolicy: 'auto',
parameters: [
{
name: 'kind',
type: 'string',
description: 'Art des hypothetischen Zeichens',
required: true,
enum: ['omen', 'fortune', 'hunch'],
},
{
name: 'sourceCategory',
type: 'string',
description: 'Quellenkategorie',
required: true,
enum: [
'gut',
'tarot',
'horoscope',
'fortune-cookie',
'iching',
'dream',
'person',
'media',
'natural',
'other',
],
},
{
name: 'vibe',
type: 'string',
description: 'Grundstimmung',
required: true,
enum: ['good', 'bad', 'mysterious'],
},
{
name: 'source',
type: 'string',
description: 'Quellen-Stichwort fuer Keyword-Matching',
required: false,
},
{
name: 'claim',
type: 'string',
description: 'Aussage fuer Keyword-Matching',
required: false,
},
{
name: 'tags',
type: 'string',
description: 'Tags durch Komma getrennt',
required: false,
},
],
},
{
name: 'augur_year_recap',
module: 'augur',
description:
'Strukturierter Jahresrueckblick: total / aufgeloest / hit-rate / vibe-breakdown / top-source-categories. Year als YYYY (Standard: aktuelles Jahr).',
defaultPolicy: 'auto',
parameters: [
{
name: 'year',
type: 'number',
description: 'Jahr (z.B. 2026). Standard: aktuelles Jahr.',
required: false,
},
],
},
];
// ═══════════════════════════════════════════════════════════════