ask-just 0.1.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 (61) hide show
  1. ask_just-0.1.0/PKG-INFO +777 -0
  2. ask_just-0.1.0/README.md +770 -0
  3. ask_just-0.1.0/ask_just.egg-info/PKG-INFO +777 -0
  4. ask_just-0.1.0/ask_just.egg-info/SOURCES.txt +59 -0
  5. ask_just-0.1.0/ask_just.egg-info/dependency_links.txt +1 -0
  6. ask_just-0.1.0/ask_just.egg-info/entry_points.txt +2 -0
  7. ask_just-0.1.0/ask_just.egg-info/top_level.txt +1 -0
  8. ask_just-0.1.0/ask_just_cli/__init__.py +1 -0
  9. ask_just-0.1.0/ask_just_cli/agent_setup.py +109 -0
  10. ask_just-0.1.0/ask_just_cli/cli.py +1286 -0
  11. ask_just-0.1.0/ask_just_cli/skills/askjust/SKILL.md +506 -0
  12. ask_just-0.1.0/ask_just_cli/skills/braintrust/SKILL.md +61 -0
  13. ask_just-0.1.0/ask_just_cli/skills/correction/SKILL.md +77 -0
  14. ask_just-0.1.0/ask_just_cli/skills/just-source/SKILL.md +394 -0
  15. ask_just-0.1.0/pyproject.toml +20 -0
  16. ask_just-0.1.0/setup.cfg +4 -0
  17. ask_just-0.1.0/tests/test_asana_cached_snapshot.py +66 -0
  18. ask_just-0.1.0/tests/test_ask_just_cli.py +38 -0
  19. ask_just-0.1.0/tests/test_ask_just_doctor.py +222 -0
  20. ask_just-0.1.0/tests/test_ask_just_onboarding_code.py +84 -0
  21. ask_just-0.1.0/tests/test_askjust_golden_quality_runner.py +109 -0
  22. ask_just-0.1.0/tests/test_backfill_spins_item_rankings.py +133 -0
  23. ask_just-0.1.0/tests/test_braintrust_tracing.py +124 -0
  24. ask_just-0.1.0/tests/test_build_source_required_inputs.py +119 -0
  25. ask_just-0.1.0/tests/test_capture_order_allocation_source_proofs.py +363 -0
  26. ask_just-0.1.0/tests/test_check_vm_source_refresh_status.py +122 -0
  27. ask_just-0.1.0/tests/test_compare_order_allocation_historical_day.py +54 -0
  28. ask_just-0.1.0/tests/test_cross_source_pressure.py +88 -0
  29. ask_just-0.1.0/tests/test_deep_research_just.py +116 -0
  30. ask_just-0.1.0/tests/test_direct_bypass_routing.py +208 -0
  31. ask_just-0.1.0/tests/test_dot_foodservice_source.py +56 -0
  32. ask_just-0.1.0/tests/test_finance_cash_flow_metrics.py +126 -0
  33. ask_just-0.1.0/tests/test_formulations_vault_source.py +59 -0
  34. ask_just-0.1.0/tests/test_fresh_source_plane.py +907 -0
  35. ask_just-0.1.0/tests/test_install_script.py +401 -0
  36. ask_just-0.1.0/tests/test_just_us_canada_bom_source.py +55 -0
  37. ask_just-0.1.0/tests/test_just_wiki_validator.py +341 -0
  38. ask_just-0.1.0/tests/test_netsuite_revenue_sources.py +115 -0
  39. ask_just-0.1.0/tests/test_onboarding_codes.py +106 -0
  40. ask_just-0.1.0/tests/test_operations_logistics_otif_source.py +71 -0
  41. ask_just-0.1.0/tests/test_operations_order_allocation_source.py +100 -0
  42. ask_just-0.1.0/tests/test_order_allocation_actions.py +290 -0
  43. ask_just-0.1.0/tests/test_order_allocation_source_family_proofs.py +123 -0
  44. ask_just-0.1.0/tests/test_personal_mail.py +249 -0
  45. ask_just-0.1.0/tests/test_prime_simple_setup.py +138 -0
  46. ask_just-0.1.0/tests/test_project_onestream_source.py +48 -0
  47. ask_just-0.1.0/tests/test_query_routing.py +242 -0
  48. ask_just-0.1.0/tests/test_question_simulator.py +186 -0
  49. ask_just-0.1.0/tests/test_semantic_router_playground.py +84 -0
  50. ask_just-0.1.0/tests/test_serve_http_health.py +1128 -0
  51. ask_just-0.1.0/tests/test_serve_http_onboarding.py +105 -0
  52. ask_just-0.1.0/tests/test_sharepoint_graph_credentials.py +81 -0
  53. ask_just-0.1.0/tests/test_source_all_planning.py +1442 -0
  54. ask_just-0.1.0/tests/test_source_handoff_consistency.py +69 -0
  55. ask_just-0.1.0/tests/test_source_index.py +29 -0
  56. ask_just-0.1.0/tests/test_spins_item_ranking_rows.py +494 -0
  57. ask_just-0.1.0/tests/test_spins_velocity_goal_audit.py +84 -0
  58. ask_just-0.1.0/tests/test_tofutown_source_boundaries.py +58 -0
  59. ask_just-0.1.0/tests/test_traced_query.py +186 -0
  60. ask_just-0.1.0/tests/test_verify_source_goal_complete.py +194 -0
  61. ask_just-0.1.0/tests/test_wecare_mailbox_summaries.py +158 -0
@@ -0,0 +1,777 @@
1
+ Metadata-Version: 2.4
2
+ Name: ask-just
3
+ Version: 0.1.0
4
+ Summary: Thin CLI for the hosted Ask Just source plane
5
+ Requires-Python: >=3.10
6
+ Description-Content-Type: text/markdown
7
+
8
+ # Ask Just
9
+
10
+ Ask Just is the first source-backed company model of Just.
11
+
12
+ The `ask-just` CLI and hosted API remain the stable technical surface for
13
+ compatibility. Ask Just is the model identity above that source plane: verified
14
+ source lanes, provenance rows, source-routing rules, correction memory, Deep
15
+ Research bundles, and governed action boundaries.
16
+
17
+ The goal is simple: a teammate should be able to ask Just what it knows, inspect
18
+ the evidence, challenge the answer, and improve the memory as new artifacts
19
+ appear.
20
+
21
+ ## Teammate Setup
22
+
23
+ Install Ask Just for a teammate with one command:
24
+
25
+ ```bash
26
+ uvx ask-just setup --code JST-MZ6X-F56K
27
+ ```
28
+
29
+ The code is stable until Josh or an admin rotates it. This command installs or
30
+ refreshes the persistent CLI, exchanges the setup code, configures Codex and
31
+ Claude Code, runs doctor, runs the canonical verification query, and reports
32
+ the source id.
33
+
34
+ Under the hood, Ask Just does not ask a live app, SharePoint folder, exported
35
+ row set, or loose pile of files every time. It follows the source contract:
36
+
37
+ ```text
38
+ map the source -> access it -> enumerate it where needed -> parse it into atomic units or live-query proof records -> verify receipts -> make it queryable
39
+ ```
40
+
41
+ Once a source passes that gate, normal Ask Just answers come through the hosted
42
+ API backed by the GCP VM source index with provenance. That is what makes
43
+ answers fast, repeatable, and inspectable without turning local rebuild
44
+ artifacts into answer fallbacks.
45
+
46
+ Read [SPEC.md](SPEC.md) for the deeper product contract and future direction.
47
+ Read [docs/ask-just-model-card.md](docs/ask-just-model-card.md) for the model card
48
+ and [docs/ask-just-release-notes.md](docs/ask-just-release-notes.md) for release
49
+ history.
50
+ Read [docs/ask-monarch-flow-map.md](docs/ask-monarch-flow-map.md) for the
51
+ piece-by-piece mapping from Monarch-1 to Ask Just.
52
+ Read [docs/source-receipts/completion-audit.md](docs/source-receipts/completion-audit.md)
53
+ for the phase audit behind the current source-plane claim.
54
+ Read [docs/full-source-completion-frontier.md](docs/full-source-completion-frontier.md)
55
+ for what is active now and what is explicitly not yet claimed.
56
+
57
+ ## Architecture
58
+
59
+ Ask Just has two flows: source onboarding builds the verified SQLite/FTS index
60
+ on the VM, and the `ask-just` CLI calls the hosted API to ask that index for
61
+ evidence.
62
+
63
+ ![Ask Just architecture](docs/ask-just-architecture.png)
64
+
65
+ ## Source Lane Change Rule
66
+
67
+ Every new answerable source lane must update the product contract and the
68
+ explainable architecture in the same change. A lane is not done if it only
69
+ appears in parser code or source maps.
70
+
71
+ For each new source id, update:
72
+
73
+ - `config/all-source-ids.json`, `config/queryable-source-ids.json`, and
74
+ `config/fresh-source-map.yaml`
75
+ - parser code, receipts, hosted VM SQLite verification, and freshness proof
76
+ - `README.md`, `SPEC.md`, and `ARCHITECTURE.md`
77
+ - `docs/ask-just-architecture.svg` and the rendered
78
+ `docs/ask-just-architecture.png`
79
+
80
+ ## Visual Explainers
81
+
82
+ Ask Just's architecture explainer is a repo-owned static SVG rendered to PNG.
83
+ The SVG is the editable source; the PNG is the README-facing asset.
84
+
85
+ ```bash
86
+ sips -s format png docs/ask-just-architecture.svg --out docs/ask-just-architecture.png
87
+ ```
88
+
89
+ Use these visuals to explain product boundaries like:
90
+
91
+ ```text
92
+ ask-just CLI -> HTTPS JSON API -> VM SQLite -> sourced answer
93
+ ```
94
+
95
+ If the API is unavailable, the correct behavior is to fix the API path, not to
96
+ answer through SSH or direct SQLite.
97
+
98
+ ## Current State
99
+
100
+ ## Ask Just Actions
101
+
102
+ Ask Just is also the home for company actions. Actions are not separate agents,
103
+ managed-agent runtimes, bots, or sidecar operators. Ask Just is the company
104
+ brain, hands, and arms: it reads source-grade inputs, drafts an operational
105
+ decision, asks for human approval where the action is risky or external, executes
106
+ through owned tools, and writes receipts back into the source plane.
107
+
108
+ Order allocation is the first declared action candidate. Its source boundary is
109
+ `operations_order_allocation`, which is declared but not queryable until the
110
+ daily inventory, demand, routing, inbound, human-review, and NetSuite commit
111
+ evidence is mapped, parsed, receipted, and exposed through the hosted API.
112
+
113
+ The v0 command surface is deliberately inside Ask Just:
114
+
115
+ ```bash
116
+ ask-just actions order-allocation prepare --run-date 2026-05-06
117
+ ask-just actions order-allocation rehearse --run-date 2026-05-06
118
+ ask-just actions order-allocation process-approved --run-date 2026-05-06
119
+ ask-just actions order-allocation status RUN_ID
120
+ ask-just actions order-allocation receipts RUN_ID
121
+ ```
122
+
123
+ Until the source lane is fresh and atomically queryable, these commands must
124
+ fail closed with freshness and repair instructions rather than drafting from
125
+ raw mail, Evista, NetSuite, SharePoint, local files, or chat context.
126
+ `rehearse` is the safe practice surface: it uses the same source freshness gate
127
+ as a real allocation pass, but returns a no-commit practice packet with
128
+ NetSuite writes, approved-artifact processing, and external sends disabled.
129
+
130
+ Prepare-time source proof records land here:
131
+
132
+ ```text
133
+ source-material/operations_order_allocation/source-family-proofs/*.json
134
+ ```
135
+
136
+ The builder materializes them as
137
+ `operations_order_allocation_source_family_proofs` rows. The first supported
138
+ families are `inventory_vernon`, `inventory_bethlehem`,
139
+ `inventory_vertical_evista`, `netsuite_open_orders`, `routing_rules`, and
140
+ `operations_inbound_log`.
141
+
142
+ Capture helper:
143
+
144
+ ```bash
145
+ python3 scripts/capture_order_allocation_source_proofs.py mailbox-inventory --family-id inventory_vernon --freshness-date 2026-05-06
146
+ python3 scripts/capture_order_allocation_source_proofs.py mailbox-inventory --family-id inventory_bethlehem --freshness-date 2026-05-06
147
+ python3 scripts/capture_order_allocation_source_proofs.py evista-inventory --freshness-date 2026-05-06
148
+ python3 scripts/capture_order_allocation_source_proofs.py sharepoint-file --family-id routing_rules --freshness-date 2026-05-06 --drive-id DRIVE_ID --item-id ITEM_ID --source-uri "sharepoint:/sites/operations/Shared Documents/Automation/OOR Automation - Customer and Carrier tables.xlsx"
149
+ python3 scripts/capture_order_allocation_source_proofs.py sharepoint-file --family-id operations_inbound_log --freshness-date 2026-05-06 --drive-id DRIVE_ID --item-id ITEM_ID --source-uri "sharepoint:/sites/operations/Shared Documents/Inbound Log/Inbound Log 2026.xlsx"
150
+ python3 scripts/capture_order_allocation_source_proofs.py netsuite-open-orders --freshness-date 2026-05-06 --run-date 2026-05-06
151
+ python3 scripts/build_fresh_source_database.py --source-id operations_order_allocation
152
+ ```
153
+
154
+ `evista-inventory` requires `VERTICAL_USER`/`VERTICAL_PASS` or
155
+ `EVISTA_USERNAME`/`EVISTA_PASSWORD` in the Ask Just VM refresh environment.
156
+ `mailbox-inventory` inherits the previous order-allocation Microsoft Graph
157
+ shape (`GRAPH_TENANT_ID`, `GRAPH_CLIENT_ID`, `GRAPH_CLIENT_SECRET`) as well as
158
+ the Ask Just `MS_*` aliases. Vernon defaults to
159
+ `noreply@onelineage.com` plus `Inventory Stock Summary Report`; Bethlehem
160
+ defaults to `no-reply-powerbi@microsoft.com` plus
161
+ `Eat Just Fulfillment On Hand Report`. For local operator runs, pass
162
+ `--env-file /path/to/order-allocation.env` rather than copying secrets into the
163
+ repo.
164
+
165
+ Run NetSuite capture in the Ask Just runtime/VM credential context. Ask Just has
166
+ NetSuite read/write access; a laptop shell missing `NETSUITE_*` is only a local
167
+ execution-context issue.
168
+
169
+ ## Current State
170
+
171
+ Ask Just's answerable data lives behind the hosted API in the active GCP VM
172
+ SQLite source index. Exact answers must come from rows returned by `ask-just`;
173
+ repo docs, maps, receipts, local rebuild artifacts, and tests describe or
174
+ verify that index, but they are not answer data.
175
+
176
+ The active source inventory is generated, not hand-maintained:
177
+
178
+ - Declared source ids: `config/all-source-ids.json`
179
+ - Ask-surface source ids: `config/queryable-source-ids.json`
180
+ - Strict lane table: `docs/strict-source-completion-table.md`
181
+ - Current external blockers: `docs/source-required-inputs.md`
182
+ - Completion audit: `docs/source-goal-completion-audit.md`
183
+
184
+ As of the 2026-05-10 DOT Foodservice weekly sales lane addition, Ask Just declares 62 source lanes
185
+ in `config/all-source-ids.json`; 60 are intended for the Ask surface in
186
+ `config/queryable-source-ids.json`. `tofutown_qvd_last_90_days` and
187
+ `operations_order_allocation` are deliberately declared but not queryable.
188
+ `tofutown_qvd_last_90_days` waits on current QVD file access and row parsing
189
+ inside the rolling 90-day window. `operations_order_allocation` waits on source
190
+ grade daily inventory, demand, routing, inbound, human-review, and commit
191
+ evidence. The Qlik app-model snapshot lane and Dirk stock/service-level workbook
192
+ lane are scoped to last-90-day evidence. The four TofuTown / Just Europe finance
193
+ workbook lanes and TofuTown people-operations lanes remain separate source
194
+ boundaries. `operations_logistics_otif_2024v2`
195
+ covers the exact Operations / ALLOCATION workbook and its revised OT/IF/OTIF
196
+ formula cells and threaded comments; Scorecard remains canonical for plain KPI
197
+ values unless the user asks for workbook calculation mechanics.
198
+
199
+ Every source lane must carry a freshness contract: source of truth, declared
200
+ boundary, query plane, freshness mechanism/cadence, last checked/refreshed
201
+ proof, stale behavior, and whether it is current-truth or snapshot-only. SPINS
202
+ lanes are delivered reporting snapshots keyed to the workbook data ending date.
203
+ Every non-SPINS lane must refresh daily at midnight America/Los_Angeles through
204
+ the VM timer or an equivalent source-specific delta proof before current-truth
205
+ answers.
206
+
207
+ ## Deep Research Max Contract
208
+
209
+ Deep Research Max must cover every shared verified Ask Just source lane before
210
+ launch. The lane list is generated from the hosted `ask-just sources` surface
211
+ and cross-checked against `config/queryable-source-ids.json`, not from a
212
+ prompt-specific "relevant lanes" list or any manual checklist.
213
+
214
+ The launch preflight must stop before launching Gemini if any shared verified
215
+ source lane is missing from the hosted Ask Just `/sources` surface, lacks the
216
+ required `mapped`, `accessible`, and `atomically_queryable` gates, has no
217
+ freshness contract, has no hosted source-file receipt rows, or has no hosted
218
+ atomic rows. The evidence bundle must include `source_lanes_covered` with the
219
+ full generated lane list. Relevance affects row selection and ranking inside
220
+ each lane; it does not affect lane coverage.
221
+
222
+ Personal/private overlays stay excluded from Deep Research Max unless they have
223
+ been promoted into the shared verified source lane inventory. A user's personal
224
+ mailbox overlay, for example, is not part of the team-visible source plane and
225
+ must not be pulled into the bundle.
226
+
227
+ Dry bundle-only proof:
228
+
229
+ ```bash
230
+ python3 scripts/deep_research_just.py --bundle-only --row-limit 0
231
+ ```
232
+
233
+ | Source id | Layer | Query plane | Freshness contract | Ask surface |
234
+ | --- | --- | --- | --- | --- |
235
+ | `rd_powerjacks_formulations` | r_and_d | `sharepoint_workbook_snapshot` | `daily_midnight_snapshot_check` | yes |
236
+ | `rd_formulations_vault_production_formulas` | r_and_d_production_formulas | `sharepoint_document_library` | `daily_midnight_sharepoint_graph_recursive_refresh` | yes |
237
+ | `spins_plant_based_meat_powertabs` | sales_and_retail_velocity | `local_xlsb_workbook_snapshot` | `scheduled_snapshot` | yes |
238
+ | `spins_breakfast_powertabs` | sales_and_retail_velocity | `local_xlsb_workbook_snapshot` | `scheduled_snapshot` | yes |
239
+ | `spins_condiments_powertabs` | sales_and_retail_velocity | `local_xlsb_workbook_snapshot` | `scheduled_snapshot` | yes |
240
+ | `spins_protein_powder_powertabs` | sales_and_retail_velocity | `local_xlsb_workbook_snapshot` | `scheduled_snapshot` | yes |
241
+ | `operations_production_plan_latest` | operations_planning | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
242
+ | `ejp_protein_release_tracker` | quality_and_batch_release | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
243
+ | `operations_inbound_log` | operations_logistics | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
244
+ | `quality_vault_finalized_sops` | quality_and_batch_release | `sharepoint_document_library` | `daily_midnight_sharepoint_graph_recursive_refresh` | yes |
245
+ | `rd_processdev_egb_sops` | r_and_d_quality_sops | `sharepoint_document_library` | `daily_midnight_sharepoint_graph_recursive_refresh` | yes |
246
+ | `rd_processdev_project_onestream` | r_and_d_processdev_projects | `sharepoint_document_library` | `daily_midnight_sharepoint_graph_recursive_refresh` | yes |
247
+ | `operations_order_allocation` | operations_order_allocation | `declared_multi_system_order_allocation_boundary` | `daily_midnight_mailbox_evista_netsuite_sharepoint_refresh` | declared gap; not queryable |
248
+ | `operations_logistics_otif_2024v2` | operations_logistics | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
249
+ | `tofu_town_production_planning` | tofu_town_operations | `local_xlsx_workbook_set_snapshot` | `daily_midnight_delivered_snapshot_check` | yes |
250
+ | `tofutown_qlik_cloud_app_models` | tofutown_operations_data_lineage | `qlik_cloud_app_query_export_snapshot` | `weekly_saturday_midnight_current_qlik_api_snapshot_last_90_days_only` | yes |
251
+ | `tofutown_qvd_last_90_days` | tofutown_operations_qvd_facts | `qlik_qvd_file_contents` | `weekly_saturday_midnight_current_qvd_file_pull_last_90_days_only` | declared gap; not queryable |
252
+ | `tofutown_dirk_stock_level_workbook` | tofutown_operations_stock_service_level | `sharepoint_xlsx_workbook_snapshot_last_90_days` | `weekly_saturday_midnight_sharepoint_workbook_snapshot_last_90_days_only` | yes |
253
+ | `weekly_tofutown_just_europe_sales` | weekly_tofutown_just_europe_sales | `local_xlsb_workbook_snapshot` | `weekly_delivered_navision_sales_export_snapshot` | declared only; source-surface gap |
254
+ | `tofutown_standard_cost_gross_margin_by_sku_2026_05` | tofutown_just_europe_finance | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_delivered_snapshot_check_until_tofutown_graph_refresh` | yes |
255
+ | `tofutown_bom_tt_skus` | tofutown_just_europe_finance | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_delivered_snapshot_check_until_tofutown_graph_refresh` | yes |
256
+ | `tofutown_financial_tracking_week_18` | tofutown_just_europe_finance | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_delivered_snapshot_check_until_tofutown_graph_refresh` | yes |
257
+ | `tofutown_preliminary_pl_march_2026` | tofutown_just_europe_finance | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_delivered_snapshot_check_until_tofutown_graph_refresh` | yes |
258
+ | `just_us_canada_p_and_l_boms` | just_us_canada_finance_bom | `sharepoint_document_library` | `daily_midnight_sharepoint_graph_recursive_refresh` | yes |
259
+ | `qualification_fold_sensory` | r_and_d_quality_sensory | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
260
+ | `qualification_meat_sensory` | r_and_d_quality_sensory | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
261
+ | `qualification_v5_sensory_analytics` | r_and_d_quality_sensory | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
262
+ | `rd_in_market_testing` | r_and_d_quality_sensory | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
263
+ | `rd_liquid_egg_v6` | r_and_d_formulation | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
264
+ | `reefer_meat_shelf_life_tests` | r_and_d_quality_shelf_life | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
265
+ | `target_tracker` | sales_planning_and_retail_performance | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
266
+ | `finance_cash_flow_forecast_2026` | finance_accounts_payable_cash_flow | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
267
+ | `operations_dashboard_2025` | operations_dashboard | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
268
+ | `appleton_jpc_factory_dashboard` | appleton_factory_operations | `external_http_jpc_factory_api_snapshot` | `daily_midnight_http_api_snapshot` | yes |
269
+ | `whole_foods_canada_just_egg_rl_upsw` | sales_and_retail_velocity | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
270
+ | `whole_foods_us_who_cube_2026_04_19` | sales_and_retail_velocity | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_graph_delta_snapshot` | yes |
271
+ | `dot_foodservice_weekly_sales` | foodservice_sales | `local_xlsx_workbook_snapshot` | `weekly_delivered_dot_foodservice_sales_report_snapshot` | yes |
272
+ | `satellite_cpg_eat_just_brochure` | brand_sales_materials | `external_web_app_brochure_snapshot` | `daily_midnight_http_api_snapshot` | yes |
273
+ | `just_phase_3b_proposal` | strategic_project_proposals | `local_pdf_document_snapshot` | `delivered_pdf_snapshot` | yes |
274
+ | `block_from_hierarchy_to_intelligence` | operating_model_reference | `external_web_html_snapshot` | `daily_midnight_http_delta` | yes |
275
+ | `just_public_website_homepage` | public_website_and_brand | `external_web_html_snapshot` | `daily_midnight_http_delta` | yes |
276
+ | `asana_work_management` | work_management | `external_asana_workspace_project_snapshot` | `daily_midnight_api_delta` | yes |
277
+ | `replace_enter_repo_github` | formulation_nutrition_and_labels | `github_repo_snapshot_with_live_app_api_and_local_feed_artifacts` | `daily_midnight_git_delta` | yes |
278
+ | `brand_logo_eat_just_svg` | brand_assets | `local_brand_asset_snapshot` | `daily_midnight_delta_or_equivalent_origin_pending` | yes |
279
+ | `brand_font_neue_haas_grotesk_display_round_zip` | brand_assets | `local_brand_asset_zip_snapshot` | `daily_midnight_delta_or_equivalent_origin_pending` | yes |
280
+ | `hr_just_food_company_headcount` | people_operations | `local_xlsx_workbook_snapshot` | `daily_midnight_delivered_snapshot_check` | yes |
281
+ | `tofutown_employee_list_2026` | people_operations | `sharepoint_xlsx_workbook_snapshot` | `daily_midnight_sharepoint_workbook_snapshot` | yes |
282
+ | `wecare_mailbox_last_30_days` | customer_experience | `live_microsoft_graph_mailbox` | `daily_midnight_graph_delta_equivalent_rolling_30_days` | yes |
283
+ | `just_meat_production_library` | just_meat_production | `sharepoint_document_library` | `daily_midnight_graph_delta_after_recursive_enumeration` | yes |
284
+ | `rd_process_sciences_lab_research` | r_and_d_process_sciences | `sharepoint_document_library` | `daily_midnight_graph_delta_after_recursive_enumeration` | yes |
285
+ | `rd_process_sciences_yield_improvement` | r_and_d_process_sciences | `sharepoint_document_library` | `daily_midnight_graph_delta_after_recursive_enumeration` | yes |
286
+ | `scorecard_monthly_data` | company_kpis | `live_scorecard_api` | `daily_midnight_current_truth_snapshot` | yes |
287
+ | `scorecard_ops_metrics` | operations_kpis | `live_scorecard_api` | `daily_midnight_current_truth_snapshot` | yes |
288
+ | `batch_release_app` | quality_and_batch_release | `live_batch_release_app_state` | `daily_midnight_current_truth_snapshot` | yes |
289
+ | `netsuite_account_catalog` | finance_and_operations | `live_netsuite_account_catalog_audit` | `daily_midnight_current_truth_audit_snapshot` | yes |
290
+ | `netsuite_items` | finance_and_operations | `live_netsuite_suiteql` | `daily_midnight_current_truth_snapshot` | yes |
291
+ | `netsuite_pnl_monthly` | finance_and_operations | `live_netsuite_suiteql` | `daily_midnight_current_truth_snapshot` | yes |
292
+ | `netsuite_ar_open_invoices` | finance_and_operations | `live_netsuite_suiteql` | `daily_midnight_current_truth_snapshot` | yes |
293
+ | `netsuite_ap_open_bills` | finance_and_operations | `live_netsuite_suiteql` | `daily_midnight_current_truth_snapshot` | yes |
294
+ | `netsuite_inventory_snapshot` | finance_and_operations | `live_netsuite_suiteql` | `daily_midnight_current_truth_snapshot` | yes |
295
+ | `netsuite_revenue_by_sku_ytd` | finance_and_sales | `live_netsuite_suiteql` | `daily_midnight_current_truth_snapshot` | yes |
296
+ | `netsuite_revenue_by_customer_sku_channel_ytd` | finance_and_sales | `live_netsuite_suiteql` | `daily_midnight_current_truth_snapshot` | yes |
297
+
298
+ The Quality/R&D SharePoint document-library lanes are fully source for their
299
+ declared folder boundaries. As of the 2026-05-09 hosted Graph refresh, Quality
300
+ Vault finalized SOPs has 9 folders, 65 files, and 886 atomic rows; R&D
301
+ ProcessDev EGB SOPs has 1 folder, 11 files, and 72 atomic rows. As of the
302
+ 2026-05-10 hosted Graph refresh, R&D ProcessDev Project OneStream has 67
303
+ folders, 92 files, and 13,936 atomic rows.
304
+
305
+ The JUST Phase 3b proposal lane is fully source for the delivered PDF snapshot
306
+ as of the 2026-05-09 hosted parse: 1 source file, 7 PDF text chunks, and 8
307
+ atomic rows. It is proposal evidence only, not approval or current operational
308
+ truth by itself.
309
+
310
+ The R&D Formulations Vault production-formula lane is canonical for
311
+ production-related formula questions inside the Formulations-Vault SharePoint
312
+ library. As of the 2026-05-10 hosted Graph refresh, it has 109 folders, 166
313
+ files, and 12,331 atomic rows.
314
+
315
+ Current Braintrust receipt:
316
+
317
+ - Project: `Andes / ask-just`
318
+ - Project id: `2a580ddb-dbad-4acd-a8b7-eacc2ab91123`
319
+ - Query responses include `trace_id`, `trace_span_id`, `trace_project`, `trace_project_id`, and `trace_url` when `BRAINTRUST_API_KEY` is configured and callers request trace metadata.
320
+ - Query traces include spans for `trace.user_question`, `trace.tool_call.1.ask_just_source_query`, `trace.selected_evidence`, `trace.source_receipts`, and `trace.final_answer`.
321
+
322
+ The active SQLite default is
323
+ `artifacts/ask-just-fresh-source-plane/source_index.sqlite`.
324
+
325
+ ## How To Ask
326
+
327
+ In Codex, use the repo-owned skill:
328
+
329
+ ```text
330
+ what was February revenue? [$askjust](/Users/josh/.codex/skills/askjust/SKILL.md)
331
+ ```
332
+
333
+ The user should not need to know which source, database, table, source id, or
334
+ CLI flag contains the answer. `$askjust` means: ask Just's verified source
335
+ plane, choose the right source lane, answer with evidence, and say clearly when
336
+ the local memory does not yet contain enough evidence.
337
+
338
+ For direct shell use, the `ask-just` CLI calls the hosted Ask Just service.
339
+
340
+ Install or refresh the CLI from the hosted Ask Just service:
341
+
342
+ ```bash
343
+ bash -c 'curl -fsSL https://ask-just.35.222.146.245.sslip.io/install.sh | bash'
344
+ ```
345
+
346
+ If an admin needs to create a one-time setup code for a teammate:
347
+
348
+ ```bash
349
+ ask-just onboarding-code create --label "Pri setup" --ttl-hours 24
350
+ ```
351
+
352
+ For the employee parity experience, reset the previous Ask Just install, run
353
+ quietly, exchange the one-time setup code for the real token, and let the
354
+ installer run `ask-just doctor`:
355
+
356
+ ```bash
357
+ ASK_JUST_SETUP_CODE='<paste-setup-code-here>' ASK_JUST_RESET=1 ASK_JUST_QUIET=1 bash -c 'curl -fsSL https://ask-just.35.222.146.245.sslip.io/install.sh | bash'
358
+ ```
359
+
360
+ The hosted installer downloads the CLI to `~/.local/bin/ask-just`, refreshes
361
+ the Ask Just Codex skills under `~/.codex/skills/` (`askjust`, `just-source`,
362
+ `correction`, and `braintrust`), configures the token from
363
+ `ASK_JUST_SETUP_CODE` or `ASK_JUST_TOKEN`, enables those skills in the global
364
+ Codex skill config so new threads in any project can see them, runs
365
+ `ask-just doctor`, and writes a managed global `~/.codex/AGENTS.md` rule so
366
+ plain Just questions route through Ask Just instead of web search unless the
367
+ user explicitly asks for web/public lookup. It keeps GitHub out of the normal
368
+ employee setup path.
369
+ `ASK_JUST_RESET=1` removes only the previous Ask Just CLI, local Ask Just
370
+ config, and these four Ask Just skills before reinstalling. If the hosted
371
+ installer is temporarily unavailable, the
372
+ installer can still fall back to an authenticated GitHub CLI or
373
+ `GITHUB_TOKEN`/`GH_TOKEN` with read access to `manintheandes/ask-just`.
374
+
375
+ On success, the installer prints the welcome message and stops:
376
+
377
+ ```text
378
+ Ask Just is how you have a conversation with the company.
379
+ ```
380
+
381
+ For manual employee setup parity checks, run the local doctor after install:
382
+
383
+ ```bash
384
+ export PATH="$HOME/.local/bin:$PATH"
385
+ ask-just doctor
386
+ ```
387
+
388
+ The doctor checks the installed `ask-just` binary, PATH, local config, hosted
389
+ readiness, hosted source inventory, and Codex skills (`askjust`, `just-source`,
390
+ `correction`, and `braintrust`) without printing the bearer token. It returns
391
+ `ok: true`, `status: ready`, and an empty `required_gaps` list only when the
392
+ standard Ask Just setup is ready.
393
+
394
+ Do not use NetSuite, SQL, revenue, transactions, items, or any other business
395
+ source as part of employee setup verification.
396
+
397
+ Then ask source-backed questions:
398
+
399
+ ```bash
400
+ export PATH="$HOME/.local/bin:$PATH"
401
+ ask-just doctor
402
+ ask-just health --deep
403
+ ask-just summary
404
+ ask-just sources
405
+ ask-just --include-trace query "Mar gross revenue" --source scorecard_monthly_data --kind atomic --limit 3
406
+ ask-just query "WALMART CORP RMA IMPOSSIBLE dollars" --source spins_plant_based_meat_powertabs --kind atomic --limit 6
407
+ ask-just query "Protein on Hold mar" --source scorecard_ops_metrics --kind atomic --limit 3
408
+ ask-just query "held batches" --source batch_release_app --kind atomic --limit 6
409
+ ask-just personal-mail-status
410
+ ask-just personal-mail-search "Publix" --days 30 --limit 10
411
+ ask-just query "customrecord outlook sync part tracker" --source netsuite_account_catalog --kind atomic --limit 5
412
+ ask-just query "Mung Bean" --source netsuite_items --kind atomic --limit 8
413
+ ask-just query "March 2026 net revenue" --source netsuite_pnl_monthly --kind atomic --limit 5
414
+ ask-just query "open AR invoices" --source netsuite_ar_open_invoices --kind atomic --limit 5
415
+ ask-just query "open AP bills" --source netsuite_ap_open_bills --kind atomic --limit 5
416
+ ask-just query "inventory on hand" --source netsuite_inventory_snapshot --kind atomic --limit 5
417
+ ask-just sql "select received_date, primary_intent, subject from wecare_customer_issue_summaries where is_refund_request = 1 order by received_date_time desc limit 5"
418
+ ask-just sql "select count(*) as n from atomic_rows"
419
+ ```
420
+
421
+ For normal teammate use, `ask-just query` is the question surface. `ask-just
422
+ search` is a raw keyword diagnostic for source debugging, not something a
423
+ teammate should have to choose when asking a business question.
424
+
425
+ Fresh source lanes:
426
+
427
+ ```bash
428
+ python3 scripts/build_strict_source_completion_table.py
429
+ python3 scripts/build_source_required_inputs.py
430
+ python3 scripts/check_vm_source_refresh_status.py
431
+ python3 scripts/verify_source_goal_complete.py
432
+ ask-just health --deep
433
+ ask-just query "Mar gross revenue" --source scorecard_monthly_data --kind atomic --limit 3
434
+ ask-just query "PUBLIX CORP RMA JUST Egg Plant Based Scramble 16 Oz 4.2" --source spins_breakfast_powertabs --kind atomic --limit 1
435
+ ```
436
+
437
+ The WECARE mailbox lane refreshes daily from Microsoft Graph over the rolling
438
+ last 30 days for `wecare@ju.st` across inbox, archive, sent items, deleted
439
+ items, and junk. It writes message rows, attachment metadata, mailbox metrics,
440
+ and typed `wecare_customer_issue_summaries` rows for refund, spoilage, shipping,
441
+ contact-form, product complaint, product-term, retailer, and sender-domain
442
+ queries.
443
+
444
+ The CLI returns JSON so Codex, Claude Code, shell scripts, and future dashboards
445
+ can consume the same source evidence reliably.
446
+
447
+ ## How Corrections Improve Ask Just
448
+
449
+ When Ask Just gives a weak answer, the fix should become part of the system, not
450
+ just part of one chat. There are three places to make that correction.
451
+
452
+ ### 1. Fix the agent instructions
453
+
454
+ Update the `$askjust` skill when Codex or Claude misunderstood the question or
455
+ chose the wrong source.
456
+
457
+ Example: if someone asks for current KPIs, the skill should route to Scorecard
458
+ current truth through hosted Ask Just or say the hosted source index only has
459
+ routing/proof records, instead of treating narrative context as exact current
460
+ metrics.
461
+
462
+ ### 2. Fix the shared rulebook
463
+
464
+ Update the README or spec when the rule should be visible to everyone working on
465
+ Ask Just.
466
+
467
+ Example: velocity should use SPINS last 4 weeks by default, with HEB and Whole
468
+ Foods as explicit retailer-specific exceptions. The spec should name the exact
469
+ boundary and require it to be rebuilt into SQLite so future agents do not fall
470
+ back to the retailer review calendar/reset tracker, stale Scorecard, or generic
471
+ context. The `target_tracker` source id is a workbook for retailer review
472
+ calendars and resets; it is not Target customer evidence.
473
+
474
+ For SPINS velocity, the first answer path is the structured visible PowerTabs
475
+ `Item` / Item Ranking report table, `spins_item_ranking_rows`. Decoded
476
+ `pivot_cache_records` are supporting or fallback evidence; a pivot-cache miss is
477
+ not a source miss when the visible report row exists.
478
+
479
+ When reproducing a PowerTabs report manually, the stable path is: open the
480
+ right workbook, go to `Item`, use `Geo` as the retailer/geography selector,
481
+ choose the time period, then choose the category and subcategory that match the
482
+ SKU family. For breakfast, JUST Egg liquid is `REFRIGERATED EGGS` /
483
+ `RF EGGS LIQUID`; JUST Egg Folded and burritos are in
484
+ `FROZEN BREAKFAST FOODS` with the matching frozen breakfast subcategory. An
485
+ incompatible category/subcategory slicer state can hide valid rows and must be
486
+ cleared or corrected before treating the result as a source gap.
487
+
488
+ The durable SPINS target is a standard all-period Item Ranking slice layer, not
489
+ an ad hoc currently-open Excel view. For each relevant SPINS workbook,
490
+ materialize `4 Weeks`, `12 Weeks`, `24 Weeks`, and `52 Weeks` Item Ranking rows
491
+ for `MULO`, `NATURAL`, and every retailer/geography listed in SPINS. Preserve
492
+ every visible SKU row, including competitors, across the frozen breakfast,
493
+ refrigerated eggs, meat, protein powder, and condiment workbooks. Unit velocity
494
+ is `Average Weekly Units Per Store Selling Per Item`; dollar velocity or
495
+ dollars per door per week is `Average Weekly Dollars Per Store Selling Per
496
+ Item`. If the user does not specify a period, answer velocity from `4 Weeks` by
497
+ default.
498
+
499
+ If Excel is showing a recovered or newly filtered PowerTabs state, capture that
500
+ visible report before rebuilding:
501
+
502
+ ```bash
503
+ python3 scripts/capture_spins_visible_item_ranking.py --source-id spins_breakfast_powertabs
504
+ python3 scripts/build_fresh_source_database.py --source-id spins_breakfast_powertabs
505
+ ```
506
+
507
+ The capture writes `*.visible-item-ranking.json` under
508
+ `source-material/<source-id>/visible-item-ranking-snapshots/`, and the builder
509
+ ingests every captured view into `spins_item_ranking_rows` with Excel-visible
510
+ report provenance.
511
+
512
+ ### 3. Fix the tool
513
+
514
+ Add or improve a CLI/API command when the same question will come up again and
515
+ should not depend on a fresh ad hoc SQL query each time.
516
+
517
+ Example: if revenue or velocity questions become common, add named commands that
518
+ always use the right source id, table, filters, and provenance rules.
519
+
520
+ For most Just teammates, the workflow stays simple: ask through Codex, Claude,
521
+ or another agent and inspect the evidence. Power users can also use the local
522
+ CLI directly. Everyone benefits when recurring corrections are captured in
523
+ these shared layers.
524
+
525
+ ## Hosted Service
526
+
527
+ Ask Just now has a small shared VM host, and the same service can still run locally for development.
528
+
529
+ | Piece | Value |
530
+ | --- | --- |
531
+ | GCP project | `ask-just-prod` |
532
+ | VM | `ask-just-server` in `us-central1-a` |
533
+ | VM repo | `/home/josh/ask-just` |
534
+ | Local repo | `/Users/josh/projects/ask-just` |
535
+ | Private VM service | `http://127.0.0.1:8792` |
536
+ | Public HTTPS endpoint | `https://ask-just.35.222.146.245.sslip.io` |
537
+ | SQLite index | `artifacts/ask-just-fresh-source-plane/source_index.sqlite` |
538
+ | Builder | `scripts/build_fresh_source_database.py` |
539
+ | CLI client | `ask-just` / `scripts/ask_just.py` |
540
+ | Service unit | `deploy/systemd/ask-just.service` |
541
+ | Daily refresh units | `deploy/systemd/ask-just-source-refresh.service` / `deploy/systemd/ask-just-source-refresh.timer` |
542
+
543
+ The Python service is read-only and bound to localhost on the VM. Public traffic
544
+ enters through HTTPS and bearer-token auth, then nginx proxies to the private
545
+ localhost service.
546
+
547
+ The SQLite index lives at:
548
+
549
+ ```text
550
+ /home/josh/ask-just/artifacts/ask-just-fresh-source-plane/source_index.sqlite
551
+ ```
552
+
553
+ That database is the answer-data artifact. It is generated runtime state, so the
554
+ durable repo assets are the maps, parser code, receipts, and tests that rebuild
555
+ and verify it. Promote staged rebuilds to the VM only after health, count, gap,
556
+ hash, and query checks pass.
557
+
558
+ Build the SQLite index:
559
+
560
+ ```bash
561
+ python3 scripts/build_fresh_source_database.py
562
+ ```
563
+
564
+ Run the local HTTP server:
565
+
566
+ ```bash
567
+ python3 scripts/serve_http.py --host 127.0.0.1 --port 8792
568
+ ```
569
+
570
+ Install or refresh the VM service:
571
+
572
+ ```bash
573
+ sudo install -m 0644 deploy/systemd/ask-just.service /etc/systemd/system/ask-just.service
574
+ sudo systemctl daemon-reload
575
+ sudo systemctl enable --now ask-just.service
576
+ ```
577
+
578
+ Install or refresh the VM daily source-refresh automation:
579
+
580
+ ```bash
581
+ sudo install -d -m 0750 /etc/ask-just
582
+ sudo install -m 0600 deploy/systemd/source-refresh.env.example /etc/ask-just/source-refresh.env
583
+ sudoedit /etc/ask-just/source-refresh.env
584
+ sudo install -m 0644 deploy/systemd/ask-just-source-refresh.service /etc/systemd/system/ask-just-source-refresh.service
585
+ sudo install -m 0644 deploy/systemd/ask-just-source-refresh.timer /etc/systemd/system/ask-just-source-refresh.timer
586
+ sudo systemctl daemon-reload
587
+ sudo systemctl start ask-just-source-refresh.service
588
+ sudo systemctl enable --now ask-just-source-refresh.timer
589
+ systemctl list-timers ask-just-source-refresh.timer
590
+ ```
591
+
592
+ The timer runs daily at midnight America/Los_Angeles on the VM. Non-SPINS lanes use Graph
593
+ delta, source API cursors, HTTP validators, modified time, or hash-delta as
594
+ appropriate. The WECARE mailbox lane refreshes daily from Microsoft Graph over
595
+ the rolling last 30 days for `wecare@ju.st` across inbound customer-signal
596
+ folders. It intentionally does not source sent replies, junk, WECARE-authored
597
+ mail, admin notifications, vendor pitches, conference/hotel spam, or other
598
+ non-customer mailbox noise. Its typed table `wecare_customer_issue_summaries`
599
+ tags refund, spoilage, shipping, contact-form, product complaint, product-term,
600
+ retailer, and sender-domain fields for customer-signal CX questions. Asana is a key
601
+ work-management source lane: it requires token-backed active and archived
602
+ project enumeration for catalog facts, plus rolling 30-day task activity for
603
+ selected source teams and explicit source projects. Rolling modified-task rows
604
+ are current work-item evidence, while project catalog rows remain the source for
605
+ old named project existence/owner/team/link questions. SPINS lanes remain delivered
606
+ workbook snapshots until a new workbook delivery is persisted under
607
+ `source-material/`.
608
+
609
+ `/etc/ask-just/source-refresh.env` must contain one supported Microsoft Graph
610
+ credential shape for Graph-backed lanes: `MS_TENANT_ID`,
611
+ `MS_GRAPH_CLIENT_ID`, and `MS_GRAPH_CLIENT_SECRET`; the previous
612
+ order-allocation `GRAPH_TENANT_ID`, `GRAPH_CLIENT_ID`, and
613
+ `GRAPH_CLIENT_SECRET` shape; or delegated `GRAPH_TENANT_ID`,
614
+ `GRAPH_CLIENT_ID`, and `GRAPH_REFRESH_TOKEN`. Do not mark the source goal
615
+ complete unless `python3 scripts/verify_source_goal_complete.py` is green after
616
+ the VM refresh service succeeds.
617
+
618
+ ## Personal Source Overlay
619
+
620
+ Ask Just can let one bearer token unlock both the shared company source plane
621
+ and that user's private Microsoft Graph mailbox. This is intentionally not a
622
+ shared source lane: personal mailbox rows are queried live through delegated
623
+ Graph access and are not written into the shared SQLite index.
624
+
625
+ The server reads an optional registry from `ASK_JUST_PERSONAL_SOURCES`, usually
626
+ `/etc/ask-just/personal-sources.json`. Each registry entry maps a SHA-256 hash
627
+ of a user's Ask Just bearer token to that user's mailbox and env-var names for
628
+ delegated Graph credentials. Use
629
+ `deploy/systemd/personal-sources.example.json` and
630
+ `deploy/systemd/http.env.example` as the install templates.
631
+
632
+ To compute the registry hash for the current configured Ask Just token:
633
+
634
+ ```bash
635
+ ask-just token-hash
636
+ ```
637
+
638
+ Personal mailbox commands:
639
+
640
+ ```bash
641
+ ask-just personal-mail-status
642
+ ask-just personal-mail-search "Lisa Publix" --days 30 --limit 10
643
+ ask-just personal-mail-read "<message-id>"
644
+ ask-just personal-mail-draft --to "person@example.com" --subject "Subject" --body "Draft body"
645
+ ask-just personal-mail-reply-draft "<message-id>" --body "Reply draft body"
646
+ ask-just personal-mail-send-draft "<draft-message-id>"
647
+ ```
648
+
649
+ Privacy rule: company sources are shared; personal sources inherit the ACL of
650
+ the token owner and are visible only to that mapped bearer token. Actual
651
+ delivery is intentionally a separate `personal-mail-send-draft` command; normal
652
+ write operations create drafts.
653
+
654
+ Health check:
655
+
656
+ ```bash
657
+ ask-just health --deep
658
+ ```
659
+
660
+ Source-specific hosted proof:
661
+
662
+ ```bash
663
+ ask-just query "Protein on Hold mar" --source scorecard_ops_metrics --kind atomic --limit 3
664
+ ask-just query "held batches" --source batch_release_app --kind atomic --limit 6
665
+ ask-just query "customrecord outlook sync part tracker" --source netsuite_account_catalog --kind atomic --limit 5
666
+ ask-just query "Mung Bean" --source netsuite_items --kind atomic --limit 8
667
+ ```
668
+
669
+ The VM service and laptop tunnel were verified on 2026-05-02 for
670
+ `scorecard_ops_metrics`: `Protein on Hold mar` returns field-level provenance
671
+ for `Upstream Inventory:Protein on Hold (MT):mar` with value `46`.
672
+ The local Batch Release ask surface was verified on 2026-05-03:
673
+ `held batches` returns field-level provenance for Batch Release records, with
674
+ 6 held status rows in the current app-state read-data snapshot.
675
+ The NetSuite account catalog audit lane was verified on 2026-05-04:
676
+ `vendorBill suiteql row count` returns `netsuite_record_type_catalog`, and
677
+ `customrecord outlook sync part tracker` returns
678
+ `netsuite_metadata_catalog_root_items` from the root metadata catalog.
679
+ The VM NetSuite item source was verified on 2026-05-02: the VM rebuilt from
680
+ live SuiteQL using its private `NETSUITE_*` environment file, and `Mung Bean`
681
+ returns field-level provenance from `netsuite:/suiteql/item`.
682
+
683
+ See [docs/local-http-service.md](docs/local-http-service.md) and
684
+ [docs/remote-cli.md](docs/remote-cli.md).
685
+
686
+ ## Codex Skills
687
+
688
+ This repo owns the Codex skills that make the experience feel like asking the
689
+ company rather than running a database query:
690
+
691
+ ```text
692
+ skills/askjust/SKILL.md
693
+ skills/braintrust/SKILL.md
694
+ skills/correction/SKILL.md
695
+ skills/just-source/SKILL.md
696
+ ```
697
+
698
+ `just-source` defines when a Just artifact becomes source-grade. `$askjust` is
699
+ the conversational front door over source-grade Just memory. `correction`
700
+ defines what to do when an Ask Just answer needs a durable routing or answer
701
+ fix. `braintrust` defines the Ask Just trace inspection and verification
702
+ workflow.
703
+
704
+ ## Source Links
705
+
706
+ Ask Just answers still come from the hosted API backed by the verified GCP VM
707
+ SQLite source index. Source links are an inspection layer over that evidence:
708
+ rows with `provenance_grain` are enriched with `source_links`, and the same
709
+ resolver is available directly:
710
+
711
+ ```bash
712
+ ask-just source-links --source-id spins_plant_based_meat_powertabs \
713
+ --locator "/Users/josh/Downloads/SPINS PowerTabs Eat Just Plant Based Meat Data Ending 04-19-26 (1).xlsb#sheet=Retailer&row=16"
714
+ ```
715
+
716
+ The resolver uses hosted source-index tables such as `atomic_rows`,
717
+ `source_files`, and source provenance to return the upstream artifact handle:
718
+ local workbook paths, HTTP/API URLs, or structured locators such as
719
+ `netsuite:/suiteql/...`. Links are for source inspection and trust; they do not
720
+ replace the hosted API as the normal answer path.
721
+
722
+ Verify link coverage for the currently built SQLite plane with:
723
+
724
+ ```bash
725
+ python3 scripts/audit_source_links.py
726
+ ```
727
+
728
+ ## Braintrust Tracing
729
+
730
+ Ask Just query requests emit Braintrust traces when the runtime has the Python
731
+ dependency and an API key:
732
+
733
+ ```bash
734
+ python3 -m venv .venv
735
+ . .venv/bin/activate
736
+ python3 -m pip install -r requirements.txt
737
+ export BRAINTRUST_API_KEY=...
738
+ export ASK_JUST_BRAINTRUST_PROJECT=ask-just
739
+ export ASK_JUST_BRAINTRUST_PROJECT_ID=2a580ddb-dbad-4acd-a8b7-eacc2ab91123
740
+ ```
741
+
742
+ Tracing fails open: if the SDK or API key is missing, source queries still run
743
+ and simply omit trace fields. The CLI does not trace ordinary calls, so source
744
+ answers stay fast and provenance is not mixed with observability metadata. Use
745
+ `--include-trace` or `--open-trace` when debugging a run. The local Braintrust
746
+ context is stored in `.bt/config.json`.
747
+
748
+ Runtime tracing is non-blocking by default so CLI answers are not delayed by
749
+ Braintrust network flushes. For a debugging session that must wait until trace
750
+ events are uploaded, set `ASK_JUST_BRAINTRUST_SYNC_FLUSH=1`. To force tracing
751
+ for every hosted request, set `ASK_JUST_BRAINTRUST_TRACE_ALL=1`.
752
+
753
+ ## Source Plane
754
+
755
+ - Source plane id: `ask_just_fresh_source_plane`
756
+ - Active source map: [config/fresh-source-map.yaml](config/fresh-source-map.yaml)
757
+ - Parser: `scripts/build_fresh_source_database.py`
758
+ - Query helper: `ask-just`
759
+ - Local rebuild index: `artifacts/ask-just-fresh-source-plane/source_index.sqlite`
760
+ - VM index: `/home/josh/ask-just/artifacts/ask-just-fresh-source-plane/source_index.sqlite`
761
+ - Receipts: `receipts/fresh/`
762
+
763
+ ## Repo Layout
764
+
765
+ ```text
766
+ config/fresh-source-map.yaml Active fresh Ask Just source-lane map
767
+ config/source-map.yaml Active wrapper map for the fresh source plane
768
+ config/queryable-source-ids.json Canonical queryable source ids
769
+ receipts/fresh/ Machine-readable receipts for active lanes
770
+ docs/source-receipts/ Human-readable receipt summaries
771
+ artifacts/ask-just-fresh-source-plane/ Generated local rebuild artifacts
772
+ scripts/build_fresh_source_database.py Fresh source-index builder
773
+ scripts/serve_http.py Read-only local HTTP API
774
+ scripts/ask_just.py CLI client
775
+ install.sh One-line installer for ~/.local/bin/ask-just
776
+ skills/askjust/SKILL.md Codex routing skill
777
+ ```