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.
- ask_just-0.1.0/PKG-INFO +777 -0
- ask_just-0.1.0/README.md +770 -0
- ask_just-0.1.0/ask_just.egg-info/PKG-INFO +777 -0
- ask_just-0.1.0/ask_just.egg-info/SOURCES.txt +59 -0
- ask_just-0.1.0/ask_just.egg-info/dependency_links.txt +1 -0
- ask_just-0.1.0/ask_just.egg-info/entry_points.txt +2 -0
- ask_just-0.1.0/ask_just.egg-info/top_level.txt +1 -0
- ask_just-0.1.0/ask_just_cli/__init__.py +1 -0
- ask_just-0.1.0/ask_just_cli/agent_setup.py +109 -0
- ask_just-0.1.0/ask_just_cli/cli.py +1286 -0
- ask_just-0.1.0/ask_just_cli/skills/askjust/SKILL.md +506 -0
- ask_just-0.1.0/ask_just_cli/skills/braintrust/SKILL.md +61 -0
- ask_just-0.1.0/ask_just_cli/skills/correction/SKILL.md +77 -0
- ask_just-0.1.0/ask_just_cli/skills/just-source/SKILL.md +394 -0
- ask_just-0.1.0/pyproject.toml +20 -0
- ask_just-0.1.0/setup.cfg +4 -0
- ask_just-0.1.0/tests/test_asana_cached_snapshot.py +66 -0
- ask_just-0.1.0/tests/test_ask_just_cli.py +38 -0
- ask_just-0.1.0/tests/test_ask_just_doctor.py +222 -0
- ask_just-0.1.0/tests/test_ask_just_onboarding_code.py +84 -0
- ask_just-0.1.0/tests/test_askjust_golden_quality_runner.py +109 -0
- ask_just-0.1.0/tests/test_backfill_spins_item_rankings.py +133 -0
- ask_just-0.1.0/tests/test_braintrust_tracing.py +124 -0
- ask_just-0.1.0/tests/test_build_source_required_inputs.py +119 -0
- ask_just-0.1.0/tests/test_capture_order_allocation_source_proofs.py +363 -0
- ask_just-0.1.0/tests/test_check_vm_source_refresh_status.py +122 -0
- ask_just-0.1.0/tests/test_compare_order_allocation_historical_day.py +54 -0
- ask_just-0.1.0/tests/test_cross_source_pressure.py +88 -0
- ask_just-0.1.0/tests/test_deep_research_just.py +116 -0
- ask_just-0.1.0/tests/test_direct_bypass_routing.py +208 -0
- ask_just-0.1.0/tests/test_dot_foodservice_source.py +56 -0
- ask_just-0.1.0/tests/test_finance_cash_flow_metrics.py +126 -0
- ask_just-0.1.0/tests/test_formulations_vault_source.py +59 -0
- ask_just-0.1.0/tests/test_fresh_source_plane.py +907 -0
- ask_just-0.1.0/tests/test_install_script.py +401 -0
- ask_just-0.1.0/tests/test_just_us_canada_bom_source.py +55 -0
- ask_just-0.1.0/tests/test_just_wiki_validator.py +341 -0
- ask_just-0.1.0/tests/test_netsuite_revenue_sources.py +115 -0
- ask_just-0.1.0/tests/test_onboarding_codes.py +106 -0
- ask_just-0.1.0/tests/test_operations_logistics_otif_source.py +71 -0
- ask_just-0.1.0/tests/test_operations_order_allocation_source.py +100 -0
- ask_just-0.1.0/tests/test_order_allocation_actions.py +290 -0
- ask_just-0.1.0/tests/test_order_allocation_source_family_proofs.py +123 -0
- ask_just-0.1.0/tests/test_personal_mail.py +249 -0
- ask_just-0.1.0/tests/test_prime_simple_setup.py +138 -0
- ask_just-0.1.0/tests/test_project_onestream_source.py +48 -0
- ask_just-0.1.0/tests/test_query_routing.py +242 -0
- ask_just-0.1.0/tests/test_question_simulator.py +186 -0
- ask_just-0.1.0/tests/test_semantic_router_playground.py +84 -0
- ask_just-0.1.0/tests/test_serve_http_health.py +1128 -0
- ask_just-0.1.0/tests/test_serve_http_onboarding.py +105 -0
- ask_just-0.1.0/tests/test_sharepoint_graph_credentials.py +81 -0
- ask_just-0.1.0/tests/test_source_all_planning.py +1442 -0
- ask_just-0.1.0/tests/test_source_handoff_consistency.py +69 -0
- ask_just-0.1.0/tests/test_source_index.py +29 -0
- ask_just-0.1.0/tests/test_spins_item_ranking_rows.py +494 -0
- ask_just-0.1.0/tests/test_spins_velocity_goal_audit.py +84 -0
- ask_just-0.1.0/tests/test_tofutown_source_boundaries.py +58 -0
- ask_just-0.1.0/tests/test_traced_query.py +186 -0
- ask_just-0.1.0/tests/test_verify_source_goal_complete.py +194 -0
- ask_just-0.1.0/tests/test_wecare_mailbox_summaries.py +158 -0
ask_just-0.1.0/PKG-INFO
ADDED
|
@@ -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
|
+

|
|
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
|
+
```
|