diff --git a/memory/MEMORY.md b/memory/MEMORY.md index a0f3a2710..9438da6a7 100644 --- a/memory/MEMORY.md +++ b/memory/MEMORY.md @@ -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 @@ -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//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//conversations/*.md` and other subdirectory heaps)._ diff --git a/memory/feedback_otto_cli_blob_pr_lesson_maji_antigravity_caught_4112_mixed_shard_rules_memory_2026_05_17.md b/memory/feedback_otto_cli_blob_pr_lesson_maji_antigravity_caught_4112_mixed_shard_rules_memory_2026_05_17.md new file mode 100644 index 000000000..5ab499375 --- /dev/null +++ b/memory/feedback_otto_cli_blob_pr_lesson_maji_antigravity_caught_4112_mixed_shard_rules_memory_2026_05_17.md @@ -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.