Skip to content

Public /app: deterministic deploy, live-demo fixes, and a stability protocol#9

Draft
rob-e-graham wants to merge 42 commits into
mainfrom
claude/archai-app-improvements-lmz0n1
Draft

Public /app: deterministic deploy, live-demo fixes, and a stability protocol#9
rob-e-graham wants to merge 42 commits into
mainfrom
claude/archai-app-improvements-lmz0n1

Conversation

@rob-e-graham

@rob-e-graham rob-e-graham commented Jul 9, 2026

Copy link
Copy Markdown
Owner

Summary

  • Makes the public fineartmedia.tech/app page reliable for a publicity-scale audience: a deterministic self-verifying deploy, fixes for three deployed-only bugs found during testing, and a written protocol so this class of "only breaks once it's live" issue stops recurring.

What changed

  • deploy-web-app.mjs (new): regenerates the website's app.html from the canonical ARCHAI_v10_8.html, injects window.ARCHAI_API_BASE, and re-reads the output to confirm the build marker + API base. Aborts if the file has no build marker, if it contains two different Build vX.Y.Z strings, or if the API-base contract changed. Flags: --dry-run, --no-push.
  • ARCHAI_v10_8.html fixes (build → v11.6.9):
    • Converse result cards wrapped in a flex container so the fixed-width card rule applies — they were rendering as full-width stretched banners.
    • Removed a stale hardcoded version string in the header JS that overwrote the correct one on load (page showed the new build, then "reverted").
    • Connect Collection panel given the same left/right inset the other tabs use — it was flush against the viewport edge.
  • docs/STABILITY_AND_TESTING_PROTOCOL.md (new): root-cause table, the self-verifying deploy, a 5-minute pre-publicity QA checklist run on the live URL, and rules for testing at scale without exposing write/publish/ingest or infrastructure paths to unauthenticated visitors.

How to test

  • node deploy-web-app.mjs --dry-run reports the detected build and target path, writes nothing.
  • Deploy, then on fineartmedia.tech/app: header reads v11.6.9 and stays; converse thumbnails are small cards; Connect tab is inset from the edge.
  • Guard proven: injecting a second, different version string makes the script abort before publishing.

Screenshots / recordings (if UI)

  • N/A here — UI fixes are verifiable live per the checklist above.

Risks / follow-up

  • The live /app still depends on the backend tunnel (archai-api.fineartmedia.tech) being up — operational, not in this change.
  • Outstanding before wide publicity (tracked in the protocol / PUBLIC_APP_DEMO_HOSTING.md): the public demo currently grants full staff access; it should run in a server-enforced read-only role.
  • Auckland "No image" cases are source-data coverage, not a rendering bug — documented in the protocol.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG

claude added 4 commits July 9, 2026 01:21
The live fineartmedia.tech/app page is a hand-copied shell that drifted to an
old build while the source moved on. This script regenerates the website's
app.html from the canonical source, injects window.ARCHAI_API_BASE for the
tunnelled backend, verifies the build marker + API base are present, and
publishes via the website repo. Additive only — no existing files changed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
- Wrap conversational-search object cards in a flex container so the
  fixed-width card rule applies; without it each card became a full-width
  block and the image stretched into a banner.
- Header JS hardcoded an old build label that overwrote the correct one on
  load (page showed the right version briefly, then reverted). Align the JS
  label with the static header and bump the build to v11.6.8.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
The Connect Collection panel's grid had no padding, so its left column sat
flush against the viewport edge while other tabs inset via their column
classes. Add the same 30px/42px inset the curator and vocab panels use.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
…g protocol

- deploy-web-app.mjs now aborts if the source contains two different
  "Build vX.Y.Z" strings (the static header vs the JS that rewrites it) —
  the exact fault that showed v11.6.7 then reverted to v11.6.5 live. It also
  already re-reads the written file to confirm the build marker + API base.
- Add docs/STABILITY_AND_TESTING_PROTOCOL.md: root-cause table, the
  self-verifying deploy, a 5-minute pre-publicity QA checklist run on the live
  URL, and rules for testing at scale without exposing write/publish/ingest or
  infrastructure paths to unauthenticated visitors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
@rob-e-graham rob-e-graham changed the title Add deterministic deploy script for the public /app page Public /app: deterministic deploy, live-demo fixes, and a stability protocol Jul 9, 2026
claude added 25 commits July 9, 2026 01:50
The opening result list rendered image-backed objects in load order, so
Museum Victoria (loaded first) always sat at the top. Interleave objects
across their source collections and randomise per render, so each visit
opens on a fresh, varied mix. Bump build to v11.6.10.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Make the public demo safe under publicity: visitors can search, converse,
talk to objects, and browse, but cannot save, edit, publish, harvest, or
reach admin — enforced on the server, not just hidden.

Backend (the security boundary):
- requestContext detects public traffic (Cloudflare tunnel headers or public
  host) and pins it to a read-only 'demo' role, ignoring any x-archai-role a
  visitor sends. Staff on localhost/Tailscale are unaffected.
- publicDemoGuard is a deny-by-default allowlist: the demo role may call only
  the read endpoints it needs; every other route returns 403. Unlisted routes
  fail closed. Verified with a full allow/block test matrix, including a spoof
  attempt (role=admin from the public side stays blocked).
- Kill-switch ARCHAI_PUBLIC_LOCKDOWN=off; remote-staff override via
  ARCHAI_STAFF_KEY + x-archai-staff-key.

Frontend (matching UI):
- IS_PUBLIC_DEMO locks the UI to a new read-only 'demo' role and hides
  staff-only controls (role picker, admin links, Training Mode, Reload/Run
  Harvesters, Manage Vocabularies, Select All/Export/Batch Tag, Save to
  Project, Edit in Directus) via data-staff-only.

Bump build to v11.6.11.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Three tag/keyword array strings were missed in the AUXIO rename. No version
bump — folds into the not-yet-deployed v11.6.11.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
… lockdown

Handoff entry (Huggle) for today's publicity-readiness work: deterministic
deploy script + guard, live-demo fixes (thumbnails, header version, connect
padding), diversified default view, server-enforced read-only public demo,
and the stability/testing protocol. Records deploy state and the open
staff-testing decision.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Expand the read-only demo role to include every tab (Exhibitions, AUXIO
Management, Vocabulary, Connect, FAMTEC) so the public demo showcases the
breadth of ARCHAI's ideas and developments. Safety remains enforced by the
backend (writes/publishing return 403 for public traffic), not by hiding
tabs. Bump build to v11.6.12.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
New Collection dropdown in the filter row lets you scope classic search,
the semantic fallback, and the default browse view to a single institution
(or All collections). Populated from the collections that actually loaded.
Read-only; safe for the public demo. Bump build to v11.6.13.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Add a 'Make AUXIO' action in object detail that creates a live AUXIO visitor
page from the object's own verified metadata (title, story, image, rights),
persisted via POST /api/nfc with a stable per-object code (re-running updates
rather than duplicates). The page renders through the existing
/api/nfc/pages/:tagId endpoint with grounded chat.

Backend: publicDemoGuard now allowlists POST /nfc for the demo role so public
visitors can create AUXIO pages, per product decision. This is the ONLY write
opened to the public — publish, harvest, admin, delete stay blocked (verified).
The page endpoint escapes all output; demo-created tags need light moderation/
cleanup. Also fixes a duplicated saveNFC opening introduced while editing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Handover entry covering all-tabs-accessible, collection selector, and public
Make-AUXIO, with an explicit deploy-state block (live frontend still v11.6.11,
backend lockdown not yet restarted) and the next steps toward pilot readiness.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
New harvesters, following the existing pattern (rights-gated, image-backed,
nomic-embed-text, Qdrant upsert, --dry-run default, --apply to write):

- wikimedia-harvester.js       archai_wikimedia        (keyless)
- internetarchive-harvester.js archai_internetarchive  (keyless)
- loc-harvester.js             archai_loc              (keyless)
- dpla-harvester.js            archai_dpla             (DPLA_API_KEY)
- trove-harvester.js           archai_trove            (TROVE_API_KEY)

Registered the 5 collections in backend ALLOWED_COLLECTIONS +
COLLECTION_INSTITUTIONS and frontend COLLECTIONS + COLLECTION_LABELS +
SOURCE_LABELS so search/scroll/converse accept them.

Rights posture unchanged: unknown/closed licences are HELD (not public-display);
only allow-listed open licences (CC0/CC BY/PD) are public. Aggregators (DPLA,
Trove, Europeana-style) keep per-item rights. Poster/print reuse stays off.

NOT yet run against the live stack — each needs a --dry-run then --apply on the
Mac Studio (Ollama + Qdrant). API response shapes were built from each source's
public docs and may need a field tweak on first run.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Records the new harvesters, their collections/keys, rights posture, run steps,
and the not-yet-run status + follow-ups (collection-targets.json entries,
rights review before public display).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Dry-run surfaced two issues: Wikimedia structured-data markup leaking into
titles (label QS:.../title QS:...) and photos labelled 'National Communication
Museum'. Clean titles to the plain human string, and exclude any record whose
title/description matches the exclusion list (keeps the former-employer
institution out during legal resolution). Reports an 'excluded' count.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Match the Wikimedia harvester: exclude any record whose title/description
references the former-employer institution, so it can't surface via any
source (Trove especially, as an Australian aggregator).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
…display

LoC's search API rarely returns a machine-readable licence, which held all
150 records (invisible in the demo). LoC's digitized photo/print/map
collections are overwhelmingly public domain, so treat image-backed results
as public UNLESS the rights text carries an explicit restriction signal
(copyright/permission/restricted/etc.). Source URL + a 'verify per item'
licence note stay visible. Re-run loc-harvester.js --apply to flip them public.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
…d keys)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
…pproval)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
…tution scripts)

Consolidates both uploaded contact databases + live web research (July 2026)
into one send-ready pack: correct contact for each org, assigned template
(A source / A-prospective / B Australian pilot / C technical / D advisor),
and a fully-written ready-to-paste email per institution with fit lines filled
in. 30 have direct emails ready now; rest are web-form routes. Verified new
contacts include LC-Labs@loc.gov, CollectionEnquiries@aucklandmuseum.com +
bjhoare@ (Auckland API), api@maas.museum (Powerhouse), access@nfsa.gov.au,
stories@mplus.org.hk. Prospective-source template avoids falsely claiming a
collection is already in ARCHAI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Companion to the send pack: paste straight into the Send Log tab. Columns:
Priority, Group, Template, Organisation, Contact used, Route type, Status
(pre-set 'Not sent'), Date sent, Follow-up due, Reply received,
Correction/takedown?, Next action, Notes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Partner-facing policy on where data lives, what leaves the host machine,
jurisdiction, cultural-safety gating (CARE/OCAP/Te Mana Raraunga), limitations,
exit/portability, and epistemic integrity. Reviewed for accuracy against the
current build before adding:
- Voice section corrected from a generic 'third-party API' to the actual
  browser Web Speech API (browser-vendor processing, varies by browser),
  matching the README's honest framing; Whisper/Piper noted as the in-dev
  sovereign path; text-only mode flagged as fully sovereign.
- Licence line set to all-rights-reserved during the research period with
  intended open release (not MPL); repo URL, contact, and date filled in.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Add §11 'Direction — the plan to full sovereignty': maps each §7 limitation
to its committed closure (Whisper/Piper voice, scale testing, maintenance,
model provenance), states the open-toolkit sector vision (grounded in the
roadmap North Star), the free-for-NFP-and-education + commercial-licensing
sustainability model, and the community-authority contribution path. Renumber
Review to §12; bump to v0.2.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
New design exploration: extend ARCHAI from object-level interpretation to a
sovereign, accessible tour guide / wayfinder. NFC/QR check-ins as the universal
baseline ('the eyes that don't watch you back'), a tiered sensing stack
(NFC/QR -> compass -> BLE -> optional LiDAR/RoomPlan), a building-map graph with
amenities and step-free routing, wayfinding that is routed-not-guessed
(epistemic integrity applied to space), and a Phase 0 MVP that needs no new
hardware. Logged in ARCHAI_PROGRESS.md (Huggle) alongside the data-residency
policy v0.2 note.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Interactive proof of the wayfinding design: a mock gallery you tap to 'check
in' (standing in for an NFC/QR tag), with ARCHAI narrating surroundings and
routing to objects/amenities. Directions come from Dijkstra over a verified
node/edge graph and the guide says so plainly when something isn't mapped
(routed, not guessed). Fully self-contained: no network calls, no camera, no
tracking, theme-aware, keyboard-accessible. Companion to
docs/ARCHAI_SPATIAL_WAYFINDING.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Capture the physical anchor: an image-capable, battery e-paper museum label
with embedded NFC that links to both the object and its map node. One tap =
audio tour + location assistance + accessibility. Records the image-as-landmark,
the 'shows the object even when it's absent' behaviour (held-not-deleted made
physical), graceful degradation, updatable/sovereign labels, eco framing, and
the open hardware specifics still to confirm.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Curate the mock into a real niche show — six public-domain works across six
collections (Met, Rijksmuseum, Cleveland, Van Gogh Museum, Tate, Brooklyn),
each with accurate metadata, rights, and a grounded first-person description.
Tapping a work opens its object card and speaks it aloud via the browser Web
Speech API (the same layer ARCHAI uses today) — real audio, fully self-contained.
Wayfinding, surroundings narration and highlights tour all retained.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
A mobile-first, standalone gallery map served from the AUXIO folder
(nfc-pages/v/ → /aux) so it is reachable on any phone at the same base
URL as the AUXIO pages. Wires six real AUXIO objects into a routed
wayfinding graph:

  a1 The Age of Bronze (Rodin)        → NFC276
  a2 The Seine at Bas-Meudon (Jongkind) → NFC210
  a3 The Soul exploring the recesses of the Grave (after Blake) → NFC700
  b1 Saùng-Gauk Burmese harp          → NFC500
  b2 Katamari Damacy                  → NFC850
  b3 A Rachitic Skeleton (after Buffon) → NFC1330

Uses the same routed-not-guessed engine as the design doc: Dijkstra
route(), surroundings(), narrated turn-by-turn directions, and a
time-boxed tour(). Each object card links to its real NFC####.html
AUXIO page via a relative href, so tapping opens the actual object with
its grounded audio — letting navigation response be tested end to end on
a phone.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
…lags outages

Root cause of the recurring "objects won't load" outages: the existing
LaunchAgents kept the backend and cloudflared tunnel alive, but nothing
kept Docker/Qdrant alive and nothing kept the Mac awake. When Docker
stopped (reboot, Docker Desktop not launched, container exit) the backend
stayed up with no vector DB, so objects silently failed to load — and no
one was told until a visitor noticed.

- archai-stack-supervisor.sh (new): a launchd-run loop that ensures Docker
  Desktop is running and the Qdrant container is up and answering, and
  checks Ollama, the local backend, and the public tunnel end to end. It
  owns the Docker+Qdrant layer (starting them when needed) and flag-only
  monitors backend/tunnel (launchd owns those, so it never double-starts —
  avoids the old EADDRINUSE). Alerts fire on every state change via a macOS
  notification, a log line, and an optional ARCHAI_ALERT_WEBHOOK for phone
  push. Alerts only on transitions, so no spam.

- install-public-launchagents.sh: now also installs a caffeinate agent
  (keeps the Mac awake — the other recurring outage cause) and the
  supervisor agent, alongside the existing backend + cloudflared agents.
  All four are KeepAlive/RunAtLoad and installed in one loop.

Compose already sets restart: unless-stopped on the containers; the
supervisor covers the case where Docker itself is not running.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
claude added 13 commits July 13, 2026 03:07
…arent models

- ARCHAI_PROGRESS.md: new 2026-07-13 entry covering the stack supervisor +
  keep-awake fix (root cause of the recurring outages), the phone-nav
  exhibition-map demo, and the ethical-models direction; bump Last updated.
- Data-residency policy §11: make the model-provenance commitment concrete
  by naming the transparent open models the project steers toward (OLMo 2,
  Pythia, IBM Granite, PleIAs' Common Corpus) plus Fairly Trained, matching
  the essay so repo and public writing stay in sync.

Audit: working tree clean, branch in sync with origin, PR #9 current.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
…ploy state

Before the outreach push, the log's "Deploy state" section (2026-07-09) is
out of date and could mislead: it still claims v11.6.11 is live and the
read-only lockdown is not running. Adds a dated PRE-OUTREACH VERIFICATION
checklist that supersedes it — four Mac-side checks (services/objects,
lockdown-is-live 403 test, live frontend build, fail-safe installed) with
exact commands, so the live demo is confirmed safe and dependable before
partners are sent to it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
… IP decision

Captures the non-code context alongside the code state so the outreach push
and any collaborator pick up clean: essay edits and their placement, the
LinkedIn threads handled (Jonathan/Madrona governance, William Rogers x-risk),
the muse.run/Talila warm inbound + collaboration models and guardrail, and the
still-open Obtext IP decision (protect vs open prior-art). Outreach starts
tomorrow after the pre-outreach verification passes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
… relay

- archai-stack-supervisor.sh: replace the bash-4-only associative array
  (declare -A STATE) with file-based state so it runs on stock macOS bash
  3.2 — as written it would have died on launch on any Mac without homebrew
  bash first on PATH, i.e. the fail-safe itself failing exactly when relied
  on. Also make the Qdrant check tolerant of /readyz vs / across Qdrant
  versions, and shell-escape notification text. Syntax + transition logic
  tested (alerts fire only on state changes, no dupes).
- ARCHAI_PROGRESS.md: add a "How to resume (read this first)" header so any
  new session reads the log + pre-outreach block before acting, and notes
  cloud Claude hands off via git (not the local Huggle bus).
- huggle-relay/claude-2026-07-13.md: paste-ready #archai post so a Mac-local
  agent can mirror this cloud handoff into Huggle after a pull.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
The old archai-public-watchdog.sh starts the backend and cloudflared itself,
which now collide with the launchd-owned copies and cause the :8787 port
conflict. It is orphaned (nothing installs it) but its tempting name makes it
a footgun. Guard it so running it prints a pointer to the supervisor/installer
and exits 0 without starting anything (override with ARCHAI_WATCHDOG_FORCE=1
for reference only). Supersedes it with archai-stack-supervisor.sh.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
…s, not the running stack

The architecture diagram listed CollectiveAccess (CMS) + ResourceSpace (DAMS)
as Layer 1, and the stack table listed them beside Qdrant/Ollama, implying the
demo runs them. It does not — the demo reads open collection APIs into
Qdrant/Ollama; those adapters are scaffolded, not wired to a live instance.
Reframed both as example CMS/DAMS ARCHAI can sit above (connector scaffolded),
matching how the essay and onboarding guide already describe them. Accuracy
fix ahead of outreach — no over-claiming what is actually running.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
…ndings

Same class as the CollectiveAccess/ResourceSpace fix — infrastructure written
as if running when it isn't:
- Storage: NAS + LTO-9 tape reframed as planned target architecture; current
  instance runs on Mac Studio local storage (setup guides confirm NAS is "when
  purchased").
- Proxmox VE marked (planned) — the instance is a single Mac Studio, not Proxmox.

Adds docs/COPY_AUDIT_2026-07-13.md capturing the full accuracy pass, including
items that need Rob's true value before aligning everywhere: object/record
counts (3,147 vs 3,267), AUXIO page count (1,402 vs 1,522), collection/institution
count (19/20/21), and the model claim (qwen2.5:32b vs the compose file's 14b).
Website copy noted as not-yet-audited (separate repo, network-blocked here).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
…lines

The generator dropped the internal Fit note straight into every email body,
producing unfinished/broken sentences (and, worse, self-instructions like
"ask open access team" visible to the recipient). Template B read mid-sentence
("...a strong fit because Born-digital, screen culture...").

Rewrote all 47 body lines (18 Template A, 18 prospective, 11 Template B) into
finished, recipient-facing sentences and stripped the self-instructions.
Templates C/D had empty bodies (never leaked). The internal Fit note above each
entry is unchanged for the sender's own targeting.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
…l 56 entries

Cold-email impact pass requested by Rob:
- Greetings now name the institution ("Hi Cleveland Museum of Art Open Access /
  Digital Collections team,") instead of the placeholder "[...]" that read as
  unfinished mail-merge. Short-name map for long names (Getty, Met, M+, etc.).
- Each email now invites the reader to meet a speaking object. Institutions
  with verified records in AUXIO get their OWN objects (Met: Cristofori piano;
  Cleveland: fish plate + Adeline Ravoux; Rijksmuseum, Smithsonian, NGA,
  Brasiliana, RAWG); everyone else gets the flagship pair (piano + fish plate).
  Only title-verified pages are linked — no guessed URLs.
- Adds the essay link (Waking Up the Museum, Substack) to every entry.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
Readability pass on all 56 emails: object links, the Waking Up the Museum
essay, Project/GitHub lines, and signature links now use markdown titled
links ([Red-Figure Fish Plate](url)) rather than pasted full URLs, so the
generated docx and any rich-text email paste read cleanly. No link targets
changed; only presentation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
…Huggle

- docs/ARCHAI_CURIOSITY_DESIGN_NOTES.md: digests the NYT piece on curiosity
  neuroscience (the question-answer gap as where learning happens; AI answers
  as endpoints) into ARCHAI design rules: answer + doorway in AUXIO prompts,
  surfacing unknowns as content, engineered serendipity in related objects,
  slow modes as a feature, never one smooth paragraph where two voices exist.
  Citation + digest only; full article text kept out of the public repo.
- ARCHAI_PROGRESS.md: session handover extended with the Musean client track
  (proof of voice → discovery → pilot ladder, rates, risks), the ResourceSpace
  channel track (PoC connector next step), and the new design notes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
…bound

Adds the phones-down interaction mode to the sensing stack: BLE dwell makes
the nearest object addressable, the visitor greets it out loud and hears a
grounded voice answer through earbuds, eyes on the object throughout. The
wearable variant (phone face-out on a lanyard as a "LiDAR necklace") adds
facing so "hello" is unambiguous. Hard rules: microphone opens only on
deliberate visitor action, dwell is not tracking, spoken answers end with a
doorway, and everything degrades gracefully to the NFC tap. Phase 0 needs no
new hardware: tap, pocket the phone, talk.

Huggle: logs heads-up mode and the Artisan-e inbound (flagged for due
diligence before any technical work).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
…sion rule set

Logs the project-definition request sent to Artisan-e (job definition incl.
conversational-vs-ingestion, one real worked example, commercial model and
value flow, current state, needs vs wants), the constraints stated up front
(opt-in only, rights travel with records, no scraping, cultural-safety gate),
and the decision rule for when the brief lands: museum-content-through-our-
bridge is declined; client-owned material becomes a scoped bespoke FAMTEC
engagement on the Musean playbook. No technical work before the brief.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NDZaYMCjmiyvCkJ4t1dJMG
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.

2 participants