{
  "handoff": {
    "id": "handoff-2026-07-01",
    "schema_version": "0.1.0",
    "kind": "agent_handoff",
    "instance_id": "claude-sonnet-5",
    "created_at_field": "2026-07-01",
    "summary": "Expand job-board crawler with Ashby/OpenAI support, rebuild workers/etl, build subagentetl.com Kimball ETL dashboard, build cwc-data plugin, deploy all three live via Desktop Commander",
    "tasks": [
      {
        "id": "task-vendor-indexer-run",
        "content": "Run indexer over vendor repos (crates/indexer walks .vendors.toml repos -> fact_filesystem + dim_file_ast)",
        "priority": "medium",
        "status": "pending",
        "kind": {
          "type": "shell_command",
          "command": "cargo run -p indexer -- --all"
        }
      },
      {
        "id": "task-switch-cowork-profile",
        "content": "Switch Claude Desktop to the cowork profile (surface macos__desktop_cowork__engineering_coworker)",
        "priority": "low",
        "status": "pending",
        "kind": {
          "type": "shell_command",
          "command": "bash profiles/switch-profile.sh cowork"
        },
        "notes": "Requires building the engineering-coworker binary first: cargo build -p engineering-coworker"
      },
      {
        "id": "task-refresh-oauth-token",
        "content": "Refresh CLAUDE_CODE_OAUTH_TOKEN if expired",
        "priority": "low",
        "status": "pending",
        "kind": {
          "type": "shell_command",
          "command": "claude auth login"
        },
        "notes": "Conditional -- only needed if the current token has actually expired."
      }
    ],
    "still_open_from_previous_handoffs": {
      "ref": "sessions/handoff-2026-06-30.json",
      "note": "None of that file's 8 tasks (task-refresh-lockfile, task-migration-006, task-migration-007, task-verify-bootstrap, task-first-crawl, task-index-docs, task-a2a-executor, task-repo-fmt-debt) were touched this session -- all Rust/Postgres/docs-crawl work, unrelated to this session's TypeScript/Wrangler/plugin scope. Presumed still pending; re-verify status rather than trusting this note indefinitely."
    },
    "previous_handoff": "handoff-2026-06-30",
    "see_also": [
      {
        "path": "HANDOFF.md",
        "note": "A concurrent, separate session's narrative handoff (untracked, written same day) covering disjoint work: workers/subagentworkers + workers/subagentdb (GLM-5.2 thinking-mode empty-output bug, a zero-external-paid-API product constraint, and a general 'never run npm/tsc/wrangler for any workers/* project from a cloud sandbox -- it poisons the shared node_modules mount with wrong-platform binaries' warning that applies here too, not just to those two workers). It also researched Managed Agents/Office Agents/Claude Tag independently, using this repo's local docs/docs/ mirror instead of live fetch -- conclusions converge with model_notes below, which is a useful cross-check."
      }
    ],
    "source_site": "subagenthandoffs.com",
    "content": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"schema_version\": \"0.1.0\",\n  \"kind\": \"agent_handoff\",\n  \"previous_handoff\": \"sessions/handoff-2026-06-30.json\",\n  \"see_also\": [\n    {\n      \"path\": \"HANDOFF.md\",\n      \"note\": \"A concurrent, separate session's narrative handoff (untracked, written same day) covering disjoint work: workers/subagentworkers + workers/subagentdb (GLM-5.2 thinking-mode empty-output bug, a zero-external-paid-API product constraint, and a general 'never run npm/tsc/wrangler for any workers/* project from a cloud sandbox -- it poisons the shared node_modules mount with wrong-platform binaries' warning that applies here too, not just to those two workers). It also researched Managed Agents/Office Agents/Claude Tag independently, using this repo's local docs/docs/ mirror instead of live fetch -- conclusions converge with model_notes below, which is a useful cross-check.\"\n    }\n  ],\n  \"meta\": {\n    \"from_agent\": \"claude-sonnet-5\",\n    \"to_agent\": \"claude-fable-5\",\n    \"to_agent_note\": \"Fable 5 redeploys 2026-07-01 (today) per anthropic.com/news/redeploying-fable-5. Its exact API model-string slug was not published in that announcement -- confirm the real string at platform.claude.com/docs before assuming \\\"claude-fable-5\\\" is correct. If a request unexpectedly comes back from Opus 4.8 instead, that's expected: Anthropic auto-routes Fable-5 requests blocked by its new cybersecurity classifier to Opus 4.8 rather than refusing outright.\",\n    \"repo\": \"opencoworkers/subagentjobs\",\n    \"default_branch\": \"main\",\n    \"created_at\": \"2026-07-01\",\n    \"session_goal\": \"Expand job-board crawler with Ashby/OpenAI support, rebuild workers/etl, build subagentetl.com Kimball ETL dashboard, build cwc-data plugin, deploy all three live via Desktop Commander\"\n  },\n  \"mission\": \"Everything under completed_this_session is LIVE in production and was verified end-to-end this session (not just type-checked/assumed). Read CLAUDE.md's Pending tasks + still_open_from_previous_handoffs below before starting new work -- none of that was touched this session.\",\n  \"completed_this_session\": {\n    \"ashby_integration\": {\n      \"summary\": \"Added Ashby ATS platform support (fetchAshbyIds) to workers/cron for OpenAI (board token 'openai'). Ingested and reconciled to 723 rows in fact_job_posting; fixed a company_name capitalization bug ('OpenAI' -> 'openai') to match the lowercase-token convention every other company uses (anthropic, figma, palantir, ...).\",\n      \"verified\": \"Live crawl via deployed workers/etl: /crawl?board=openai -> {\\\"platform\\\":\\\"ashby\\\",\\\"changed\\\":true,\\\"jobs\\\":723}. Confirmed via direct D1 query.\"\n    },\n    \"etl_worker_rebuild\": {\n      \"summary\": \"workers/etl previously had NO in-repo source (dashboard/script-API deployed). Rebuilt src/index.ts, package.json, tsconfig.json, wrangler.toml from scratch, added fetchAshby(). Fixed a pre-existing silent dim_board bug: writes were UPDATE-only, so 43 of 45 Greenhouse boards never got a dim_board row (invisible on any job_count>0 dashboard filter despite having live job data) -- changed to INSERT ... ON CONFLICT ... DO UPDATE and backfilled the 43 boards; documented via migrations/005_expand_boards.sql + 006_backfill_dim_board_stats.sql.\",\n      \"verified\": \"Post-deploy live tests: /crawl?board=openai -> 723 jobs (ashby), /crawl?board=whoop -> 164 (lever), /crawl?board=figma -> 168 (greenhouse). crawl_log rows carry real sha256 hashes, replacing the earlier manual placeholder 'manual-ingest-2026-07-01'.\"\n    },\n    \"subagentetl_dashboard\": {\n      \"summary\": \"New Cloudflare Worker workers/subagentetl, serves subagentetl.com. Kimball-style ETL pipeline dashboard: SVG star-schema diagram (fact_job_posting / dim_board / dim_skill / dim_department / dim_office / bridge_job_skill / bridge_job_office / crawl_log), pipeline-run history table, per-source freshness badges (STALE_HOURS=12). User explicitly chose scope: visualize the EXISTING crawler pipeline, not a new one.\",\n      \"bugfix\": \"starSchemaSvg() originally hardcoded literal counts (e.g. '51 skills') as static SVG text. Fixed by threading the live D1-backed Summary object through the function so the diagram can't silently go stale.\",\n      \"verified\": \"Deployed (Version 4347336a-e4e4-41a6-bb19-bfd8b0d60251). My sandboxed web_fetch showed a stale cached page post-deploy; diagnosed as a fetch-tool caching artifact (not a real regression) via cache-busted `curl -D-` run on the real machine through Desktop Commander -- response headers matched the new code exactly.\"\n    },\n    \"cwc_data_plugin\": {\n      \"summary\": \"New plugins/cwc-data, mirrors plugins/cwc-design's file layout exactly (.claude-plugin/plugin.json, commands/data.md, skills/data-playbook/SKILL.md, agents/data-coworker.md, gates.toml, README.md, LICENSE). Scope: warehouse analyst ONLY, per explicit user choice -- pipeline/DAG authoring and web/data-extraction skill areas deliberately excluded. Registered in .claude-plugin/marketplace.json alongside cwc-design.\",\n      \"notes\": \"skills/data-playbook/SKILL.md encodes the real schema gotchas discovered this session (see gotchas array below), a 6-item self-review checklist, and a provenance-footer format, following the design basis of Anthropic's self-service-analytics blog post the user cited.\"\n    },\n    \"deploys\": {\n      \"summary\": \"Ran real `npm install` + `wrangler deploy` for subagentetl, workers/etl, workers/cron via the Desktop Commander MCP (operates on the user's actual Mac, not this sandbox) at the user's explicit request.\",\n      \"bugfix\": \"`wrangler deploy` failed non-interactively ('More than one account available but unable to select one in non-interactive mode') because the login resolves 2 Cloudflare accounts. Fixed permanently by adding `account_id = \\\"e6294e3ea89f8207af387d459824aaae\\\"` to wrangler.toml for all three workers touched this session (cron, etl, subagentetl). Did NOT touch workers/web or other untouched workers' wrangler.toml files.\"\n    }\n  },\n  \"gotchas\": [\n    \"company_name is a lowercase crawl token ('anthropic', 'openai'), never a display name.\",\n    \"evicted_at IS NULL is the 'active' hygiene filter used everywhere.\",\n    \"dim_department, dim_office, bridge_job_office, streams_job_change are schema-defined but empty/unused in production -- don't assume data exists there.\",\n    \"Netflix uses Eightfold (not Greenhouse/Lever/Ashby) -- handled as a one-time manual lookup, never ingested into the warehouse.\",\n    \"job_count = 0 on a board can be legitimate, not a bug.\",\n    \"D1 has bound-parameter limits; the ETL's 50-row x 12-column batch upserts deliberately use manual SQL-string escaping instead of .bind() placeholders for this reason -- don't 'improve' this without checking the limit math first.\"\n  ],\n  \"environment_constraints_new_this_session\": [\n    {\n      \"id\": \"deploy-requires-desktop-commander\",\n      \"severity\": \"high\",\n      \"fact\": \"This agent (cloud sandbox) has no authenticated wrangler/npm session and cannot deploy Cloudflare Workers directly.\",\n      \"workaround\": \"Use the Desktop Commander MCP (mcp__Desktop_Commander__start_process / read_process_output / interact_with_process) to run npm/wrangler commands on the user's real Mac, which has an authenticated wrangler CLI. Only usable when the user explicitly invokes/grants it.\"\n    },\n    {\n      \"id\": \"wrangler-multi-account-noninteractive\",\n      \"severity\": \"medium\",\n      \"fact\": \"The user's Cloudflare login resolves to 2 accounts (Admin@jadecli.com and Alex@jadecli.com). `wrangler deploy` fails non-interactively with 'More than one account available' unless account_id is pinned.\",\n      \"workaround\": \"Add `account_id = \\\"e6294e3ea89f8207af387d459824aaae\\\"` to any NEW worker's wrangler.toml before deploying. Already present in workers/cron, workers/etl, workers/subagentetl.\"\n    },\n    {\n      \"id\": \"connected-folder-delete-blocked\",\n      \"severity\": \"low\",\n      \"fact\": \"rm/mv/unlink on files inside the connected project folder fail with 'Operation not permitted' by default.\",\n      \"workaround\": \"Call mcp__cowork__allow_cowork_file_delete on the path once; deletion then works for the rest of the session for that path/folder.\"\n    }\n  ],\n  \"still_open_from_previous_handoffs\": {\n    \"ref\": \"sessions/handoff-2026-06-30.json\",\n    \"note\": \"None of that file's 8 tasks (task-refresh-lockfile, task-migration-006, task-migration-007, task-verify-bootstrap, task-first-crawl, task-index-docs, task-a2a-executor, task-repo-fmt-debt) were touched this session -- all Rust/Postgres/docs-crawl work, unrelated to this session's TypeScript/Wrangler/plugin scope. Presumed still pending; re-verify status rather than trusting this note indefinitely.\"\n  },\n  \"tasks\": [\n    {\n      \"id\": \"task-vendor-indexer-run\",\n      \"content\": \"Run indexer over vendor repos (crates/indexer walks .vendors.toml repos -> fact_filesystem + dim_file_ast)\",\n      \"priority\": \"medium\",\n      \"status\": \"pending\",\n      \"kind\": { \"type\": \"shell_command\", \"command\": \"cargo run -p indexer -- --all\" }\n    },\n    {\n      \"id\": \"task-switch-cowork-profile\",\n      \"content\": \"Switch Claude Desktop to the cowork profile (surface macos__desktop_cowork__engineering_coworker)\",\n      \"priority\": \"low\",\n      \"status\": \"pending\",\n      \"kind\": { \"type\": \"shell_command\", \"command\": \"bash profiles/switch-profile.sh cowork\" },\n      \"notes\": \"Requires building the engineering-coworker binary first: cargo build -p engineering-coworker\"\n    },\n    {\n      \"id\": \"task-refresh-oauth-token\",\n      \"content\": \"Refresh CLAUDE_CODE_OAUTH_TOKEN if expired\",\n      \"priority\": \"low\",\n      \"status\": \"pending\",\n      \"kind\": { \"type\": \"shell_command\", \"command\": \"claude auth login\" },\n      \"notes\": \"Conditional -- only needed if the current token has actually expired.\"\n    }\n  ],\n  \"model_notes\": {\n    \"fable_5\": {\n      \"summary\": \"Released 2026-06-09 alongside Mythos 5 (same underlying model; Fable 5 shipped with much stronger safeguards for general use, Mythos 5 with fewer safeguards to a small set of trusted Project Glasswing partners for defensive cybersecurity). Both hit US export controls 2026-06-12 after Amazon researchers found a technique prompting Fable 5 to identify software vulnerabilities (in one case, produce exploit code). Testing showed weaker models (incl. Opus 4.8, GPT-5.5, Kimi K2.7, and for the single-exploit case even Haiku 4.5/Sonnet 4.6/Opus 4.6/4.7) could reproduce the same outputs, so this was judged a borderline safety-margin gap, not a unique Mythos-level capability leak. Controls lifted 2026-06-30. Fable 5 redeploys 2026-07-01 (today) across Claude Platform, Claude.ai, Claude Code, and Claude Cowork. A new safety classifier blocks the specific reported technique in >99% of cases; blocked Fable-5 requests are auto-routed to Opus 4.8 instead of just refusing. Expect more false-positive blocks on routine coding/debugging while the classifier is refined. Pro/Max/Team/select-Enterprise: up to 50% of weekly usage limits through 2026-07-07, then usage credits; standard Enterprise seats need usage credits enabled or Fable 5 won't work at all.\",\n      \"source\": \"https://www.anthropic.com/news/redeploying-fable-5\"\n    },\n    \"claude_managed_agents\": {\n      \"summary\": \"Beta hosted agent harness (`managed-agents-2026-04-01` beta header required), a separate product from Claude Cowork (what this session runs in). Core concepts: Agent (model+prompt+tools+MCP+skills), Environment (Anthropic cloud sandbox or self-hosted), Session (running instance), Events. Explicitly stateful: sessions are long-running and 'resume cleanly after pauses', with conversation history/sandbox state/outputs persisted server-side -- the closest existing Anthropic product concept to 'resuming a session across a gap'. Not eligible for Zero Data Retention or HIPAA BAA because of that persistence. Relevant if a future session wants to move the 6h crawl cycle or ETL pipeline off Cloudflare Cron Triggers onto a hosted async agent instead.\",\n      \"source\": \"https://platform.claude.com/docs/en/managed-agents/overview\"\n    },\n    \"claude_tag\": {\n      \"summary\": \"'@Claude' -- a persistent, admin-governed AI teammate embedded in Slack, one shared instance per channel, runs in an ephemeral Anthropic-hosted sandbox, works with Opus 4.8. Could plausibly be used later for Slack alerts on crawl/deploy failures for this repo, but nothing wired up this session.\",\n      \"source\": \"https://www.anthropic.com/news/introducing-claude-tag\"\n    },\n    \"office_agents\": {\n      \"summary\": \"Resolved after initial searches turned up only adjacent products: 'Office Agents' is an admin-settings toggle within Claude for Microsoft 365 that enables cross-app context sharing -- e.g. a Word agent and an Excel agent share one conversation thread so Claude can pull live spreadsheet data while drafting a doc or building slides, without the user re-explaining context per app. Shipped 2026-03-11. Not directly relevant to this repo (no Microsoft 365 surface here); researched only because the user explicitly asked for it.\",\n      \"source\": \"https://thenewstack.io/claude-word-excel-powerpoint-outlook-microsoft-office/ and https://amitkoth.com/claude-office-agents-explained/\"\n    }\n  },\n  \"enum_reference\": {\n    \"task_status\": [\"pending\", \"in_progress\", \"completed\", \"cancelled\"],\n    \"task_priority\": [\"high\", \"medium\", \"low\"],\n    \"task_kind_type\": [\"todo\", \"crawl_board\", \"evict_stale\", \"deploy\", \"migration\", \"git_push\", \"code_review\", \"sub_task\", \"shell_command\"]\n  },\n  \"operating_rules\": [\n    \"Develop on a fresh branch off origin/main; never push to main.\",\n    \"Push, then open a ready-for-review PR; check for a PR template first.\",\n    \"End commit messages with the Co-Authored-By + Claude-Session trailers (chat-only; never reference the model id in committed artifacts).\",\n    \"GitHub access is scoped to opencoworkers/subagentjobs only; use mcp__github__* tools (no gh CLI).\",\n    \"Deploys in this environment require the Desktop Commander MCP against the user's real Mac -- see environment_constraints_new_this_session.deploy-requires-desktop-commander.\"\n  ]\n}\n",
    "created_at": "2026-07-02 02:06:38"
  }
}