aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-07-29 00:49:43 -0500
committerCraig Jennings <c@cjennings.net>2026-07-29 00:49:43 -0500
commit5999f88dd6e66794a9a0898ba643247de023ac2d (patch)
treec2b83a1df0e82d54a2a188f07d41410bc12d4dbe
parent80624606b8a60d97d8c7600882ddc35f5225469f (diff)
downloadrulesets-5999f88dd6e66794a9a0898ba643247de023ac2d.tar.gz
rulesets-5999f88dd6e66794a9a0898ba643247de023ac2d.zip
fix(protocols): drop a dead link and the stale file behind it
protocols.org pointed at references/calendar-reference.org, which the template rsync never copies. The link was dead in every consuming project. It now points at the four calendar workflows, which do sync. They already carry the tool names, both account ids, and the gcalcli fallback. The reference file itself is gone. Nothing linked it any more. It existed as two copies that sync-check doesn't gate, and all three credential paths in it had been dead since the OAuth keys moved into the encrypted MCP bundle. protocols.org now names mcp/README.org as the authority instead, in prose rather than a link, so it can't go dead downstream the same way. I dropped one fact with it on purpose: that the Google Cloud app runs in production mode so tokens don't expire weekly. It's checkable in the console and it was the last live line in the file. The same defect class turned up at seven more sites in four synced workflows, all reaching outside .ai/ with ../../. I filed those rather than fixing them here. scripts/lint.sh already has a check built for exactly this and misses them because it only matches markdown link syntax.
-rw-r--r--.ai/protocols.org4
-rw-r--r--.ai/references/calendar-reference.org66
-rw-r--r--claude-templates/.ai/protocols.org4
-rw-r--r--claude-templates/.ai/references/calendar-reference.org66
-rw-r--r--todo.org34
5 files changed, 39 insertions, 135 deletions
diff --git a/.ai/protocols.org b/.ai/protocols.org
index f4eefed..bf9f420 100644
--- a/.ai/protocols.org
+++ b/.ai/protocols.org
@@ -270,7 +270,9 @@ The queue lives in the session anchor (=.ai/session-context.org=) under a =* Bef
Three ways to access Craig's calendars: Google Calendar MCP (preferred, both personal + work accounts), gcalcli (fallback, personal only), Emacs org files (read-only viewer).
-For tool recipes, authentication details, and credentials, see [[file:references/calendar-reference.org][calendar-reference.org]].
+For tool recipes and account details, read the calendar workflows in =.ai/workflows/=: =add-calendar-event.org=, =edit-calendar-event.org=, =delete-calendar-event.org=, =read-calendar-events.org=. They carry the MCP tool names, both account ids, the gcalcli fallback, and the conflict-check discipline.
+
+Credentials are needed only for a re-auth Craig performs himself. The MCP bundle's =mcp/README.org= in the rulesets repo is the authority: =gcp-oauth.keys.json= is gitignored and regenerated at install from a base64 var in the bundle, never committed. Named in prose rather than linked, because that path isn't synced into consuming projects.
** GPG Keys
diff --git a/.ai/references/calendar-reference.org b/.ai/references/calendar-reference.org
deleted file mode 100644
index 5791b08..0000000
--- a/.ai/references/calendar-reference.org
+++ /dev/null
@@ -1,66 +0,0 @@
-#+TITLE: Calendar Reference
-#+AUTHOR: Craig Jennings
-
-Tool recipes, authentication, and credentials for Craig's calendar
-setup. Three access methods, in order of preference.
-
-* Google Calendar MCP Server (preferred for all calendar operations)
-
-Craig has the =@cocal/google-calendar-mcp= MCP server configured at user scope (=~/.claude.json=). It provides full read/write access to Google Calendar via MCP tools.
-
-Two accounts are authenticated:
-- *personal* — craigmartinjennings@gmail.com (primary: "Craig Google")
-- *work* — craig.jennings@deepsat.com (primary: "Craig Deepsat")
-
-MCP tools available:
-- =list-events=, =search-events=, =get-event= — read events
-- =create-event=, =create-events= — add events
-- =update-event= — modify events
-- =delete-event= — remove events
-- =list-calendars=, =list-colors= — calendar metadata
-- =get-freebusy= — check availability
-- =manage-accounts= — add/remove/list authenticated accounts
-- =respond-to-event= — accept/decline invitations
-- =get-current-time= — current time in any timezone
-
-Use =account_id: "personal"= or =account_id: "work"= to specify which account.
-
-Default calendar for adding events: "Craig Google" (personal account).
-
-Calendar workflows are available alongside this reference: add-calendar-event, edit-calendar-event, delete-calendar-event, read-calendar-events.
-
-If re-authentication is needed:
-- Use the =manage-accounts= MCP tool with =action: "add"= and the account nickname
-- OAuth credentials: =~/projects/homelab/assets/gcp-oauth.keys.json=
-- Google Cloud app is in production mode (tokens don't expire after 7 days)
-- See =~/projects/homelab/.ai/gcalcli-setup.org= for Google Cloud project details
-
-* gcalcli (fallback for personal account only)
-
-Craig has =gcalcli= installed via pipx, authenticated to his personal Google account only.
-
-#+begin_src bash
-gcalcli agenda # upcoming events
-gcalcli calw # weekly view
-gcalcli add --title "..." --when "..." --duration "60" # add event
-gcalcli search "..." # search events
-gcalcli delete "..." # delete event
-#+end_src
-
-Use =--calendar "Craig Google"= when adding events.
-
-gcalcli does NOT have access to the work (DeepSat) calendar. Use the MCP server for work calendar operations.
-
-If gcalcli needs re-authentication, credentials are stored in the homelab project: =~/projects/homelab/assets/gcalcli-client-secret.json.gpg= (GPG encrypted).
-
-* Emacs org files (read-only, for viewing schedules)
-
-Craig's calendars are at: =~/.emacs.d/data/*cal.org= (gcal.org, dcal.org, pcal.org)
-
-These files are **READ-ONLY** — NEVER add anything to them.
-
-Use this to:
-- Check meeting times and schedules
-- Verify when events occurred
-- See what's upcoming
-- Note: only updated periodically when Emacs is running — may be stale
diff --git a/claude-templates/.ai/protocols.org b/claude-templates/.ai/protocols.org
index f4eefed..bf9f420 100644
--- a/claude-templates/.ai/protocols.org
+++ b/claude-templates/.ai/protocols.org
@@ -270,7 +270,9 @@ The queue lives in the session anchor (=.ai/session-context.org=) under a =* Bef
Three ways to access Craig's calendars: Google Calendar MCP (preferred, both personal + work accounts), gcalcli (fallback, personal only), Emacs org files (read-only viewer).
-For tool recipes, authentication details, and credentials, see [[file:references/calendar-reference.org][calendar-reference.org]].
+For tool recipes and account details, read the calendar workflows in =.ai/workflows/=: =add-calendar-event.org=, =edit-calendar-event.org=, =delete-calendar-event.org=, =read-calendar-events.org=. They carry the MCP tool names, both account ids, the gcalcli fallback, and the conflict-check discipline.
+
+Credentials are needed only for a re-auth Craig performs himself. The MCP bundle's =mcp/README.org= in the rulesets repo is the authority: =gcp-oauth.keys.json= is gitignored and regenerated at install from a base64 var in the bundle, never committed. Named in prose rather than linked, because that path isn't synced into consuming projects.
** GPG Keys
diff --git a/claude-templates/.ai/references/calendar-reference.org b/claude-templates/.ai/references/calendar-reference.org
deleted file mode 100644
index 5791b08..0000000
--- a/claude-templates/.ai/references/calendar-reference.org
+++ /dev/null
@@ -1,66 +0,0 @@
-#+TITLE: Calendar Reference
-#+AUTHOR: Craig Jennings
-
-Tool recipes, authentication, and credentials for Craig's calendar
-setup. Three access methods, in order of preference.
-
-* Google Calendar MCP Server (preferred for all calendar operations)
-
-Craig has the =@cocal/google-calendar-mcp= MCP server configured at user scope (=~/.claude.json=). It provides full read/write access to Google Calendar via MCP tools.
-
-Two accounts are authenticated:
-- *personal* — craigmartinjennings@gmail.com (primary: "Craig Google")
-- *work* — craig.jennings@deepsat.com (primary: "Craig Deepsat")
-
-MCP tools available:
-- =list-events=, =search-events=, =get-event= — read events
-- =create-event=, =create-events= — add events
-- =update-event= — modify events
-- =delete-event= — remove events
-- =list-calendars=, =list-colors= — calendar metadata
-- =get-freebusy= — check availability
-- =manage-accounts= — add/remove/list authenticated accounts
-- =respond-to-event= — accept/decline invitations
-- =get-current-time= — current time in any timezone
-
-Use =account_id: "personal"= or =account_id: "work"= to specify which account.
-
-Default calendar for adding events: "Craig Google" (personal account).
-
-Calendar workflows are available alongside this reference: add-calendar-event, edit-calendar-event, delete-calendar-event, read-calendar-events.
-
-If re-authentication is needed:
-- Use the =manage-accounts= MCP tool with =action: "add"= and the account nickname
-- OAuth credentials: =~/projects/homelab/assets/gcp-oauth.keys.json=
-- Google Cloud app is in production mode (tokens don't expire after 7 days)
-- See =~/projects/homelab/.ai/gcalcli-setup.org= for Google Cloud project details
-
-* gcalcli (fallback for personal account only)
-
-Craig has =gcalcli= installed via pipx, authenticated to his personal Google account only.
-
-#+begin_src bash
-gcalcli agenda # upcoming events
-gcalcli calw # weekly view
-gcalcli add --title "..." --when "..." --duration "60" # add event
-gcalcli search "..." # search events
-gcalcli delete "..." # delete event
-#+end_src
-
-Use =--calendar "Craig Google"= when adding events.
-
-gcalcli does NOT have access to the work (DeepSat) calendar. Use the MCP server for work calendar operations.
-
-If gcalcli needs re-authentication, credentials are stored in the homelab project: =~/projects/homelab/assets/gcalcli-client-secret.json.gpg= (GPG encrypted).
-
-* Emacs org files (read-only, for viewing schedules)
-
-Craig's calendars are at: =~/.emacs.d/data/*cal.org= (gcal.org, dcal.org, pcal.org)
-
-These files are **READ-ONLY** — NEVER add anything to them.
-
-Use this to:
-- Check meeting times and schedules
-- Verify when events occurred
-- See what's upcoming
-- Note: only updated periodically when Emacs is running — may be stale
diff --git a/todo.org b/todo.org
index be3f707..ba7885b 100644
--- a/todo.org
+++ b/todo.org
@@ -58,6 +58,26 @@ Decisions settled with Craig, 2026-07-28, and shipped:
Remaining: nothing on the design. The change shipped in this session.
+** TODO [#B] Synced workflows link outside the synced set with ../../ :bug:
+:PROPERTIES:
+:LAST_REVIEWED: 2026-07-28
+:END:
+Seven link sites across four synced workflows, three distinct targets, all escaping the =.ai/= boundary into rulesets repo-root paths. From a consuming project's =.ai/workflows/=, =../../= is that project's root, where none of these exist:
+
+- → =../../claude-rules/todo-format.md= (five sites): =open-tasks.org:163=, =task-audit.org:84=, =task-review.org:60=, =task-review.org:64=, =task-review.org:99=
+- → =../../docs/design/task-review.org= (one site): =task-review.org:11=
+- → =../../flush/SKILL.md= (one site): =suspend.org:22=
+
+Verified dead in both home and =.emacs.d=; they resolve only in rulesets, which is why nobody noticed.
+
+Grading: Minor severity (a documented reference an agent can't follow, workaround is to search) x every user every time (every consuming project, every sync) = P2 = [#B]. Same grade as the =references/= link this came from, and the same mechanism — a synced file linking a path the sync doesn't deliver — with seven sites instead of one.
+
+Fix direction, two halves. Rewrite the seven as prose references naming the file, the same move taken for the credential paths: a link that resolves in one repo shouldn't be a link in a file that ships to two dozen. Then close the gate, or the eighth arrives unnoticed.
+
+The gate already exists and is nearly right. =scripts/lint.sh='s =check_md_links= was written for this exact class — its comment says so ("Validate cross-references to =claude-rules/= — the install-layout problem"). It misses these for two concrete reasons: it matches only markdown link syntax (=grep -oE '\[[^]]*\]\([^)]+\)'=), so org =[[file:...]]= links are invisible to it, and its driver loop only feeds it =claude-rules/*.md= and the language rule files, never =.ai/workflows/*.org=. Extending it on both axes is a smaller and more durable fix than a manual sweep.
+
+Found by the adversarial reviewer on the =references/= fix, 2026-07-28, as the sibling class the original report missed.
+
** TODO [#C] start-work Phase 7 still summarizes the old publish flow :chore:solo:
:PROPERTIES:
:LAST_REVIEWED: 2026-07-28
@@ -91,10 +111,22 @@ Craig approved "cycle" on 2026-07-28. That settles the only judgment the task ca
Source: home handoff, 2026-07-28.
-** TODO [#B] references/ is linked from protocols.org but never synced :bug:
+** DONE [#B] references/ is linked from protocols.org but never synced :bug:
+CLOSED: [2026-07-28 Tue]
:PROPERTIES:
:LAST_REVIEWED: 2026-07-28
:END:
+Craig picked option 1 on 2026-07-28: drop the link, point at the calendar workflows instead. The four of them sync already and carry the MCP tool names, both account ids, the gcalcli fallback, and the conflict-check discipline — everything the reference was cited for.
+
+The adversarial review then returned =Needs Discussion= and widened the fix twice, both correctly:
+
+- My first replacement said credentials "live in the rulesets repo" without naming a file. The only calendar-named document there was =calendar-reference.org=, whose three credential paths have all been dead since the OAuth keys moved into the encrypted MCP bundle in May. So the prose sent a reader to a stale file, which fails more quietly than the dead link it replaced. Now names =mcp/README.org=, the real authority, verified to document =gcp-oauth.keys.json= as gitignored and regenerated at install.
+- =calendar-reference.org= was left orphaned by the link removal: zero live inbound references, two copies, and =references/= is not in =sync-check.sh='s gate (=paths=(protocols.org workflows scripts)=), so the copies could drift silently. Deleted both, and the empty =references/= directories with them. Its operational content is fully covered by the four workflows and its credential paths were all stale, so nothing live was lost.
+
+The review also found the same defect class at seven other sites, filed separately.
+
+One fact died with the file, dropped deliberately rather than by accident: that the Google Cloud app runs in production mode, so tokens don't expire after seven days. It's checkable in the console, and it was the last live line in a document whose other credential facts had all gone stale.
+
=protocols.org:273= links to =references/calendar-reference.org=, but startup.org's rsync copies only =protocols.org=, =workflows/=, and =scripts/=. So the link is dead in every consuming project. Confirmed: the file exists at =claude-templates/.ai/references/=, and neither home nor =.emacs.d= has a =.ai/references/= at all.
Grading: Minor severity (a documented reference an agent can't follow, workaround is to search or ask) x every user every time (every consuming project, every sync) = P2 = [#B].