Rank Yapture tasks with MAUT
Turn task evidence and user-authored tradeoffs into deterministic, inspectable recommendations.
Developer preview. The audited MAGYC SDK uses
@magycfit/maut-core@0.1.0. Verify package publication and registry access before publishing an install command to end users.
Why MAUT
Multi-attribute utility theory is useful when “what next?” depends on several competing considerations. Yapture uses it as a deterministic decision kernel, not as a replacement for user judgment.
task fields + history → observations → user policy → maut/1 case → rank + explanation
Package
The current SDK repository defines:
import {
scoreCase,
reconcileCase,
qualityReport,
type MautCase,
} from '@magycfit/maut-core';
Use an exact version during preview. The existing Yapture spike still imports the obsolete @metflaw/maut-core namespace and must be migrated before product release.
1. Extract evidence
Useful sources already exist on a Yapture task:
| Attribute | Evidence | Missing behavior |
|---|---|---|
| Goal impact | linked goal and accepted metadata | null |
| Deadline pressure | due date relative to an explicit reference time | null without due date |
| Effort remaining | accepted estimate | null |
| Dependency unlock | explicit dependency graph | null when graph is unknown |
| Momentum | completion/update events in a declared window | null without history |
| Calendar fit | duration and permitted free window | null without calendar evidence |
Every value should retain origin and date. AI-extracted values are proposals until accepted.
2. Build a maut/1 case
const decisionCase: MautCase = {
protocolVersion: 'maut/1',
id: 'today-open-tasks',
title: 'What should I work on next?',
domain: 'Tasks',
goal: 'Choose work that advances my 5K plan within today’s capacity.',
status: 'live',
updatedAt: '2026-07-16',
notes: '',
attributes,
alternatives: tasks.map((task) => ({ id: task.id, label: task.text })),
series: observations,
};
Pass an explicit reference date through every date-sensitive adapter. Tests must never depend on the wall clock.
3. Preserve missing values
MAUT can reconcile time-series evidence and surface quality/confidence. A missing value is not zero and should not be replaced by a value chosen to make a demo look complete.
const reconciled = reconcileCase(decisionCase, { referenceDate: '2026-07-16' });
const quality = qualityReport(reconciled);
const ranked = scoreCase(reconciled);
Use the exact options supported by your pinned SDK version; the example describes the intended boundary and must be contract-tested before release.
4. Resolve weights over time
Keep base preferences and time phases separate:
effective raw weight = base weight × active phase multiplier
effective weight = effective raw weight / sum(all effective raw weights)
For a training plan, recovery risk may become more important during a taper phase. The user approves the phase schedule, and every decision run records the effective weights.
5. Apply hard constraints first
Weights answer “which eligible task fits best?” Constraints answer “may this task be selected?”
Examples:
- Exclude high-energy work after 19:00.
- Keep an unresolved hard blocker suggestion-only.
- Prevent an agent from deleting or reassigning tasks.
A high MAUT score never bypasses a capability or product permission.
6. Explain the result
Show:
- the score as a relative utility result,
- confidence or evidence coverage,
- top positive contribution,
- limiting contribution,
- evidence source,
- and any excluded constraints.
Prefer “Tempo intervals ranks first under your current weights” over “AI knows this is optimal.”
7. Learn only from explicit corrections
The SDK includes preference-model helpers. Train only from confirmed reorder, explicit pairwise choice, or explicit rating. Ask before using a correction, keep base weights visible, and provide a reset.
Next: design a governed autopilot.