Skip to content

docs(journal): make project attribution mandatory effort, tag conditional output#212

Merged
KadenMc merged 1 commit into
mainfrom
docs/journal-conditional-project-tag
Jun 26, 2026
Merged

docs(journal): make project attribution mandatory effort, tag conditional output#212
KadenMc merged 1 commit into
mainfrom
docs/journal-conditional-project-tag

Conversation

@KadenMc

@KadenMc KadenMc commented Jun 26, 2026

Copy link
Copy Markdown
Owner

What

Reworks the journal-update tagging rule in journal/update-directions. Previously every Log entry had to carry a #projects/<slug> prefix, with a fake #projects/unknown slug as the fallback for unattributable activity. That placeholder masquerades as a real project and pollutes the #projects/* namespace.

Why

A single "MUST tag every entry" rule conflated two different jobs. This splits them:

  • Attribution stays mandatory effort — every entry must still attempt resolution via project_list + aliases.
  • The tag is conditional output — emitted only on a genuine match, using the canonical registry slug (not an alias). After an attempted-and-failed match the entry is left untagged; no placeholder slug.
  • Omissions are surfaced at approval ("N entries I couldn't attribute: ...") so they stay visible and auditable, never silent.

This preserves the anti-laziness pressure of the old rule (the agent still has to do the attribution work) while killing the bogus-slug failure mode.

Also fixes the worked example to use the canonical #projects/ecg-inquiry instead of the electricrag alias.

Scope

Knowledge-store edit to journal/update-directions only. No code changejournal.py never enforced the tag; the rule lives entirely as directions prose. docs_validate passes clean (434 units, all 14 checks).

Verification

A blind behavioral test (a naive agent given only the new directions, with no hint of the expected outcome) confirmed the intended behavior end to end:

  • attributed entries tagged with the canonical slug (electricrag#projects/ecg-inquiry),
  • a genuine non-project life event (an evening meditation sit) left untagged and flagged at approval, rather than stamped #projects/unknown.

…onal output

Journal Log entries previously had to carry a #projects/<slug> prefix on
every line, with a fake #projects/unknown slug as the fallback when an
activity could not be attributed. That placeholder masquerades as a real
project and pollutes the #projects/* namespace.

Separate the two jobs that single rule conflated:

- Attribution stays mandatory EFFORT: every entry must still attempt
  resolution via project_list + aliases.
- The tag is conditional OUTPUT: emitted only on a genuine match, using
  the canonical registry slug (not an alias). After an attempted-and-failed
  match the entry is left untagged - no placeholder slug.
- Omissions are surfaced at approval ("N entries I couldn't attribute: ...")
  so they stay visible and auditable, never silent.

Also fixes the worked example to use the canonical #projects/ecg-inquiry
instead of the electricrag alias.

Knowledge-store edit to journal/update-directions only; no code change
(journal.py never enforced the tag). docs_validate passes clean (434 units,
all checks). Blind behavioral test of a naive agent against the new
directions confirmed correct behavior: attributed entries tagged with the
canonical slug, a non-project life event left untagged and flagged at
approval rather than stamped #projects/unknown.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Kaden McKeen <mckeenkaden@gmail.com>
@KadenMc KadenMc merged commit 0e1e6d9 into main Jun 26, 2026
2 checks passed
@KadenMc KadenMc deleted the docs/journal-conditional-project-tag branch June 26, 2026 23:44
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