Supportive accountability for fast-moving teams β turn "I'll handle that" into tracked, gently-followed-up commitments.
Teams lose a surprising amount of work in the gap between "I'll take care of that" and the ticket nobody ever created. Commitment Decay Engine captures the action items people commit to in meetings and chat, stores each one as a plain, human-readable markdown file, and then reconciles those promises against real evidence β tickets, pull requests, and status updates β to see what actually got done.
The guiding idea is in the name: commitments decay when nobody remembers them. The engine keeps track without turning follow-through into surveillance. It only marks work as fulfilled when there is clear completion evidence, and when something slips it suggests a private, empathetic, rate-limited reminder instead of a public callout. It runs fully offline in demo mode with fictional fixtures β no credentials, no external services.
- Commitment extraction from speaker-labeled transcripts using a deterministic, conservative parser (only first-person promises count; "we should" and "I already did" are filtered out).
- Human-readable markdown ledger β every commitment is one git-diffable, hand-editable
.mdfile with a lossless read/write round-trip. - Evidence reconciliation β keyword + actor scoring matches commitments to evidence and marks them fulfilled only when completion language is present.
- Supportive nudge policy β minimum age, max-nudge cap, one-nudge-per-day, and escalating-but-kind private message templates.
- Weekly analytics β per-person and per-status summaries with fulfillment rates, designed to fix process problems rather than shame people.
- CLI-first workflow with an end-to-end
democommand. - Adapter-friendly core β local-file inputs in the public repo; Slack / Linear / GitHub / Jira / Notion adapters can plug in without touching policy logic.
meeting transcript / chat export
|
v
commitment extractor (extractor.py)
|
v
markdown commitment ledger (ledger.py)
|
v
evidence reconciliation (reconcile.py)
|
v
nudge policy + analytics (nudges.py, analytics.py)
|
v
status update / private nudge / weekly report
The package is split into small, single-responsibility modules, orchestrated by an argparse CLI exposed as the cde command. Policy logic (extraction, reconciliation, nudging, analytics) is kept strictly separate from integrations: the public repo ships only local-file adapters, and the core engine never knows about vendor-specific APIs.
| Layer | Technology |
|---|---|
| Language | Python 3.11+ |
| CLI | argparse (cde entrypoint) |
| Data model | dataclasses (slotted) + StrEnum |
| Extraction | Standard-library re (regex) |
| Storage | Markdown files (git-diffable, lossless I/O) |
| Evidence format | JSON |
| Tests | pytest |
| Packaging | setuptools via pyproject.toml |
commitment_decay_engine/
analytics.py weekly summaries and follow-through patterns
cli.py argparse command line interface (cde)
extractor.py transcript/chat commitment extraction
ledger.py markdown file persistence (render + parse)
models.py dataclasses and status enums
nudges.py rate limits and private reminder templates
reconcile.py evidence matching and status updates
examples/
sample_transcript.txt
sample_evidence.json
docs/
architecture.md
privacy.md
tests/
test_extractor.py
test_ledger.py
test_nudges.py
test_reconcile.py
LICENSE
README.md
SECURITY.md
pyproject.toml
Requires Python 3.11+.
git clone https://github.com/akira231097/commitment-decay-engine.git
cd commitment-decay-engine
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e ".[dev]"Run the test suite:
pytest -qRun the full end-to-end demo (extract β reconcile β report against the bundled fixtures):
cde demoOr drive the pipeline step by step:
# Extract commitments from a transcript into a ledger directory
cde extract examples/sample_transcript.txt --ledger .demo-ledger --date 2026-01-14
# List open commitments
cde list --ledger .demo-ledger --status open
# Reconcile against evidence and update statuses
cde reconcile --ledger .demo-ledger --evidence examples/sample_evidence.json
# Generate an analytics report
cde report --ledger .demo-ledgerNo credentials are needed for any of the above. .env.example lists optional adapter variables (all empty) for future integrations only.
Extraction is conservative by design. extract_commitments scans speaker-labeled lines (Name: utterance) and keeps an utterance only if it matches a first-person future-intent pattern (I'll, I will, I can, I am going to, Let me, I'll handle) and avoids non-commitment hints like we should or i already. Each kept line yields a Commitment with a derived title, a coarse deadline (today / tomorrow / weekday / ISO date), and up to five keywords. The module's docstring is explicit that this deterministic layer can be replaced by an LLM extractor returning the same Commitment dataclass β the rest of the pipeline never changes.
The ledger is deliberately boring. Each commitment is rendered to a self-contained markdown file keyed by a slugified date-person-title, and parsed back via a regex field table for a lossless round-trip. Markdown is easy to audit, diff, edit by hand, and version in git β no database required.
Reconciliation avoids false positives. Evidence is scored by keyword/title overlap with a +2 boost when the evidence actor matches the committed person, and a minimum score of 2 is required before anything matches β there's a dedicated test proving a single shared generic word won't cause a false match. A commitment is only marked Fulfilled when the best-matching evidence contains completion language (done, merged, shipped, deployed, resolved, β¦); weaker matches are recorded as progress but left Open.
Nudges encode empathy as policy. evaluate_nudge is a pure function gated by a minimum age (default 2 days), a max-nudge cap (default 3), and a one-nudge-per-day limit. Message tone escalates gently with nudge count β the first offers to create a ticket; the last offers to close it out with "no judgment β priorities shift."
Analytics surface systems, not scapegoats. summarize aggregates the ledger into status counts, per-person fulfillment rates, and a list of open items β intended to reveal process problems (too many verbal commitments, missing ticket creation, unclear owners) rather than to rank individuals.
- The bundled extractor is regex-based and deterministic by design β it favors precision and auditability over recall, and is structured as a drop-in seam for an LLM-based extractor.
- The public repo ships only local-file inputs and fictional fixtures. Real integrations (Slack, Linear, GitHub, Jira, Notion) are intended to live outside the core as adapters that produce
Commitment/EvidenceItemobjects. - This repo intentionally contains only fictional people and fake evidence links. Do not commit real transcripts, private chat exports, customer data, tokens, or internal ticket data. See docs/privacy.md and SECURITY.md.
Released under the MIT License.