codebase-receipts-cli 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. codebase_receipts_cli-1.0.0/.env.example +98 -0
  2. codebase_receipts_cli-1.0.0/.github/workflows/ci.yml +28 -0
  3. codebase_receipts_cli-1.0.0/.github/workflows/publish.yml +36 -0
  4. codebase_receipts_cli-1.0.0/.gitignore +33 -0
  5. codebase_receipts_cli-1.0.0/.pre-commit-config.yaml +19 -0
  6. codebase_receipts_cli-1.0.0/CHANGELOG.md +153 -0
  7. codebase_receipts_cli-1.0.0/CLAUDE.md +774 -0
  8. codebase_receipts_cli-1.0.0/LEARN.md +2485 -0
  9. codebase_receipts_cli-1.0.0/LICENSE +21 -0
  10. codebase_receipts_cli-1.0.0/PKG-INFO +268 -0
  11. codebase_receipts_cli-1.0.0/README.md +224 -0
  12. codebase_receipts_cli-1.0.0/SETUP.md +306 -0
  13. codebase_receipts_cli-1.0.0/pyproject.toml +110 -0
  14. codebase_receipts_cli-1.0.0/receipts/__init__.py +0 -0
  15. codebase_receipts_cli-1.0.0/receipts/ama/__init__.py +0 -0
  16. codebase_receipts_cli-1.0.0/receipts/ama/interviewer.py +415 -0
  17. codebase_receipts_cli-1.0.0/receipts/ats/__init__.py +1 -0
  18. codebase_receipts_cli-1.0.0/receipts/ats/comparator.py +98 -0
  19. codebase_receipts_cli-1.0.0/receipts/ats/scorer.py +550 -0
  20. codebase_receipts_cli-1.0.0/receipts/ats/stats.py +164 -0
  21. codebase_receipts_cli-1.0.0/receipts/cli.py +2062 -0
  22. codebase_receipts_cli-1.0.0/receipts/config.py +106 -0
  23. codebase_receipts_cli-1.0.0/receipts/errors.py +18 -0
  24. codebase_receipts_cli-1.0.0/receipts/export.py +120 -0
  25. codebase_receipts_cli-1.0.0/receipts/ingest/__init__.py +0 -0
  26. codebase_receipts_cli-1.0.0/receipts/ingest/artifact_extractor.py +679 -0
  27. codebase_receipts_cli-1.0.0/receipts/ingest/git_source.py +159 -0
  28. codebase_receipts_cli-1.0.0/receipts/ingest/manifest.py +114 -0
  29. codebase_receipts_cli-1.0.0/receipts/ingest/scanner.py +141 -0
  30. codebase_receipts_cli-1.0.0/receipts/ingest/secrets_scanner.py +225 -0
  31. codebase_receipts_cli-1.0.0/receipts/interactive/__init__.py +1 -0
  32. codebase_receipts_cli-1.0.0/receipts/interactive/repl.py +755 -0
  33. codebase_receipts_cli-1.0.0/receipts/ledger/__init__.py +0 -0
  34. codebase_receipts_cli-1.0.0/receipts/ledger/pricing_table.py +54 -0
  35. codebase_receipts_cli-1.0.0/receipts/ledger/token_ledger.py +226 -0
  36. codebase_receipts_cli-1.0.0/receipts/llm/__init__.py +0 -0
  37. codebase_receipts_cli-1.0.0/receipts/llm/anthropic_provider.py +95 -0
  38. codebase_receipts_cli-1.0.0/receipts/llm/factory.py +124 -0
  39. codebase_receipts_cli-1.0.0/receipts/llm/fake_provider.py +79 -0
  40. codebase_receipts_cli-1.0.0/receipts/llm/gemini_provider.py +205 -0
  41. codebase_receipts_cli-1.0.0/receipts/llm/json_utils.py +46 -0
  42. codebase_receipts_cli-1.0.0/receipts/llm/metered.py +62 -0
  43. codebase_receipts_cli-1.0.0/receipts/llm/ollama_provider.py +117 -0
  44. codebase_receipts_cli-1.0.0/receipts/llm/openai_provider.py +118 -0
  45. codebase_receipts_cli-1.0.0/receipts/llm/provider.py +42 -0
  46. codebase_receipts_cli-1.0.0/receipts/llm/split.py +78 -0
  47. codebase_receipts_cli-1.0.0/receipts/llm/token_estimate.py +35 -0
  48. codebase_receipts_cli-1.0.0/receipts/mine/__init__.py +1 -0
  49. codebase_receipts_cli-1.0.0/receipts/mine/code_metrics.py +246 -0
  50. codebase_receipts_cli-1.0.0/receipts/mine/git_evidence.py +109 -0
  51. codebase_receipts_cli-1.0.0/receipts/prep/__init__.py +1 -0
  52. codebase_receipts_cli-1.0.0/receipts/prep/dossier.py +313 -0
  53. codebase_receipts_cli-1.0.0/receipts/prep/readiness.py +227 -0
  54. codebase_receipts_cli-1.0.0/receipts/resume/__init__.py +0 -0
  55. codebase_receipts_cli-1.0.0/receipts/resume/claim_extractor.py +338 -0
  56. codebase_receipts_cli-1.0.0/receipts/resume/loader.py +35 -0
  57. codebase_receipts_cli-1.0.0/receipts/resume/pdf_parser.py +259 -0
  58. codebase_receipts_cli-1.0.0/receipts/resume/tex_parser.py +394 -0
  59. codebase_receipts_cli-1.0.0/receipts/rewrite/__init__.py +0 -0
  60. codebase_receipts_cli-1.0.0/receipts/rewrite/compiler.py +180 -0
  61. codebase_receipts_cli-1.0.0/receipts/rewrite/optimizer.py +140 -0
  62. codebase_receipts_cli-1.0.0/receipts/rewrite/tex_rewriter.py +227 -0
  63. codebase_receipts_cli-1.0.0/receipts/tui/__init__.py +0 -0
  64. codebase_receipts_cli-1.0.0/receipts/tui/ama_app.py +454 -0
  65. codebase_receipts_cli-1.0.0/receipts/tui/app.py +316 -0
  66. codebase_receipts_cli-1.0.0/receipts/tui/dossier_app.py +170 -0
  67. codebase_receipts_cli-1.0.0/receipts/tui/hub.py +367 -0
  68. codebase_receipts_cli-1.0.0/receipts/tui/ingest_app.py +183 -0
  69. codebase_receipts_cli-1.0.0/receipts/tui/rewrite_app.py +463 -0
  70. codebase_receipts_cli-1.0.0/receipts/tui/score_app.py +237 -0
  71. codebase_receipts_cli-1.0.0/receipts/tui/widgets/__init__.py +0 -0
  72. codebase_receipts_cli-1.0.0/receipts/tui/widgets/claims_table.py +50 -0
  73. codebase_receipts_cli-1.0.0/receipts/tui/widgets/diff_view.py +38 -0
  74. codebase_receipts_cli-1.0.0/receipts/tui/widgets/status_bar.py +38 -0
  75. codebase_receipts_cli-1.0.0/receipts/verify/__init__.py +0 -0
  76. codebase_receipts_cli-1.0.0/receipts/verify/bm25.py +112 -0
  77. codebase_receipts_cli-1.0.0/receipts/verify/enrich.py +128 -0
  78. codebase_receipts_cli-1.0.0/receipts/verify/jd_fetch.py +101 -0
  79. codebase_receipts_cli-1.0.0/receipts/verify/kb.py +379 -0
  80. codebase_receipts_cli-1.0.0/receipts/verify/keyword_gap.py +127 -0
  81. codebase_receipts_cli-1.0.0/receipts/verify/query_expand.py +88 -0
  82. codebase_receipts_cli-1.0.0/receipts/verify/rerank.py +74 -0
  83. codebase_receipts_cli-1.0.0/receipts/verify/rewriter.py +172 -0
  84. codebase_receipts_cli-1.0.0/receipts/verify/router.py +211 -0
  85. codebase_receipts_cli-1.0.0/receipts/verify/summaries.py +258 -0
  86. codebase_receipts_cli-1.0.0/receipts/verify/verifier.py +552 -0
  87. codebase_receipts_cli-1.0.0/tests/__init__.py +0 -0
  88. codebase_receipts_cli-1.0.0/tests/conftest.py +83 -0
  89. codebase_receipts_cli-1.0.0/tests/test_artifact_extractor.py +154 -0
  90. codebase_receipts_cli-1.0.0/tests/test_ats_comparator.py +127 -0
  91. codebase_receipts_cli-1.0.0/tests/test_ats_keyword_fix.py +60 -0
  92. codebase_receipts_cli-1.0.0/tests/test_ats_scorer.py +226 -0
  93. codebase_receipts_cli-1.0.0/tests/test_ats_stats.py +158 -0
  94. codebase_receipts_cli-1.0.0/tests/test_ats_v2.py +145 -0
  95. codebase_receipts_cli-1.0.0/tests/test_batch_parser_hardening.py +99 -0
  96. codebase_receipts_cli-1.0.0/tests/test_claim_extractor.py +224 -0
  97. codebase_receipts_cli-1.0.0/tests/test_cli.py +46 -0
  98. codebase_receipts_cli-1.0.0/tests/test_code_metrics.py +160 -0
  99. codebase_receipts_cli-1.0.0/tests/test_compiler.py +43 -0
  100. codebase_receipts_cli-1.0.0/tests/test_config.py +41 -0
  101. codebase_receipts_cli-1.0.0/tests/test_dossier.py +198 -0
  102. codebase_receipts_cli-1.0.0/tests/test_entry_filter.py +116 -0
  103. codebase_receipts_cli-1.0.0/tests/test_export.py +96 -0
  104. codebase_receipts_cli-1.0.0/tests/test_factory.py +69 -0
  105. codebase_receipts_cli-1.0.0/tests/test_fake_provider.py +48 -0
  106. codebase_receipts_cli-1.0.0/tests/test_gemini_provider.py +234 -0
  107. codebase_receipts_cli-1.0.0/tests/test_git_evidence.py +82 -0
  108. codebase_receipts_cli-1.0.0/tests/test_git_source.py +55 -0
  109. codebase_receipts_cli-1.0.0/tests/test_hybrid_retrieval.py +149 -0
  110. codebase_receipts_cli-1.0.0/tests/test_ingest_cli.py +62 -0
  111. codebase_receipts_cli-1.0.0/tests/test_interactive.py +230 -0
  112. codebase_receipts_cli-1.0.0/tests/test_interview_styles.py +85 -0
  113. codebase_receipts_cli-1.0.0/tests/test_interviewer.py +288 -0
  114. codebase_receipts_cli-1.0.0/tests/test_json_utils.py +55 -0
  115. codebase_receipts_cli-1.0.0/tests/test_kb.py +246 -0
  116. codebase_receipts_cli-1.0.0/tests/test_keyword_gap.py +166 -0
  117. codebase_receipts_cli-1.0.0/tests/test_language_coverage.py +195 -0
  118. codebase_receipts_cli-1.0.0/tests/test_ledger.py +138 -0
  119. codebase_receipts_cli-1.0.0/tests/test_metered_provider.py +77 -0
  120. codebase_receipts_cli-1.0.0/tests/test_new_tuis.py +139 -0
  121. codebase_receipts_cli-1.0.0/tests/test_openai_base_url.py +40 -0
  122. codebase_receipts_cli-1.0.0/tests/test_optimizer.py +168 -0
  123. codebase_receipts_cli-1.0.0/tests/test_pdf_parser.py +192 -0
  124. codebase_receipts_cli-1.0.0/tests/test_provider_contract.py +59 -0
  125. codebase_receipts_cli-1.0.0/tests/test_readiness.py +151 -0
  126. codebase_receipts_cli-1.0.0/tests/test_remote_sources.py +245 -0
  127. codebase_receipts_cli-1.0.0/tests/test_retrieval_upgrades.py +300 -0
  128. codebase_receipts_cli-1.0.0/tests/test_rewriter.py +168 -0
  129. codebase_receipts_cli-1.0.0/tests/test_rewriter_grounding.py +116 -0
  130. codebase_receipts_cli-1.0.0/tests/test_router.py +295 -0
  131. codebase_receipts_cli-1.0.0/tests/test_scanner.py +68 -0
  132. codebase_receipts_cli-1.0.0/tests/test_scanner_gitignored_venv.py +21 -0
  133. codebase_receipts_cli-1.0.0/tests/test_secrets_scanner.py +115 -0
  134. codebase_receipts_cli-1.0.0/tests/test_setup_config.py +47 -0
  135. codebase_receipts_cli-1.0.0/tests/test_split_provider.py +112 -0
  136. codebase_receipts_cli-1.0.0/tests/test_tex_identity_replacement.py +209 -0
  137. codebase_receipts_cli-1.0.0/tests/test_tex_parser.py +165 -0
  138. codebase_receipts_cli-1.0.0/tests/test_tex_rewriter.py +221 -0
  139. codebase_receipts_cli-1.0.0/tests/test_tui.py +107 -0
  140. codebase_receipts_cli-1.0.0/tests/test_tui_rewrite.py +62 -0
  141. codebase_receipts_cli-1.0.0/tests/test_tui_score.py +64 -0
  142. codebase_receipts_cli-1.0.0/tests/test_verifier.py +301 -0
  143. codebase_receipts_cli-1.0.0/tests/test_verifier_batch.py +255 -0
  144. codebase_receipts_cli-1.0.0/uv.lock +4754 -0
@@ -0,0 +1,98 @@
1
+ # Receipts configuration — copy this file to `.env` and edit as needed:
2
+ # cp .env.example .env
3
+ # The real `.env` is gitignored and must NEVER be committed. Every value here
4
+ # is a safe local default; nothing requires a paid API key.
5
+
6
+ # Which LLM provider to use: ollama | gemini | anthropic | openai | fake
7
+ # ollama — local, free, private, the default; needs the Ollama app running.
8
+ # gemini — Google Gemini with a FREE key from https://aistudio.google.com/apikey
9
+ # anthropic — paid; needs ANTHROPIC_API_KEY (pip install codebase-receipts-cli[anthropic])
10
+ # openai — paid; needs OPENAI_API_KEY (pip install codebase-receipts-cli[openai])
11
+ # fake — deterministic offline stub, only useful for tests/demos.
12
+ RECEIPTS_PROVIDER=ollama
13
+
14
+ # Optional: use a DIFFERENT provider for embeddings than for chat.
15
+ # Required for anthropic (Claude has no embeddings API):
16
+ # RECEIPTS_PROVIDER=anthropic
17
+ # RECEIPTS_EMBED_PROVIDER=gemini
18
+ # IMPORTANT: must match whatever embedded your knowledge base — vectors from
19
+ # different embedding models are not comparable (re-ingest if you switch).
20
+ RECEIPTS_EMBED_PROVIDER=
21
+
22
+ # Hybrid retrieval (dense embeddings + BM25 keyword match, fused): on by
23
+ # default and costs zero extra LLM calls. Set to 0 to fall back to
24
+ # embeddings-only retrieval.
25
+ RECEIPTS_HYBRID=1
26
+
27
+ # --- Optional retrieval upgrades (each costs LLM calls; all off by default
28
+ # --- so the standard path stays fast on modest machines) -------------------
29
+
30
+ # Contextual chunk enrichment at ingest: one LLM call per artifact generates
31
+ # a one-line context prepended before embedding. Cached by content hash, so
32
+ # re-ingests regenerate nothing. Better disambiguation at query time.
33
+ RECEIPTS_ENRICH=0
34
+
35
+ # Hierarchical corpus summaries at ingest: per-file -> per-directory -> one
36
+ # repo-level architecture summary, each stored as a searchable chunk so
37
+ # whole-repo claims ("microservices architecture") can retrieve real
38
+ # evidence. Cached like enrichment. (The zero-LLM CODE FACTS and IMPORT MAP
39
+ # chunks are always added — no flag needed.)
40
+ RECEIPTS_SUMMARIES=0
41
+
42
+ # Query expansion + HyDE at verify time: rewrite each claim into 2-3
43
+ # code-phrased queries plus a hypothetical snippet, search all of them, and
44
+ # allow ONE reformulate-and-retry when nothing passes the threshold.
45
+ RECEIPTS_QUERY_EXPANSION=0
46
+
47
+ # LLM reranking at verify time: over-fetch candidates and let the model
48
+ # reorder the top of the pile before verification. Reorders/drops only —
49
+ # it can never add evidence or bypass the distance threshold.
50
+ RECEIPTS_RERANK=0
51
+
52
+ # Where the local Ollama daemon listens. The default matches a standard install.
53
+ OLLAMA_HOST=http://localhost:11434
54
+
55
+ # Ollama chat model for verification/rewriting. gpt-oss:20b is strong at code
56
+ # reasoning but needs ~16 GB RAM; if your machine struggles, try gemma3:4b.
57
+ # See what you have with `ollama list`; pull with `ollama pull <model>`.
58
+ OLLAMA_CHAT_MODEL=gpt-oss:20b
59
+
60
+ # Ollama embedding model used to index your code. nomic-embed-text is the
61
+ # standard lightweight choice. Changing it later means re-ingesting, since
62
+ # vectors from different models are not comparable.
63
+ OLLAMA_EMBED_MODEL=nomic-embed-text
64
+
65
+ # Free Gemini API key from Google AI Studio (https://aistudio.google.com/apikey).
66
+ # Only needed when RECEIPTS_PROVIDER=gemini. Note: receipts reads exactly this
67
+ # variable and passes it to the SDK explicitly, so a stray GOOGLE_API_KEY in
68
+ # your environment won't silently take over.
69
+ GEMINI_API_KEY=
70
+
71
+ # Gemini chat model (free-tier eligible as of July 2026).
72
+ GEMINI_CHAT_MODEL=gemini-3.5-flash
73
+
74
+ # Gemini embedding model. gemini-embedding-001 also works, but its vectors are
75
+ # INCOMPATIBLE with gemini-embedding-2 — pick one and re-ingest if you switch.
76
+ GEMINI_EMBED_MODEL=gemini-embedding-2
77
+
78
+ # Anthropic API key (paid). Only needed when RECEIPTS_PROVIDER=anthropic.
79
+ # Get one at https://console.anthropic.com/
80
+ # Note: Anthropic does not offer an embeddings API. Use Ollama or Gemini for
81
+ # ingestion, then switch to anthropic for verification/rewriting.
82
+ ANTHROPIC_API_KEY=
83
+ ANTHROPIC_CHAT_MODEL=claude-sonnet-4-20250514
84
+
85
+ # OpenAI API key (paid). Only needed when RECEIPTS_PROVIDER=openai.
86
+ # Get one at https://platform.openai.com/
87
+ OPENAI_API_KEY=
88
+ OPENAI_CHAT_MODEL=gpt-4o-mini
89
+ OPENAI_EMBED_MODEL=text-embedding-3-small
90
+
91
+ # Optional: point the OpenAI adapter at any OpenAI-COMPATIBLE endpoint —
92
+ # e.g. Groq or OpenRouter (both have hosted strong open models like
93
+ # gpt-oss-20b, sometimes with free tiers) or a local inference server.
94
+ # Leave empty for the official OpenAI API. Set OPENAI_API_KEY to the key
95
+ # for whichever service the URL points at.
96
+ # Groq: OPENAI_BASE_URL=https://api.groq.com/openai/v1
97
+ # OpenRouter: OPENAI_BASE_URL=https://openrouter.ai/api/v1
98
+ OPENAI_BASE_URL=
@@ -0,0 +1,28 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ test:
14
+ runs-on: ${{ matrix.os }}
15
+ strategy:
16
+ matrix:
17
+ os: [ubuntu-latest, windows-latest]
18
+ python-version: ["3.10", "3.12"]
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+ - uses: astral-sh/setup-uv@v4
22
+ with:
23
+ version: "latest"
24
+ - run: uv python install ${{ matrix.python-version }}
25
+ - run: uv sync --group dev
26
+ - run: uv run ruff check receipts/ tests/
27
+ - run: uv run black --check receipts/ tests/
28
+ - run: uv run pytest -v
@@ -0,0 +1,36 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ test:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ - uses: astral-sh/setup-uv@v4
17
+ with:
18
+ version: "latest"
19
+ - run: uv sync --group dev
20
+ - run: uv run ruff check receipts/ tests/
21
+ - run: uv run black --check receipts/ tests/
22
+ - run: uv run pytest -v
23
+
24
+ publish:
25
+ needs: test
26
+ runs-on: ubuntu-latest
27
+ environment: pypi
28
+ permissions:
29
+ id-token: write
30
+ steps:
31
+ - uses: actions/checkout@v4
32
+ - uses: astral-sh/setup-uv@v4
33
+ with:
34
+ version: "latest"
35
+ - run: uv build
36
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,33 @@
1
+ __pycache__/
2
+ *.pyc
3
+ .venv/
4
+ .uv/
5
+ dist/
6
+ *.egg-info/
7
+ .pytest_cache/
8
+ .ruff_cache/
9
+
10
+ # BYOK — real keys live here and must never be committed
11
+ .env
12
+
13
+ # Personal test data — your actual resume and target JD stay local
14
+ resume.tex
15
+ jd.txt
16
+
17
+ # Generated outputs (rebuilt by the tool on demand)
18
+ resume_optimized.tex
19
+ resume_optimized.pdf
20
+ dossier.md
21
+ dossier.pdf
22
+
23
+ # Editor / assistant local state
24
+ .claude/
25
+ .vscode/
26
+
27
+ # LaTeX build artifacts (receipts export / pdflatex)
28
+ *.aux
29
+ *.toc
30
+ resume_optimized.log
31
+ resume_optimized.out
32
+ sanity_dossier.md
33
+ sanity_dossier.pdf
@@ -0,0 +1,19 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.15.20
4
+ hooks:
5
+ - id: ruff
6
+ args: [--fix]
7
+ - repo: https://github.com/psf/black
8
+ rev: 26.5.1
9
+ hooks:
10
+ - id: black
11
+ - repo: https://github.com/pre-commit/pre-commit-hooks
12
+ rev: v6.0.0
13
+ hooks:
14
+ - id: end-of-file-fixer
15
+ - id: trailing-whitespace
16
+ - id: check-added-large-files
17
+ # uv.lock is ~1MB and belongs in the repo (reproducible dev env)
18
+ args: [--maxkb=2048]
19
+ - id: detect-private-key
@@ -0,0 +1,153 @@
1
+ <h1 align="center">CHANGELOG</h1>
2
+
3
+ <p align="center">
4
+ <sub>All notable changes, one version at a time.</sub>
5
+ </p>
6
+
7
+ <br>
8
+
9
+ ---
10
+
11
+ ## `1.0.0` &mdash; 2026-07-17
12
+
13
+ > Phases 8 through 23. Multi-repo, scale, remote sources, universal
14
+ > language coverage, a unified TUI, next-gen retrieval, and PDF resumes —
15
+ > on top of the 0.1.0 foundation.
16
+
17
+ ### Model Answers &amp; Interview Prep
18
+
19
+ - AMA reveals a grounded, honest model answer after every round (honest
20
+ reframe when no evidence exists) instead of just a pass/fail verdict
21
+ - Dossier upgraded to one model answer per question, not one per bullet
22
+ - Readiness tracking persists model answers via an additive DB migration
23
+
24
+ ### Complete Slash-Command Palette
25
+
26
+ - `/check` `/setup` `/tui` `/export` `/ledger` `/dashboard` added to the
27
+ interactive REPL &mdash; every CLI command now has a slash equivalent
28
+ - Fixed `/check` incorrectly fuzzy-matching into `/verify`
29
+ - Fixed a dead `--session` flag on `receipts ledger` that silently did
30
+ nothing; added `TokenLedger.last_session_summary()`
31
+
32
+ ### Scale Provisioning
33
+
34
+ - Ingest budget auto-scales to corpus size with importance allocation
35
+ (parsed code over file excerpts, round-robin across directories) instead
36
+ of a fixed cap spent in alphabetical order
37
+ - Incremental sync via content hashing: only new/changed artifacts are
38
+ re-embedded on re-ingest &mdash; measured 249.6s cold to 4.7s warm (~53x)
39
+ on a 376-artifact codebase
40
+ - Source-labelled, filterable retrieval closes a measured cross-source
41
+ contamination gap (86% of claims picked up wrong-project evidence in a
42
+ merged corpus; 0% with the filter)
43
+
44
+ ### Remote Sources
45
+
46
+ - `receipts ingest <github-url>` gets a durable, URL-keyed knowledge base
47
+ and a manifest of aliases usable anywhere a folder is accepted
48
+ - `GITHUB_TOKEN` support for private repos (never logged, scrubbed from
49
+ every error message), `--branch`, `--full-history`
50
+ - `--jd-url` fetches a job description straight from a posting URL
51
+
52
+ ### Universal Language Coverage
53
+
54
+ - Extraction parity for Java, Kotlin, Go, Rust, C, C++, C#, PHP, Ruby,
55
+ Swift &mdash; tree-sitter grammar node types probe-verified against the
56
+ installed parser (never guessed) plus a regex fallback for the Windows
57
+ path where tree-sitter is disabled
58
+
59
+ ### PDF &amp; Plain-Text Resumes
60
+
61
+ - `verify`, `ama`, `dossier`, and `score` accept `.pdf` and `.txt` resumes
62
+ in addition to `.tex` &mdash; zero LLM cost, pure text extraction plus
63
+ layout heuristics, measured at 85% claim-fidelity against a `.tex`
64
+ ground truth
65
+ - Scanned/image PDFs are rejected with guidance, never guessed at
66
+
67
+ ### TUI Hub
68
+
69
+ - One unified app for dashboard, readiness, and ledger screens with
70
+ consistent keybindings and `--tui` deep links from each command
71
+ - New per-model token/cost breakdown on the ledger screen
72
+
73
+ ### Next-Generation Retrieval
74
+
75
+ - Hybrid retrieval: a from-scratch BM25 lexical index fused with dense
76
+ embeddings via reciprocal rank fusion, on by default &mdash; measured
77
+ recall@5 improvement (8/11 to 11/11) with false-evidence chunks going
78
+ *down*, not up
79
+ - A self-checking calibration gate measures whether any retrieval upgrade
80
+ makes the tool more gullible before it ships. It already caught one:
81
+ query-expansion/HyDE doubled the false-evidence rate (15 to 30 chunks)
82
+ by generating fake supporting code and searching with it &mdash; that
83
+ feature now ships disabled by default
84
+ - Contextual chunk enrichment, hierarchical corpus summaries, and an
85
+ LLM reranker, all opt-in and independently toggleable
86
+
87
+ ### Fixes
88
+
89
+ - MiKTeX-aware TeX compiler with platform-ordered fallbacks (pdflatex
90
+ before latexmk on Windows, where latexmk needs Perl)
91
+ - Architecture-aware install failure messages for tree-sitter and chromadb
92
+ on unsupported platforms, with concrete fix instructions per OS
93
+
94
+ ---
95
+
96
+ ## `0.1.0` &mdash; 2026-07-08
97
+
98
+ > The one that ships everything.
99
+
100
+ ### Ingest Pipeline
101
+
102
+ - Tree-style codebase scanner respecting `.gitignore`
103
+ - Git URL support &mdash; clone remote repos, scan, clean up
104
+ - Pre-embedding secrets detection (named patterns + Shannon entropy) with
105
+ automatic redaction
106
+ - Tree-sitter artifact extraction (functions, classes) with configurable
107
+ token budget
108
+
109
+ ### Resume Parsing
110
+
111
+ - LaTeX `.tex` parser supporting rendercv and common resume templates
112
+ - Claim extractor: percentages, counts, latency figures, technology names
113
+
114
+ ### Verification Engine
115
+
116
+ - ChromaDB-backed knowledge base with cosine similarity search
117
+ - Three-tier classification: **Verified** / **Plausible** / **Unsupported**
118
+ - Hard rule: no evidence past distance threshold = Unsupported, no LLM call
119
+ - Honest rewriter: rewrites weak bullets using only what the code can justify
120
+ - Keyword gap analysis: job description vs resume vs codebase
121
+
122
+ ### Terminal UI
123
+
124
+ - Full-screen Textual app: file tree, claims table, rewrites diff, LLM log
125
+ - Live token counter and status bar
126
+ - Background verification with thread-safe UI updates
127
+
128
+ ### Mock Interview
129
+
130
+ - `ama` command: weighted Q&A loop targeting weak claims
131
+ - Follow-up questions, per-bullet assessment, final summary
132
+
133
+ ### Provider Abstraction (BYOK)
134
+
135
+ - **Ollama** &mdash; default, local, free, no key needed
136
+ - **Gemini** &mdash; free-tier Google AI Studio key
137
+ - **Anthropic** &mdash; paid BYOK adapter (optional dependency)
138
+ - **OpenAI** &mdash; paid BYOK adapter (optional dependency)
139
+ - Fake provider for fully offline, deterministic testing
140
+
141
+ ### Token Ledger
142
+
143
+ - SQLite-backed per-session and lifetime token/cost tracking
144
+ - Pricing table: $/1K-token rates per provider and model
145
+ - `receipts ledger` CLI command for usage summaries
146
+
147
+ ### Infrastructure
148
+
149
+ - `uv`-managed project with ruff + black pre-commit hooks
150
+ - 136 tests, zero network access, zero Ollama dependency
151
+ - CI: GitHub Actions on Ubuntu + Windows, Python 3.10 + 3.12
152
+ - Publishing: trusted publishing (OIDC) to PyPI on tag push
153
+ - MIT License