Skip to content

feat(memory): integrate investigation reports and decisions with Hindsight - #10

Open
BohnBawerick wants to merge 5 commits into
mainfrom
fm/fm-hindsight-bucket
Open

feat(memory): integrate investigation reports and decisions with Hindsight#10
BohnBawerick wants to merge 5 commits into
mainfrom
fm/fm-hindsight-bucket

Conversation

@BohnBawerick

Copy link
Copy Markdown
Owner

Intent

Connect this fleet's finished knowledge to Hindsight so an old investigation can be found by searching for it instead of remembering it exists (last tier of adopted memory architecture in data/fm-memory-design/report.md section 16).

Corpus boundary strictly enforced: exactly data//report.md and data/decisions/.md. Explicitly excluded: data/captain.md, data/captain-shared.md, data/memory/, data/backlog.md, data/done-archive.md, and state/. Never send credentials, tokens, or .env values; files with secrets are skipped.
Scope cut from captain: bank + backfill only. Dropped ongoing capture wiring at report-write/decision-write.

Built:

  1. Created Hindsight bank 'firstmate' at http://hindsight-1:8888.
  2. bin/fm-hindsight-retain.sh: Retains one report/decision by path or runs backfill with --backfill. Fire-and-forget capable, idempotent on document_id (report: or decision:).
  3. One-off backfill of existing reports and decision records (144 total files in data/), resumable.
  4. bin/fm-hindsight-recall.sh: On-demand search tool printing compact, greppable memory items and observations.
  5. Colocated tests in tests/fm-hindsight.test.sh.

LIVE PROOF

  1. Bank listed by API:
$ curl -s http://hindsight-1:8888/v1/default/banks | jq '.banks[] | select(.bank_id == "firstmate")'
{
"bank_id": "firstmate",
"name": "firstmate",
"disposition": {
"skepticism": 3,
"literalism": 3,
"empathy": 3
},
"mission": "",
"created_at": "2026-08-20T04:27:50.930500+00:00",
"updated_at": "2026-08-20T05:08:55.883032+00:00"
}
  1. Document count in bank matches what was sent (144 documents):
$ curl -s http://hindsight-1:8888/v1/default/banks/firstmate/stats | jq '{bank_id, total_documents, total_nodes}'
{
"bank_id": "firstmate",
"total_documents": 144,
"total_nodes": 836
}
  1. Recall query finding report by body content:
$ ./bin/fm-hindsight-recall.sh "symlinks to projects" | grep -F "[report:fm-projects-symlink]" | head -n 3
[report:fm-projects-symlink] (experience) Recommendation: Do not register projects/<name> as symlinks to ~/PROJECTS/<name>; instead add selected projects via normal clone path, leave ~/PROJECTS/<name> untouched, clone GitHub origin into projects/<name>, register delivery posture, keep using WezTerm to drive fleet, hand work stays in ~/PROJECTS, shared truth is the remote. | When: Thursday, August 20, 2026 | Involving: firstmate
[report:fm-projects-symlink] (experience) projects/Healthlog, projects/Hermes, projects/VoiceMaster, projects/quota-axi are real directories, not symlinks. | When: Thursday, August 20, 2026 | Involving: firstmate
[report:fm-projects-symlink] (experience) Firstmate confirmed that the current fleet uses real clones (not symlinks) for Healthlog, Hermes, VoiceMaster, and quota-axi, and that the project registry treats ~/PROJECTS/VoiceMaster and ~/PROJECTS/Hermes as separate hand-work copies with GitHub as shared truth. | Involving: firstmate
  1. Idempotent retention with count unchanged:
$ FM_DATA_OVERRIDE=/home/paiva/labs/axi-sandbox/firstmate/data ./bin/fm-hindsight-retain.sh /home/paiva/labs/axi-sandbox/firstmate/data/fm-projects-symlink/report.md
retained: report:fm-projects-symlink (data/fm-projects-symlink/report.md)
$ curl -s http://hindsight-1:8888/v1/default/banks/firstmate/stats | jq '{bank_id, total_documents}'
{
"bank_id": "firstmate",
"total_documents": 144
}
$ FM_DATA_OVERRIDE=/home/paiva/labs/axi-sandbox/firstmate/data ./bin/fm-hindsight-retain.sh /home/paiva/labs/axi-sandbox/firstmate/data/fm-projects-symlink/report.md
retained: report:fm-projects-symlink (data/fm-projects-symlink/report.md)
$ curl -s http://hindsight-1:8888/v1/default/banks/firstmate/stats | jq '{bank_id, total_documents}'
{
"bank_id": "firstmate",
"total_documents": 144
}

What Changed

  • Added bin/fm-hindsight-retain.sh to retain investigation reports (data/*/report.md) and decision records (data/decisions/*.md) into Hindsight, supporting single-file retention and batch --backfill with credential scanning and corpus boundary enforcement.
  • Added bin/fm-hindsight-recall.sh to search Hindsight memory on demand, returning results in compact greppable text or JSON format.
  • Documented Hindsight configuration variables (FM_HINDSIGHT_URL, FM_HINDSIGHT_BANK) and script interfaces in AGENTS.md and docs/, and added test coverage via tests/fm-hindsight.test.sh in bin/fm-test-run.sh.

Risk Assessment

✅ Low: The implementation introduces well-bounded, standalone CLI tools for Hindsight retention and recall with strict corpus boundaries, secret filtering, and robust test coverage.

Testing

Exercised the complete Hindsight integration including automated behavioral tests (corpus boundary validation, credential scanner skipping, fire-and-forget execution, idempotent document retention, recall formatting, and resumable backfill) along with end-to-end live queries against the firstmate Hindsight bank proving idempotent retention of all 144 corpus documents and exact query recall.

Evidence: Automated Hindsight behavioral test run

Source: Automated Hindsight behavioral test run

FM_TEST_BEGIN 2026-08-20T05:38:54Z tests/fm-hindsight.test.sh family=pure-contract-unit expected_gate_skip=none
ok - corpus boundary enforcement rejects all files outside data/*/report.md and data/decisions/*.md
ok - credential scanner skips document and never sends secrets to Hindsight
ok - fire-and-forget retain on unreachable host returns immediately with zero measurable delay
ok - synchronous retain formats document_id and payload correctly for reports and decisions
ok - recall command outputs compact greppable results and supports --json
ok - backfill detects already-retained documents and resumes by retaining only missing documents
FM_TEST_END 2026-08-20T05:38:56Z tests/fm-hindsight.test.sh exit=0 duration_ms=1866 gate_skip=false
FM_TEST_SUMMARY total=1 failed=0 skipped_gate=0 duration_ms=2023
FM_TEST_SUMMARY_FAMILY family=pure-contract-unit count=1 duration_ms=1866 failed=0
FM_TEST_SLOWEST rank=1 script=tests/fm-hindsight.test.sh duration_ms=1866
Evidence: Live Hindsight firstmate bank configuration

Source: Live Hindsight firstmate bank configuration

{
  "bank_id": "firstmate",
  "name": "firstmate",
  "disposition": {
    "skepticism": 3,
    "literalism": 3,
    "empathy": 3
  },
  "mission": "",
  "created_at": "2026-08-20T04:27:50.930500+00:00",
  "updated_at": "2026-08-20T05:37:49.789063+00:00"
}
Evidence: Live Hindsight bank document count and stats

Source: Live Hindsight bank document count and stats

{
  "bank_id": "firstmate",
  "total_documents": 144,
  "total_nodes": 955
}
Evidence: Live recall search for symlinks to projects

Source: Live recall search for symlinks to projects

[report:fm-projects-symlink] (experience) Recommendation: Do not register projects/<name> as symlinks to ~/PROJECTS/<name>; instead add selected projects via normal clone path, leave ~/PROJECTS/<name> untouched, clone GitHub origin into projects/<name>, register delivery posture, keep using WezTerm to drive fleet, hand work stays in ~/PROJECTS, shared truth is the remote. | When: Thursday, August 20, 2026 | Involving: firstmate
[report:fm-projects-symlink] (experience) projects/Healthlog, projects/Hermes, projects/VoiceMaster, projects/quota-axi are real directories, not symlinks. | When: Thursday, August 20, 2026 | Involving: firstmate
[report:fm-projects-symlink] (experience) Firstmate confirmed that the current fleet uses real clones (not symlinks) for Healthlog, Hermes, VoiceMaster, and quota-axi, and that the project registry treats ~/PROJECTS/VoiceMaster and ~/PROJECTS/Hermes as separate hand-work copies with GitHub as shared truth. | Involving: firstmate
[report:fm-projects-symlink] (experience) data/projects.md records that VoiceMaster and Hermes were added as ordinary clones, and the captain works on ~/PROJECTS/VoiceMaster and ~/PROJECTS/Hermes with GitHub as shared truth. | When: Thursday, August 20, 2026 | Involving: captain
[report:fm-projects-symlink] (experience) Firstmate exercised the symlink path on a throwaway repo: live tree at /tmp/fm-symlink-probe-30788/live-working-tree, registry symlink at /tmp/fm-symlink-probe-30788/registry/symproj pointing to that live tree, and a local bare origin for fetch/fast-forward. | Involving: firstmate
[report:fm-projects-symlink] (experience) Compared to symlinks, the normal clone approach results in a second clone on disk, causes drift because fleet work starts from the clone origin, leaves the hand tree stale until pulled, and requires pulling to keep in sync. | When: Thursday, August 20, 2026 | Involving: firstmate
[report:fm-projects-symlink] (experience) A probe showed that creating a fm/<id> branch in the isolated copy writes refs/heads/fm/<id> into the shared repo, as git show-ref --heads in the live tree listed the branch at the copy's commit. | Involving: firstmate
[report:fm-projects-symlink] (world) Attempting to checkout fm/probe-task in the live tree fails with fatal: 'fm/probe-task' is already used by worktree at /home/paiva/.treehouse/live-working-tree-c0bffe/1/live-working-tree because the branch ref is shared. | Involving: user
[report:fm-projects-symlink] (experience) The normal clone approach satisfies the isolation intent but fails the unsafe wish to have one directory serve as both hand tree and fleet primary. | When: Thursday, August 20, 2026 | Involving: firstmate
[observation] (observation) Installed the quota-axi tool via `npm i -g <clone path>`, symlinking the global node_modules entry to the clone rather than copying.
[decision:vendored-clone-policy] (experience) Installed quota-axi tool via `npm i -g <clone path>` on 2026-08-16, symlinking global node_modules entry to the clone rather than copying | When: 2026-08-16 | Involving: firstmate (AI agent) | To ensure installed command resolves to patched copy for daily use
[report:fm-projects-symlink] (world) Teardown reads worktree= and project= from the task record; for a symlink, project= resolves to .../projects/<name> which git follows into the live tree.
[report:fm-projects-symlink] (world) The directory walk in fleet-sync treats a symlink-to-directory as a project because the [ -d ] test evaluates true, so sync_project is invoked on the symlink target.
[report:fm-projects-symlink] (experience) Registering a projects/<name> entry as a symlink to a live working tree is unsafe because it causes firstmate-owned steps to operate on the real repository, potentially rewriting files in the worker's working tree. | Involving: firstmate (AI agent)
[report:fm-projects-symlink] (experience) Do not symlink projects/<name>; use the normal add/clone path instead. | Involving: firstmate
[report:fm-projects-symlink] (world) Firstmate knows that a project path can contain a symlink, and the code uses the physical path to decide if the pane has left the project, not to stop treating the live tree as the project.
[report:fm-projects-symlink] (experience) This investigation should not ship a code change; a future mechanical refusal of `projects/<name>` when it is a symlink (or when `pwd -P` escapes `$FM_HOME/projects`) would be a separate ship, and firstmate currently documents clones and special-cases symlink comparison but never refuses a symlink project. | Involving: firstmate (AI agent) | Clarifies the scope of the current investigation and future work
[report:fm-projects-symlink] (world) The normal add/clone workflow via the project-management skill confirms the source URL, local name, delivery posture, and autonomy, then clones into projects/<name> only when that destination is unused before registering, ensuring it does not overwrite an existing path. | Involving: user
[report:fm-projects-symlink] (experience) In firstmate's spawn script, resolve_project_dir_arg rewrites projects/<name> to $FM_HOME/projects/<name> without resolving symlinks (using logical pwd), but later the script canonicalizes the path for comparison using pwd -P. | Involving: firstmate
[observation] (observation) PR diff contains no mode changes or symlink additions; the only tracked symlink remains services/voice-control/CLAUDE.md.
[report:fm-projects-symlink] (experience) For projects that must stay local-only with no remote, clone them into `projects/<name>` as a real clone (origin = `~/PROJECTS` path or no origin) and do not symlink; local merges land in the fleet clone. | Involving: firstmate (AI agent) | To ensure proper handling of local-only projects without remote origins
[report:vm-verify-wizard] (world) services/voice-control suite: 605 passed, 0 failed; services/voice: 335 passed, 1 failed (test_no_secret_values due to missing .env.nas symlink); services/talk-voice-bridge: 339 passed, 1 failed (same test_no_secret_values cause); ui vitest: 13 passed; ui build: clean, reproduces exact committed asset hash; isolated wizard tests: 73 passed (50 API, 23 browser), all green. | When: Thursday, August 20, 2026
[report:vm-verify-secret-scan] (experience) PR diff contains no mode changes or symlink additions; the only tracked symlink remains services/voice-control/CLAUDE.md. | When: Thursday, August 20, 2026 | Involving: firstmate (AI agent)
[report:fm-projects-symlink] (world) Guard does not walk projects/ or examine a project's primary checkout, leaving live ~/PROJECTS trees unprotected, especially when accessed via symlink.
[report:fm-projects-symlink] (world) Because fleet-sync is intended to refresh a clone, when the project directory is a symlink it refreshes the live working tree instead, potentially altering files and HEAD as observed in probes.
[report:fm-projects-symlink] (world) The treehouse pool identity is based on the basename of the live tree plus a hash of the origin URL, not the symlink name; if the user runs treehouse inside ~/PROJECTS/foo, firstmate's treehouse get from projects/foo joins the same pool, sharing worktrees and max_trees, while firstmate's return/reset still targets the recorded path but the pool is no longer firstmate-private. | Involving: user (he) and firstmate
[report:fm-projects-symlink] (world) With a symlinked registered path, safety is ensured because the worker is not launched in the user's working-tree directory, ordinary task file edits occur in ~/.treehouse/<repo>-<hash>/... rather than ~/PROJECTS, teardown of the pool copy does not remove the user's tree, and fleet-sync leaves dirty default-branch and named feature-branch checkouts unchanged. | Involving: user
[observation] (observation) services/voice-control suite: 605 passed, 0 failed; services/voice: 335 passed, 1 failed (test_no_secret_values due to missing .env.nas symlink); services/talk-voice-bridge: 339 passed, 1 failed (same test_no_secret_values cause); ui vitest: 13 passed; ui build: clean, reproduces exact committed asset hash; isolated wizard tests: 73 passed (50 API, 23 browser), all green.
[report:fm-projects-symlink] (world) When flee

... [4307 bytes truncated] ...

ious task's leftover fm/<id> ref remains in his repo if teardown failed to delete it. | Involving: user
[report:fm-projects-symlink] (world) Teardown safety checks inspect only the isolated copy ($WT), never the live tree's dirty state; uncommitted work in ~/PROJECTS does not block cleanup and is not discarded.
[report:fm-projects-symlink] (world) For backends except Orca, spawn creates an isolated copy by typing `treehouse get` into the pane and waiting for the pane's cwd physical path to differ from PROJ_ABS_REAL for two consecutive reads.
[report:fm-projects-symlink] (world) Worker edits in a live tree are directed to the pool copy, not the worker's dirty files; teardown safety only examines the pool copy, treating dirty files as irrelevant. | Involving: worker
[report:fm-projects-symlink] (world) Spawn's freshen_spawn_worktree_base updates the shared object store and remote-tracking refs because the isolated copy's git directory points to the live tree's .git. | Involving: user
[report:fm-projects-symlink] (world) Fleet-sync leaves checkout unchanged (STUCK: on branch) for named non-default branches, skipping recovery and fast-forward conditions even after commits. | Involving: worker
[report:fm-projects-symlink] (world) fleet-sync fast-forwards the working tree when on the default branch, clean, and behind origin; checks out default then may fast-forward when detached, clean, and ancestor of origin/default; does not checkout or fast-forward when dirty or on a named feature branch (still fetches and may prune other local branches). | Involving: user (he)
[report:fm-projects-symlink] (world) If the copy is on a named branch during teardown, git checks out detach and deletes the branch, removing fm/<id> from his repo via a shared-ref delete. | Involving: user
[report:fm-projects-symlink] (world) Tangle guard monitors only $FM_ROOT, alarms on named non-default branches, and is silent for detached HEAD, default branch, or non-git work trees.
[report:hz-verify-garmin-deploy] (experience) Firstmate performed verification steps on hz-garmin-deploy, including reading the report, checking container health, validating database counts, comparing file hashes, testing magiclink functionality, and reviewing PR #55 metadata. | Involving: firstmate (AI agent) | To verify hz-garmin-deploy
[report:fm-projects-symlink] (world) The guard does not check whether the new worktree shares the live tree's .git; it only verifies that the working-tree directories are different paths.
[report:fm-projects-symlink] (world) Live tree's working tree files remained unchanged by operations in the isolated copy; the README still said 'hello' and HEAD stayed on the main branch. | Involving: user
[decision:quota-axi-adapters] (experience) Firstmate decided to ship quota adapter work as a local-only patch on a branch due to lack of push access, GitHub fork privacy constraints, and contributing guidelines, and informed the captain of this resolution | When: 2026-08-20 | Involving: Firstmate (AI agent) to Captain | To proceed with implementation despite lack of upstream publish route
[report:hz-verify-pipeline-38] (world) PR hz-verify-pipeline-38 modified only non-production files: added .no-mistakes.yaml, updated AGENTS.md and README.md, added bin/run-tests.sh, and updated tests/test_sleep_archive_import.py; no changes under backend/app/, frontend/src/, frontend/e2e/, deploy/, or docker-compose.yml, and no changes to sign-in email implementation files. | When: Thursday, August 20, 2026 | indicates the PR is limited to test and configuration changes, reducing risk to production
[report:hz-verify-landing] (experience) PR adds exactly one file: designsystem2/Healthlog Marketing Site.html (1,563,182 bytes) with inline __bundler/manifest; no zip files, separate bundle files, or landing tests in PR tree. | Involving: firstmate (AI agent) | Indicates the PR introduces a single self-contained HTML file with no extra bundle assets.
[report:hz-verify-pipeline-38] (experience) I (firstmate) created a detached worktree at the PR head; before the run, both dependency directories (.venv and frontend/node_modules) were absent. | When: 2026-08-20 | Involving: firstmate
[observation] (observation) Firstmate cleaned up the verification environment on August 20, 2026 by removing the compose project hzv stack, volumes, and images using docker compose -p hzv down -v and docker rmi hzv-*.
[report:vm-verify-wizard] (experience) Narrator (firstmate) independently verified the deploy note's central cross-repo claim rather than trusting the prose. | Involving: firstmate (AI agent)
[report:hz-verify-serve] (experience) after verification, the compose project hzv stack, volumes, and images were removed using docker compose -p hzv down -v and docker rmi hzv-* | When: 2026-08-20 | Involving: firstmate | to clean up verification environment
[decision:round2-review] (experience) Firstmate selected option A for Trends vertical scale (stacked native-unit panels, same-unit metrics auto-merged); decision recorded in data/decisions/chart-encoding.md and built into data/hz-proto-v8/prototype.html. | When: 2026-08-20 | Involving: firstmate (AI agent) | Formal decision recorded in configuration files and prototype.
[decision:proposal-round-1] (experience) All four items routed to hz-proto-v5 as a single prototype pass instead of one rebuild per item. | When: 2026-08-20 | Involving: firstmate
[report:vm-verify-secret-scan] (experience) Both test_registry.py and test_secret_scan_resolution.py copies now import and call load_secret_scan_env_file, with the old git rev-parse logic removed; end-to-end verification shows correct detection failure, fail-loudly on missing file, and reproduces the F2 laundering hole. | When: Thursday, August 20, 2026 | Involving: firstmate (AI agent)
[decision:fm-fork-main-force-push] (experience) Firstmate executed the fork alignment via git push --force-with-lease, approving and completing the task | When: 2026-08-19 | Involving: firstmate
[decision:prototype-v6-review] (experience) Firstmate inspected data/hz-proto-v6/prototype.html on 2026-08-13 | When: 2026-08-13 | Involving: firstmate
[decision:vm-axis-remaining-gaps] (experience) Firstmate noted that the captain had already indicated on 2026-08-18 that nothing deployed is in use by anyone (per data/projects.md), so none of the gaps pose live risk and the only remaining question is build quality. | When: 2026-08-18 | Involving: firstmate
[observation] (observation) Firstmate's magic link token issuance triggered the login_links table's housekeeping DELETE, pruning the deploying worker's already-expired, cleanly-delivered rows.
[decision:vm-axis-remaining-gaps] (experience) Firstmate decided that G1 and G3 become their own task, vm-agents-dir-health, rather than extending Ticket 16 a third time; the task is blocked by the Agents screen rebuild because both touch the same file. | When: 2026-08-18 | Involving: firstmate
[observation] (observation) Live deployment verified healthy: all four containers running, public HTTPS address responds, app renders end-to-end for signed-in user with no console errors, worker claims and finishes jobs, owner's eight years of history intact and byte-for-byte reproducible from a restored backup.
[report:hz-verify-garmin-deploy] (experience) Firstmate's magic link token issuance triggered the login_links table's housekeeping DELETE, pruning the deploying worker's already-expired, cleanly-delivered rows. | When: Thursday, August 20, 2026 | Involving: firstmate | designed behavior of issue_link()
[report:hz-verify-garmin-deploy] (experience) firstmate verified that the running container image matches the on-disk checkout by comparing SHA256 hashes of .py and .sql files. | When: Thursday, August 20, 2026 | Involving: firstmate (AI agent) | to verify image consistency
[report:hz-verify-garmin-deploy] (experience) Firstmate minted a magic link token via the backend container and consumed it over HTTPS, resulting in a successful sign-in (authenticated true, account_id 4) without sending any mail or altering the invite list. | When: Thursday, August 20, 2026 | Involving: firstmate | to verify the sign-in flow
- Evidence: [Live recall search formatted as JSON](https://github.com/BohnBawerick/firstmate/blob/4ec1cdba49324c2c4dc18057368e572f6a002c51/.no-mistakes/evidence/fm/fm-hindsight-bucket/live-recall-json.json)
Evidence: Live backfill resumability verification over 144 files

Source: Live backfill resumability verification over 144 files

already present: report:fm-memory-design (data/fm-memory-design/report.md)
already present: report:fm-projects-symlink (data/fm-projects-symlink/report.md)
already present: report:hz-accounts (data/hz-accounts/report.md)
already present: report:hz-backend (data/hz-backend/report.md)
already present: report:hz-chart-scale (data/hz-chart-scale/report.md)
already present: report:hz-compete (data/hz-compete/report.md)
already present: report:hz-email-deploy (data/hz-email-deploy/report.md)
already present: report:hz-export-backup (data/hz-export-backup/report.md)
already present: report:hz-fitapi (data/hz-fitapi/report.md)
already present: report:hz-garmin-deploy (data/hz-garmin-deploy/report.md)
already present: report:hz-garmin (data/hz-garmin/report.md)
already present: report:hz-live-swap (data/hz-live-swap/report.md)
already present: report:hz-metrics (data/hz-metrics/report.md)
already present: report:hz-preview (data/hz-preview/report.md)
already present: report:hz-proposal (data/hz-proposal/report.md)
already present: report:hz-proto-a (data/hz-proto-a/report.md)
already present: report:hz-proto-b (data/hz-proto-b/report.md)
already present: report:hz-proto-c (data/hz-proto-c/report.md)
already present: report:hz-proto-general (data/hz-proto-general/report.md)
already present: report:hz-proto-ia (data/hz-proto-ia/report.md)
already present: report:hz-proto-text (data/hz-proto-text/report.md)
already present: report:hz-proto-v2 (data/hz-proto-v2/report.md)
already present: report:hz-proto-v3 (data/hz-proto-v3/report.md)
already present: report:hz-proto-v4 (data/hz-proto-v4/report.md)
already present: report:hz-proto-v4b (data/hz-proto-v4b/report.md)
already present: report:hz-proto-v5 (data/hz-proto-v5/report.md)
already present: report:hz-proto-v6 (data/hz-proto-v6/report.md)
already present: report:hz-proto-v7 (data/hz-proto-v7/report.md)
already present: report:hz-proto-v8 (data/hz-proto-v8/report.md)
already present: report:hz-proto-xref (data/hz-proto-xref/report.md)
already present: report:hz-prreview (data/hz-prreview/report.md)
already present: report:hz-quota-gap (data/hz-quota-gap/report.md)
already present: report:hz-remove-synthetic-garmin-nights (data/hz-remove-synthetic-garmin-nights/report.md)
already present: report:hz-review-consolidate (data/hz-review-consolidate/report.md)
already present: report:hz-signin-e2e-diagnosis (data/hz-signin-e2e-diagnosis/report.md)
already present: report:hz-sleepdata (data/hz-sleepdata/report.md)
already present: report:hz-verify-against (data/hz-verify-against/report.md)
already present: report:hz-verify-against2 (data/hz-verify-against2/report.md)
already present: report:hz-verify-archive-28 (data/hz-verify-archive-28/report.md)
already present: report:hz-verify-archive-32-2 (data/hz-verify-archive-32-2/report.md)
already present: report:hz-verify-archive-32 (data/hz-verify-archive-32/report.md)
already present: report:hz-verify-archive (data/hz-verify-archive/report.md)
already present: report:hz-verify-clock (data/hz-verify-clock/report.md)
already present: report:hz-verify-copy-33 (data/hz-verify-copy-33/report.md)
already present: report:hz-verify-deploy-39 (data/hz-verify-deploy-39/report.md)
already present: report:hz-verify-efficiency-2 (data/hz-verify-efficiency-2/report.md)
already present: report:hz-verify-efficiency (data/hz-verify-efficiency/report.md)
already present: report:hz-verify-email-2 (data/hz-verify-email-2/report.md)
already present: report:hz-verify-email-3 (data/hz-verify-email-3/report.md)
already present: report:hz-verify-email-37-2 (data/hz-verify-email-37-2/report.md)
already present: report:hz-verify-email-37-3 (data/hz-verify-email-37-3/report.md)
already present: report:hz-verify-email-37-4 (data/hz-verify-email-37-4/report.md)
already present: report:hz-verify-email-37 (data/hz-verify-email-37/report.md)
already present: report:hz-verify-email-40 (data/hz-verify-email-40/report.md)
already present: report:hz-verify-email (data/hz-verify-email/report.md)
already present: report:hz-verify-fixture-36 (data/hz-verify-fixture-36/report.md)
already present: report:hz-verify-fresh-db-35-2 (data/hz-verify-fresh-db-35-2/report.md)
already present: report:hz-verify-fresh-db-35 (data/hz-verify-fresh-db-35/report.md)
already present: report:hz-verify-garmin-41 (data/hz-verify-garmin-41/report.md)
already present: report:hz-verify-garmin-42 (data/hz-verify-garmin-42/report.md)
already present: report:hz-verify-garmin-deploy (data/hz-verify-garmin-deploy/report.md)
already present: report:hz-verify-landing (data/hz-verify-landing/report.md)
already present: report:hz-verify-landing2 (data/hz-verify-landing2/report.md)
already present: report:hz-verify-landing3 (data/hz-verify-landing3/report.md)
already present: report:hz-verify-method (data/hz-verify-method/report.md)
already present: report:hz-verify-pipeline-38-2 (data/hz-verify-pipeline-38-2/report.md)
already present: report:hz-verify-pipeline-38 (data/hz-verify-pipeline-38/report.md)
already present: report:hz-verify-reconcile (data/hz-verify-reconcile/report.md)
already present: report:hz-verify-score (data/hz-verify-score/report.md)
already present: report:hz-verify-serve (data/hz-verify-serve/report.md)
already present: report:hz-verify-shell (data/hz-verify-shell/report.md)
already present: report:hz-verify-signup (data/hz-verify-signup/report.md)
already present: report:hz-verify-sources-34 (data/hz-verify-sources-34/report.md)
already present: report:hz-verify-sources (data/hz-verify-sources/report.md)
already present: report:hz-verify-sweep (data/hz-verify-sweep/report.md)
already present: report:hz-verify-trends (data/hz-verify-trends/report.md)
already present: report:qx-explainer (data/qx-explainer/report.md)
already present: report:vm-00-inbound-dead-triage (data/vm-00-inbound-dead-triage/report.md)
already present: report:vm-00-inbound-dead (data/vm-00-inbound-dead/report.md)
already present: report:vm-verify-01 (data/vm-verify-01/report.md)
already present: report:vm-verify-01b (data/vm-verify-01b/report.md)
already present: report:vm-verify-01c (data/vm-verify-01c/report.md)
already present: report:vm-verify-01d (data/vm-verify-01d/report.md)
already present: report:vm-verify-01e (data/vm-verify-01e/report.md)
already present: report:vm-verify-01f (data/vm-verify-01f/report.md)
already present: report:vm-verify-01g (data/vm-verify-01g/report.md)
already present: report:vm-verify-02 (data/vm-verify-02/report.md)
already present: report:vm-verify-02b (data/vm-verify-02b/report.md)
already present: report:vm-verify-03 (data/vm-verify-03/report.md)
already present: report:vm-verify-04 (data/vm-verify-04/report.md)
already present: report:vm-verify-05 (data/vm-verify-05/report.md)
already present: report:vm-verify-06 (data/vm-verify-06/report.md)
already present: report:vm-verify-06b (data/vm-verify-06b/report.md)
already present: report:vm-verify-07-2 (data/vm-verify-07-2/report.md)
already present: report:vm-verify-07 (data/vm-verify-07/report.md)
already present: report:vm-verify-08 (data/vm-verify-08/report.md)
already present: report:vm-verify-09 (data/vm-verify-09/report.md)
already present: report:vm-verify-09b (data/vm-verify-09b/report.md)
already present: report:vm-verify-10 (data/vm-verify-10/report.md)
already present: report:vm-verify-11 (data/vm-verify-11/report.md)
already present: report:vm-verify-12 (data/vm-verify-12/report.md)
already present: report:vm-verify-12b (data/vm-verify-12b/report.md)
already present: report:vm-verify-14 (data/vm-verify-14/report.md)
already present: report:vm-verify-14b (data/vm-verify-14b/report.md)
already present: report:vm-verify-17 (data/vm-verify-17/report.md)
already present: report:vm-verify-agents-health (data/vm-verify-agents-health/report.md)
already present: report:vm-verify-axis-2 (data/vm-verify-axis-2/report.md)
already present: report:vm-verify-axis (data/vm-verify-axis/report.md)
already present: report:vm-verify-notes (data/vm-verify-notes/report.md)
already present: report:vm-verify-secret-scan-2 (data/vm-verify-secret-scan-2/report.md)
already present: report:vm-verify-secret-scan (data/vm-verify-secret-scan/report.md)
already present: report:vm-verify-wizard (data/vm-verify-wizard/report.md)
already present: decision:backend-shape (data/decisions/backend-shape.md)
already present: decision:build-plan-and-holds (data/decisions/build-plan-and-holds.md)
already present: decision:chart-encoding (data/decisions/chart-encoding.md)
already present: decision:database-architecture (data/decisions/database-architecture.md)
already present: decision:delivery-posture (data/decisions/delivery-posture.md)
already present: decision:export-already-held (data/decisions/export-already-held.md)
already present: decision:firstmate-fork-protocol (data/decisions/firstmate-fork-protocol.md)
already present: decision:fm-fork-main-force-push (data/decisions/fm-fork-main-force-push.md)
already present: decision:garmin-clock-and-import-granularity (data/decisions/garmin-clock-and-import-granularity.md)
already present: decision:hz-garmin-zero-hypnogram (data/decisions/hz-garmin-zero-hypnogram.md)
already present: decision:hz-synthetic-garmin-nights (data/decisions/hz-synthetic-garmin-nights.md)
already present: decision:independent-verification (data/decisions/independent-verification.md)
already present: decision:ingest-pr-notes (data/decisions/ingest-pr-notes.md)
already present: decision:mail-egress-and-interrupted-row-retention (data/decisions/mail-egress-and-interrupted-row-retention.md)
already present: decision:multi-user (data/decisions/multi-user.md)
already present: decision:proposal-round-1 (data/decisions/proposal-round-1.md)
already present: decision:prototype-v5-round (data/decisions/prototype-v5-round.md)
already present: decision:prototype-v6-review (data/decisions/prototype-v6-review.md)
already present: decision:quota-axi-adapters (data/decisions/quota-axi-adapters.md)
already present: decision:reimport-merge (data/decisions/reimport-merge.md)
already present: decision:round2-review (data/decisions/round2-review.md)
already present: decision:sleep-score (data/decisions/sleep-score.md)
already present: decision:three-design-questions (data/decisions/three-design-questions.md)
already present: decision:vendored-clone-policy (data/decisions/vendored-clone-policy.md)
already present: decision:vm-08-lkg-fallback (data/decisions/vm-08-lkg-fallback.md)
already present: decision:vm-axis-legacy-screen (data/decisions/vm-axis-legacy-screen.md)
already present: decision:vm-axis-remaining-gaps (data/decisions/vm-axis-remaining-gaps.md)
already present: decision:vm-axis-stale-slot-visibility (data/decisions/vm-axis-stale-slot-visibility.md)
already present: decision:vm-inbound-fold-into-rebuild (data/decisions/vm-inbound-fold-into-rebuild.md)
already present: decision:vm-outlet-axis (data/decisions/vm-outlet-axis.md)
already present: decision:vm-pr2-round7-vs-fix-forward (data/decisions/vm-pr2-round7-vs-fix-forward.md)
already present: decision:vm-secret-scan-inert (data/decisions/vm-secret-scan-inert.md)
backfill summary: 0 retained, 144 already present, 0 skipped for credentials, 0 failed, 144 total
Evidence: Live retention idempotence probe

Source: Live retention idempotence probe

=== Retain report:fm-projects-symlink ===
retained: report:fm-projects-symlink (data/fm-projects-symlink/report.md)
=== Stats check ===
{
  "bank_id": "firstmate",
  "total_documents": 144,
  "total_nodes": 955
}
=== Retain again (idempotent) ===
retained: report:fm-projects-symlink (data/fm-projects-symlink/report.md)
=== Stats check ===
{
  "bank_id": "firstmate",
  "total_documents": 144,
  "total_nodes": 955
}
Evidence: Corpus boundary rejection check

Source: Corpus boundary rejection check

=== Corpus boundary rejection tests ===
--- Testing data/captain.md ---
REFUSED: path 'data/captain.md' is outside authorized Hindsight corpus (data/*/report.md and data/decisions/*.md only)
--- Testing data/captain-shared.md ---
REFUSED: path 'data/captain-shared.md' is outside authorized Hindsight corpus (data/*/report.md and data/decisions/*.md only)
--- Testing data/memory/core.md ---
REFUSED: path 'data/memory/core.md' is outside authorized Hindsight corpus (data/*/report.md and data/decisions/*.md only)
--- Testing data/memory/notes/foo.md ---
REFUSED: path 'data/memory/notes/foo.md' is outside authorized Hindsight corpus (data/*/report.md and data/decisions/*.md only)
--- Testing data/backlog.md ---
REFUSED: path 'data/backlog.md' is outside authorized Hindsight corpus (data/*/report.md and data/decisions/*.md only)
--- Testing data/done-archive.md ---
REFUSED: path 'data/done-archive.md' is outside authorized Hindsight corpus (data/*/report.md and data/decisions/*.md only)
--- Testing state/task.meta ---
REFUSED: path 'state/task.meta' is outside authorized Hindsight corpus (data/*/report.md and data/decisions/*.md only)

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

✅ **Review** - passed

✅ No issues found.

✅ **Test** - passed

✅ No issues found.

  • tests/fm-hindsight.test.sh
  • ./bin/fm-test-run.sh tests/fm-hindsight.test.sh
  • curl -s http://hindsight-1:8888/v1/default/banks | jq '.banks[] | select(.bank_id == "firstmate")'
  • curl -s http://hindsight-1:8888/v1/default/banks/firstmate/stats | jq '{bank_id, total_documents, total_nodes}'
  • ./bin/fm-hindsight-recall.sh "symlinks to projects"
  • ./bin/fm-hindsight-recall.sh "memory architecture" --json
  • FM_DATA_OVERRIDE=/home/paiva/labs/axi-sandbox/firstmate/data ./bin/fm-hindsight-retain.sh /home/paiva/labs/axi-sandbox/firstmate/data/fm-projects-symlink/report.md
  • FM_DATA_OVERRIDE=/home/paiva/labs/axi-sandbox/firstmate/data ./bin/fm-hindsight-retain.sh --backfill
  • ./bin/fm-hindsight-retain.sh data/captain.md (and prohibited corpus files)
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant