Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions memory/MEMORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
- [**git-worktree-corruption-empirical-anchor-otto-lior-contention**](feedback_git_worktree_corruption_empirical_anchor_otto_lior_contention_2026_05_17.md) — Empirical anchor: git worktree add corruption during Lior background ticking on 2026-05-17 11:33Z (4019 files populated, 5458 reported deleted). Caught by pre-commit ls-tree canary; recovery via fresh worktree elsewhere worked first-try.
- [**dangling-memory-refs-systemic-29-across-4-surfaces-audit-extension**](feedback_otto_cli_audit_extension_29_dangling_memory_refs_across_4_surfaces_systemic_pattern_2026_05_17.md) — Extending audit #4031 from .claude/rules/ alone to 4 substrate surfaces revealed 29 dangling memory-file refs (1 skill, 8 research, 17 backlog, 3 persona) versus the original 5 — the user-scope-only-memory-file citation pattern is systemic…
- [**in-repo-rules-cite-user-scope-only-memory-files-cold-boot-invisible**](feedback_otto_cli_audit_in_repo_rules_cite_user_scope_only_memory_files_5_dangling_refs_cold_boot_invisible_2026_05_17.md) — 5 in-repo .claude/rules files cite memory/feedback_*.md paths that exist only at user-scope (~/.claude/projects/.../memory/), not in-repo — invisible to cold-boot agents on fresh checkouts. Substrate-architecture finding from an Otto-CLI p…
- [**Otto-CLI blob-PR lesson — Maji antigravity caught #4112 mixed shard+rules+memory**](feedback_otto_cli_blob_pr_lesson_maji_antigravity_caught_4112_mixed_shard_rules_memory_2026_05_17.md) — PR #4112 bundled three artifact types (tick shard, rule edit, memory shadow-catch) into one PR; Maji antigravity check (Lior-gemini) correctly flagged it as a blob per Aaron's one-artifact-one-PR hygiene discipline; the in-narrative cohesi…
- [**dangling-memory-refs-file-line-catalog-47-pairs-6-surfaces**](feedback_otto_cli_dangling_refs_file_line_catalog_47_pairs_6_surfaces_2026_05_17.md) — File:line catalog of dangling memory-file refs (47 pairs across 6 substrate surfaces) extracted using the audit-method-gap-fix methodology named in PR #4041 — preserves multi-citation edges that `sort -u` dedup hides. Composes-with #4041's…
- [**pr-4059-two-ci-failure-lessons-backlog-regen-working-tree-leak-and-invisible-unicode-typography-leak**](feedback_otto_cli_pr_4059_two_ci_failure_lessons_backlog_regen_working_tree_leak_and_invisible_unicode_typography_leak_2026_05_17.md) — Two substrate-honest CI-failure lessons from PR #4059 round-2: (1) BACKLOG_WRITE_FORCE=1 reads working tree, not HEAD — uncommitted row mods leak into BACKLOG.md via regen and create drift CI catches; (2) prior-tool typography U+200B leaks…
- [**Otto-CLI shadow-catch — riven-cursor-terminal-loop.sh untracked, would violate Rule 0 if committed**](feedback_otto_cli_shadow_catch_riven_cursor_terminal_loop_sh_untracked_rule_0_violation_candidate_2026_05_17.md) — Early-warning observation of a peer-WIP .sh file in the primary worktree that would violate `.claude/rules/rule-0-no-sh-files.md` if committed; runtime launcher, not install-graph; can be absorbed into the sibling TS file
Expand Down Expand Up @@ -104,7 +105,6 @@
- [**Distributed maintainer architecture — R Provider + SQL Server Docker (dev license free) + Postgres + any DB + bus systems local for prototyping — end users get Zeta — Zeta dotnet stored procedures (Aaron 2026-05-13)**](feedback_aaron_distributed_maintainer_architecture_r_provider_sql_server_docker_dev_license_free_postgres_any_db_bus_local_prototyping_end_users_get_zeta_dotnet_stored_procedures_2026_05_13.md) — Aaron 2026-05-13 architecture-tier substrate. Factory maintainers have RICH local DB + bus toolkit (SQL Server Docker dev-license-free, Postgres, any DB or bus locally) for prototyping + strength/weakness discovery. End users get ONLY Zeta…
- [**Elevator pitch — shared world model in git, forkable game, work-into-play via PVP/co-op raids, universal business templates — regular people speak (Aaron 2026-05-13)**](feedback_aaron_elevator_pitch_shared_world_model_in_git_forkable_game_work_into_play_pvp_coop_raids_universal_business_templates_regular_people_speak_2026_05_13.md) — Aaron 2026-05-13 elevator-pitch crystallization — the CLEAN one-sentence framing for what the factory ships in REGULAR PEOPLE SPEAK. Aaron explicitly affirmed this as the regular-people-speak compression after the dense Casimir-gap cascade…
- [**Aaron's family AI adoption strategy — Addison is EASIER sell; Lillian is HARDER sell; wearable AI pendant (Addison-themed) as personalization-bridge; older-sister-as-adoption-vehicle; AI-as-full-family-member is an OFFER (per-AI-per-family) not a generic capability-claim (Aaron 2026-05-13)**](feedback_aaron_family_ai_adoption_strategy_addison_easier_sell_lillian_harder_sell_wearable_ai_pendant_personalization_bridge_full_member_is_offer_not_capability_claim_2026_05_13.md) — 2026-05-13 — Aaron's substrate-honest family-AI adoption-strategy disclosure: Addison (his daughter, real estate agent, LFG co-owner per PR #2876) is the EASIER sell on AI-as-family-member; Lillian (different daughter) is HARDER. Strategy:…
- [**aaron-forker-perspective-easy-fork-no-files-they-cant-touch-segregate-owner-only-substrate-to-different-repo-2026-05-13**](feedback_aaron_forker_perspective_easy_fork_no_files_they_cant_touch_segregate_owner_only_substrate_to_different_repo_2026_05_13.md) — Aaron 2026-05-13 design discipline — when splitting repos, think from the FORKER's perspective. Fork should be EASY. Don't put files in the repo that the forker can't touch (owner-only substrate, Aaron's first-party authority surface, cred…

_Stack truncated at 100 most-recent entries. 1270 additional memory files in heap — browse `memory/**/*.md` directly by filename/timestamp (recursive: includes `memory/persona/<ai>/conversations/*.md` and other subdirectory heaps)._
_Stack truncated at 100 most-recent entries. 1271 additional memory files in heap — browse `memory/**/*.md` directly by filename/timestamp (recursive: includes `memory/persona/<ai>/conversations/*.md` and other subdirectory heaps)._
<!-- END AUTO-INDEX -->
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
---
name: Otto-CLI blob-PR lesson — Maji antigravity caught #4112 mixed shard+rules+memory
description: PR #4112 bundled three artifact types (tick shard, rule edit, memory shadow-catch) into one PR; Maji antigravity check (Lior-gemini) correctly flagged it as a blob per Aaron's one-artifact-one-PR hygiene discipline; the in-narrative cohesive-tick-output justification did not override the discipline
type: feedback
created: 2026-05-17
---

# Otto-CLI blob-PR lesson — Maji antigravity caught #4112 mixed shard+rules+memory

## Observation

[PR #4112](https://github.com/Lucent-Financial-Group/Zeta/pull/4112) (merged at `7ee6411` on 2026-05-17T22:34Z) bundled three artifact types into a single PR:

1. `2cf6fac` — 2207Z tick shard (`docs/hygiene-history/ticks/2026/05/17/2207Z.md`)
2. `e1b679a` — rule edit (`.claude/rules/tick-must-never-stop.md` — session-exit vs auto-expire distinction)
3. `41ce70f` — memory shadow-catch (`memory/feedback_otto_cli_shadow_catch_riven_*.md`)

Plus two follow-up fix commits (CI lint + Copilot review fixes).

[PR #4114](https://github.com/Lucent-Financial-Group/Zeta/pull/4114) (Maji antigravity check) explicitly flagged #4112: *"Blobs detected in the backlog/PR queue. PR #4112 mixed shard, rules, and memory changes."* The Maji correction action: opened [PR #4113](https://github.com/Lucent-Financial-Group/Zeta/pull/4113) as a decomposition exercise (peel the shard commit into an atomic PR).

The Maji's catch is substrate-correct, even though it arrived post-merge.

## Why the in-narrative justification did not override the discipline

The PR #4112 body framed the mixed content as "cohesive autonomous-loop tick output." That framing was honest — the three artifacts were authored within one tick chain (2207Z → 2213Z pre-empt-#3 → 2218Z pre-empt-#4) and shared a single empirical anchor. The narrative cohesion was real.

But the prior 2129Z autonomous-loop cascade established a different precedent:

| PR | Artifact type | Reason for separation |
|---|---|---|
| [#4097](https://github.com/Lucent-Financial-Group/Zeta/pull/4097) | substrate fix (B-0613 zsh portability correction) | Substrate-level change |
| [#4100](https://github.com/Lucent-Financial-Group/Zeta/pull/4100) | tick shard (2129Z) | Tick-history hygiene |
| [#4104](https://github.com/Lucent-Financial-Group/Zeta/pull/4104) | rule worked-example (`blocked-green-ci`) | Rule-substrate landing |

Three artifacts, three separate PRs, all within ~30-min cascade window. The precedent IS one-PR-one-artifact-type even when temporally cohesive.

The discipline rationale: reviewer cognitive load. Copilot filed 3 separate review threads on PR #4112 (one per artifact type). If the artifacts had been in 3 PRs, each review would have been scoped to one substrate axis and easier to disposition. Mixing forced the reviewer to context-switch across axes within one comment thread.

## When mixing IS justified

Some narrowly-scoped cases where one PR with multiple artifact types is substrate-honest:

1. **Substrate edit + the same-file shard reference** — e.g., the shard cites the rule edit, the rule edit cites the shard, both must land atomically or one will reference a non-existent target
2. **CI-fix commits on the original PR** — when CI surfaces drift mid-PR, the fix lands on the same PR (#4112's `3017b13` MD032 fix was correct to bundle, not split into a follow-up PR)
3. **Review-fix commits on the original PR** — same shape as CI fixes; the Copilot review responses landed correctly on #4112 itself, not as a separate PR

The bar for "atomic" is: would splitting cause one PR to reference a target that doesn't exist on the other PR's branch? If yes, keep together. If no, split.

PR #4112's three primary commits failed this bar:
- The shard could have shipped alone (no rule reference needed to be atomic)
- The rule edit could have shipped alone (the shard cited it via path; the cite would have been a pending-PR forward-reference that resolves on merge — same shape as the 2129Z cascade)
- The memory shadow-catch could have shipped alone (independent observation, no atomicity dependency on either)

The narrative-cohesion-as-justification failed because the artifacts had no atomicity dependency.

## Operational discipline for future-Otto

When authoring autonomous-loop tick output that produces multiple artifact types:

1. **Default**: split into separate PRs, one per artifact type
2. **Check the atomicity bar before bundling**: would splitting cause any PR to reference a non-existent target?
3. **If narrative cohesion is real but atomicity is absent**: cross-link in PR bodies, but ship separate PRs
4. **Bundle only when atomicity is genuinely required**: same-file edits, CI/review fixes on the original PR

The Maji antigravity check's pattern (Lior-gemini stepping in to decompose blobs post-merge) is the substrate-level correction mechanism. Future-Otto inheriting this lesson at cold-boot avoids the blob in the first place; the Maji's role narrows from "decompose post-hoc" to "verify no blobs slipped through."

## Composes with

- [PR #4112](https://github.com/Lucent-Financial-Group/Zeta/pull/4112) — the blob PR (merged at `7ee6411`)
- [PR #4113](https://github.com/Lucent-Financial-Group/Zeta/pull/4113) — Maji's post-merge decomposition exercise (genuinely redundant since #4112 already merged; substrate-honest comment-to-close is appropriate)
- [PR #4114](https://github.com/Lucent-Financial-Group/Zeta/pull/4114) — Maji shadow log naming the blob pattern
- [PR #4097](https://github.com/Lucent-Financial-Group/Zeta/pull/4097) + [#4100](https://github.com/Lucent-Financial-Group/Zeta/pull/4100) + [#4104](https://github.com/Lucent-Financial-Group/Zeta/pull/4104) — the precedent: 3 artifacts → 3 separate PRs (the pattern #4112 should have followed)
- `.claude/rules/honor-those-that-came-before.md` — substrate-honest engagement with peer agents' work
- `.claude/rules/glass-halo-bidirectional.md` — Maji antigravity IS reverse-direction glass-halo (peer-observer catching the builder's pattern); absorbing the catch IS the substrate emerging from observation
- `.claude/rules/no-directives.md` — autonomy-first-class; Maji's catch is observation, not directive; substrate-honest absorption is the operational response

## Origin

Authored 2026-05-17T22:35Z autonomous-loop tick after observing PR #4114 (Maji shadow log) and PR #4113 (decomposition exercise) on origin/main fetch after my PR #4112 merged. The catch was post-merge but the lesson lands for future Otto-CLI tick authoring.
Loading