SpendSignal
A deterministic behavioral feedback loop for personal purchases.
v0.7.0 · PyPI · Private (in development)
The loop
purchase (item level)
→ reflect — answer questions about each item
→ knowledge base grows
→ deterministic engine — same input, same output, always
→ query your own history
→ answer grounded in your behavior
Run the full loop right now with the demo data:
pip install spendsignal
# 1. What does my history say about protein powder? (uses committed demo data)
spendsignal summarize --purchases fixtures/purchases.jsonl \
--feedback fixtures/feedback.jsonl --subject protein-powder
# 2. Have I bought anything like protein powder?
spendsignal retrieve --purchases fixtures/purchases.jsonl \
--feedback fixtures/feedback.jsonl --query "protein powder"
# 3. Answer questions — build your own knowledge base
spendsignal reflect --purchases fixtures/purchases.jsonl \
--feedback fixtures/feedback.jsonl
# 4. Summarize again — your answers are now in the output
spendsignal summarize --purchases fixtures/purchases.jsonl \
--feedback fixtures/feedback.jsonl --subject protein-powder
The fourth command returns different output than the first. Your feedback changed it. That is the loop.
Clone the repo to run the demo commands against the committed fixtures:
git clone git@github.com:YemaneSG/SpendSignal.git && cd SpendSignal
Your Amazon data
Amazon lets you download your full order history as a CSV with real item-level detail.
amazon.com → Account & Lists → Download Order Reports → Request Report → Download
# One command: converts your orders to SpendSignal format
spendsignal ingest --csv ~/Downloads/amazon-orders.csv
# Same loop, your real data
spendsignal reflect
spendsignal retrieve --query "protein powder"
spendsignal summarize --subject protein-powder
No bank credentials. No receipt photos. No API keys.
How it works
Four JSON schemas in schemas/ define the contracts. Same input in, same output out.
purchase-event → what you bought and what was in the basket
reflection-exposure → when you were asked about an item
feedback-event → your answer (worth_it, would_buy_again, still_using)
evidence-summary → the deterministic output of querying your knowledge
The engine lives in src/spendsignal/aggregate.py. It takes event streams, resolves supersession (you can change your mind — old answers are preserved), and returns an EvidenceSummary with coverage, per-axis distributions, contradictions, contributing event IDs, and explicit abstention when evidence is insufficient.
It never invents a score. Missing evidence = explicit abstention, not a guess.
License
MIT. See LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spendsignal-0.7.0.tar.gz.
File metadata
- Download URL: spendsignal-0.7.0.tar.gz
- Upload date:
- Size: 50.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
518dd954c0e3d230bb6844361b3d58abdf784f357ae59bbabf7bfab03bca71ab
|
|
| MD5 |
8444d861bbd6ee9e0037efe1579915ab
|
|
| BLAKE2b-256 |
f6b8faca2f8018c933a0932655362be340a2376a0ab28be1f4bae399f2f4ebb9
|
File details
Details for the file spendsignal-0.7.0-py3-none-any.whl.
File metadata
- Download URL: spendsignal-0.7.0-py3-none-any.whl
- Upload date:
- Size: 35.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
56d1575cf867974d52b934b5f76661572baf731b8c775533c588b1dec4f3be5f
|
|
| MD5 |
3281225c428737c8be7f6642a679b800
|
|
| BLAKE2b-256 |
6c95d50ad65e6e360a90b309d100bdaed85f2bc59b3e8e5c20c871b5034442b5
|