Operations 26w35

monkey-id
Operations 26w35

This session is for operational work during this week. Address (monkey-task-context) items directly, one subheading in the NOTE is for one item.

Fix mapping-pipeline deployment due to SSM parameter

https://github.com/FindHotel/mapping-pipeline/actions/runs/32779045038/job/97599196109

Fix Dependabot failure in content-pipeline

https://github.com/FindHotel/content-pipeline/actions/runs/32709801786/job/97378566903

Fix content-pipeline deployment due to SSM parameter

Same as above for mapping-pipeline.

This parameter should not be used, part of Migrate Content system to Keypair auth in Snowflake. Check that it is not in use and remove the whole parameter.

Remove pagerduty SSM parameters from mapping-pipeline
wt
(◊git-status "~/.wt/mapping-pipeline_remove-pagerduty-parameters")
PR
Remove unused SSM parameters ⋅ mapping-pipeline#2070
AWS_PROFILE=fh-meta AWS_REGION=eu-west-1 \
aws ssm describe-parameters --page-size 50 | gron | grep Name | grep sovitin | grep pagerduty
Remove cms-update-hotel

With migration to OPUS, (◊grep 'content-pipeline "cms-update-hotel") is probably no longer needed - it calls Hotel API for hotel content.

Check in the ~/.vio/OPUS repository.

If confirmed, cleanup content-pipeline and mapping-pipeline repos.

PR has been merged, deploy on staging envornment, and monitor production deployment.

CONTENT-4186 Fix img-proxy source image fetch timeoutsCase
related
ImgProxy

Redeployed obfuscated-proxy v1.4.0, check if that fixed. No.

CONTENT-2793 agd_duplicated_hotel_feedback expiredCase PR

The PR mapping-pipeline#1981 was closed due to stalliness. Need to address comments and merge it.

CONTENT-2793 - mapping-prod, AGD feedback CSV

  • Root cause (10th confirmation): bucket-wide 180-day S3 lifecycle rule expired agd_duplicated_hotel_feedback/latest.csv. Mitigated 2026-06-10; last 12 runs SUCCEEDED.
  • Still open: lifecycle rule unscoped, loader unhardened. Hard deadline 2026-12-07 — file expires again.
  • Recommend: close as mitigated, stop recurring re-checks, file follow-up before deadline. Owner ping to hguo@vio.com unanswered since 06-15.
Remove ECS infrastructure from obfuscated-proxy

Obfuscated Proxy was migrated to EKS, old ECS IaC is not relevant. Cleanup.

Monitor if upgrade to Spark 4 works
Cleanup usage of content.interface.placeStory
use role content_dbt_prod;
use schema content.content_prod;
alter table content.content_prod.place rename to place_hco;
create view content.content_prod.place as select * from content.content_prod.place_spark;

Content Squad announcement:

  • Old content.content_prod.place table (HCO-based) has been renamed and considered private
  • content.content_prod.place now a view over production-ready table developed within PI: Better Geographic UX | Notion.

Emacs is unique

· :Note:

Take: Emacs is not a text editor, it's an extensible interface to work with computer. That old joke about Emacs being an operating system is about that. Well, and it comes with great text editor.

Example. Why using terminal when you can run a shell command from Emacs? async-shell-command, start-process, make-process and likes (e.g. ghostel-shell-command was trivial to implement).

In the core of that is several orthogonal concepts that blend together: buffer, point, region, keymap, completion. Plus Elisp programming language, being simple but stood the test of time, being Lisp 2 (separate namespaces for variables and functions), and having flat namespace make it easy to learn and adopt to your needs. Elisp-oriented Emacs concepts: packages, hooks, advices.

                      ╭─ buffer ── point ── region
                      │                     ╭─ C-c ── context
                      ├─ keymap ── prefixes ┼─ C-x ── always
          ╭─ concepts ┤                     ├─ C-h ── help
          │           │                     ╰─ M-g ── "go"
          │           ╰─ completion ┬─ minibuffer ── completing-read
          │                         ╰─ completion-at-point ── capf
          │        ╭─ Lisp-2 ┬─ variables namespace
          │        │         ╰─ functions namespace
          │        ├─ flat namespace
          │        ├─ macro
          │        ├─ function
          ├─ Elisp ┤                          ╭─ list
          │        │                          ├─ alist
          │        │           ╭─ collections ┼─ plist
          │        ╰─ variable ┤              ├─ hash-map
          │                    │              ╰─ cons cell
« Emacs » ┤                    ├─ defconst
          │                    ╰─ defvar
          │                                         ╭─ :init
          │                          ╭─ use-package ┼─ :config
          │              ╭─ packages ┤              ├─ :custom
          ├─ Emacs-Elisp ┤           │              ╰─ :bind
          │              │           ├─ package.el
          │              │           ╰─ autoload ── user-lisp-directory ── Emacs 31
          │              ├─ hooks
          │              ╰─ advices
          │                        ╭─ mailing list
          │         ╭─ emacs-devel ┴─ maintainers communicate there ┬─ Sean Whitton
          │         │                                               ╰─ Eli Zaretski
          │         ├─ reddit ── users ┬─ r/emacs
          ╰─ people ┤                  ╰─ r/orgmode
                    │              ╭─ Prot
                    ╰─ personalies ┼─ Sasha Chua
                                   ├─ Mike Zamansky
                                   ╰─ u/minad ── u/oanolin ── abo-abo ── alphapapa

Daisy' (Anthropic Claude Code engineer) workflow

On <2026-08-23 Sun> I read in stumbled on this post - Anthropic: Please Have Daisy the CC Engineer Do a Video! : r/ClaudeAI.

In this week's newsletter, Anthropic included this:

"My daily driver currently looks like: two lead agents that keep each other accountable and restart the other if either fails. These delegate to tech lead or PM agents for the 8-10 projects I'm running at any one time, and each project has 5-10 IC [individual contributor] agents, generalists or specialists depending on the problem. Across all of these I'm still only doing 30-50 prompts per day, and my IC agents typically work autonomously for 2-3 days. About 60% of my interaction is with the leads, 35% with a project lead, and 5% is when something has gone off the rails. All of these agents communicate directly with the SendMessage tool."

– Daisy, Engineer on Claude Code

Turning it into mindmap:

                                      ╭─ keep each other accountable
                   ╭─ two lead agents ┼─ restart the other if either fails
                   │                  ╰─ delegate to ┬─ tech lead ── 8-10 projects...
                   │                                 ╰─ PM agents
                   │                                                 ╭─ . ┬─ generalists
« Daisy workflow » ┼─ 8-10 projects ── per project ── 5-10 IC agents ┤    ╰─ specialists
                   │                                                 ╰─ work autonomously ── for 2-3 days
                   │                        ╭─ 60% with leads
                   ├─ 30-50 prompts per day ┼─ 35% with project lead
                   │                        ╰─ 5% off rails
                   ╰─ agents communicate ── SendMessage tool

My thoughts:

Why two lead agents? Likely they both run "/loop 30m check projects" with offset, so one is checking status while another is ready for communication. This is where "60% with leads" coming from; sometimes they both are checking, and Daisy goes to project leads directly. Those two leads have permanent session names and never closing.

8-10 projects. I also have about the same number of big topics a week, often carried to other weeks. So this sounds like the right amount of parallelism. Also keeping 8-10 projects on track is within cognitive abilities of an average human.

Beyond the basics with Claude CodeYouTube

Comments lead to this video:

YT
Beyond the basics with Claude Code - YouTube
author
Daisy Hollman
date
<2026-05-22 Fri>

It breaks down to this mindmap:

                                          ╭─ Slack
                 ╭─ where work comes from ┼─ CI/CD ── no point to fix CI/CD manually
                 │                        ├─ Dashboards
                 │                        ╰─ Internal Docs
                 ├─ tip ── try doing ALL work from within CC
                 │         ╭─ code conventions are not in the model
                 ├─ limits ┼─ fine-tuning doesn't work well ── leads to more hallucinations
                 │         ╰─ in-context learning ── ICL ── general AI wins over specific AIs
                 │                                                         ╭─ rigid templates
                 │                     ╭─ compensates lack of intelligence ┼─ guardrails
                 │                     │                                   ├─ "don't let it touch X"
                 ├─ two kinds of tools ┤                                   ╰─ gets less useful as model improves
                 │                     │                           ╭─ more access
                 │                     ╰─ scales with intelligence ┼─ more control
                 │                                                 ├─ faster feedback loops
                 │                                                 ╰─ gets more useful as model improves
                 │                          ╭─ context window stayed at 1M max ── models are way better yoy
                 │                          ├─ can't dump the whole X into context ── X ┬─ wiki
                 ├─ context window is a box ┤                                           ╰─ codebase
                 │                          ├─ example ── try to run npm on Arduino
                 │                          ╰─ don't pay for what you don't use ── [TK: no slop skills]
                 │           ╭─ cached tokens are cheap ── new are expensive
                 │           ├─ not an LRU problem
                 ├─ KV cache ┼─ change in early instructions invalidates the cache ┬─ add new tool
                 │           │                                                     ╰─ change in CLAUDE.md
                 │           ╰─ put stable stuff at the front ── volatile at the end ── CC teams tries to solve this problem
                 ├─ Large-scale Software Engineering ── main question ── Does it scale?
                 │                           ╭─ when it's the right tool?
                 │                           ├─ CC has a shell ── Skill+CLI has less overhead
                 │                           │                                 ╭─ name
                 │                    ╭─ MCP ┼─ tools definitions sit in front ┼─ arguments
                 │                    │      │                                 ╰─ description
« Agentic flow » ┤                    │      │              ╭─ puts just name in the system prompt
                 │                    │      ╰─ tool search ┼─ kind-of lazy-loaded
                 │                    │                     ╰─ needs to be very specific ── e.g. slack
                 │                    │         ╭─ in-context
                 │                    │         ├─ one-line description always loaded
                 │                    │         ├─ full SKILL.md and assets loaded on-demand
                 ├─ Plugin primitives ┼─ Skills ┤                 ╭─ body is pay-per-use ── good
                 │                    │         ╰─ does it scale? ┼─ reliably loading requires a paragraph in description
                 │                    │                           ╰─ not possible to lazy-load sub-skills ┬─ no hierarchy yet
                 │                    │                                                                   ╰─ what if 100k skills?
                 │                    ├─ Hooks ┬─ runs code on events ── shell scripts
                 │                    │        ╰─ zero-overhead abstraction
                 │                    │         ╭─ out-of-context ── fundamental difference to a skill
                 │                    │         │               ╭─ named role
                 │                    │         ├─ more Claudes ┼─ own system prompt
                 │                    ╰─ Agents ┤               ╰─ own tool set
                 │                              ├─ spawned with a task ┬─ returns result
                 │                              │                      ╰─ its transcript doesn't come back
                 │                              ╰─ description still in-context ── what if 100k agents?
                 │                             ╭─ loads fully unconditionally ┬─ doesn't scale
                 │                ╭─ CLAUDE.md ┤                              ╰─ every plugin adds it
                 ├─ Doesn't scale ┤            ╰─ better inject via SessionStart hook
                 │                │         ╭─ low-quality ── low-cost ── useful, different contract
                 │                ╰─ Memory ┼─ model-curated, not human-curated
                 │                          ╰─ plugins are human-authored, human-reviewed
                 │                 ╭─ worktrees ┬─ one repo ── N claudes each owns its branch
                 │                 │            ╰─ better make it long-lived ── less overhead ── [TK: try kunchenguid/treehouse?]
                 ├─ Multi-clauding ┼─ asynchrony ┬─ walk away, let it do the work
                 │                 │             ╰─ /loop 10m
                 │                 ├─ parallelism ── multiple of asynchrony
                 │                 ╰─ lot's of context switching
                 ╰─ Agent-teams ┬─ teammates ── long-lived ── unlike agents
                                ╰─ SendMessage tool ── Claude's talking to each other

Follow-up questions:

(setq load-prefer-newer t)

My GNU Emacs configuration works from two machines I regularly use. Configuration is an Org file living within my Notes corpus. Then on save it's tangled into el file and init.el loads it. I keep custom packages in separate repository that configuration adds to load-path.

On <2026-08-22 Sat> I bumped into situation, when on one of machines, after fresh Emacs startup a symbol from lozenge.el package is not defined.

– prompt

defalias doesn't load via require and use-package why doesn't loading lozenge.el at emacs startup define an alias ◊git-status? I did (require 'lozenge), evaluated (use-package) block, added :demand t to it, still (◊git-status "~/.velppa/hotter.myaddr.dev") was failing with

eval: Symbol’s function definition is void: ◊git-status

I had to go to lozenge.el and do (eval-buffer) there.

Root cause was stale lozenge.elc file that didn't have alias defined. Solved by removing all elc files, and for the future setting this in Pavel's Emacs Configuration v3:

(setq load-prefer-newer t)

Datadog renamed Case Management to Work Management

We use Datadog Case Management at $WORK for managing failed batch jobs. When a job fails, it sends event to EventBridge then to Datadog Events, then a Monitor captures and opens a new case, providing all the details of failure (links, names, timing, basically what comes in the event). Automation workflow archives duplicated active case by title, so sequential daily runs only lead to the first case. Works really well, about 4000 cases have been created in the last 6 month of usage. AI agents are checking open cases on schedule and do root cause analysis and resolve cases (open PRs with fixes) semi-autonomously (Claude became lazy recently).

Today I noticed that Datadog renamed Case Management to Work Management, and it changes premise quite a lot. Do you remember Slack mission "Slack - where work happens" - well, often it's true, but when it is true, it means somebody doesn't do their real work. If we have a product "Work Management", then, well, why don't we use it to manage work, and manage work in Slack/Notion/Shortcut/Github. Fifth place to manage work. Thank you very much, dear Datadog, you went from a strong concept of a funnel – Alert → Case → Incident – into vague "Work Management"

Case Management API has been always not pleasant: heavy relying on UUIDs, lack of public API methods - can't link cases, can't READ COMMENTS - yes, you can POST a comment, but you can't read it back. To overcome these limitations, I had to check what Datadog UI is doing and wrap it into datadog-mcp-server.

What has changed in the API side of things with this renaming? Absolutely nothing, Work Management doesn't exist nor in API reference nor in the API requests, they still go to https://app.datadoghq.com/api/v2/cases.

Improved assets sharing in Textpod

Textpod received better assets sharing.

New logic:

  • all local files (Org link with file: or attachment:) are be copied to assets and served from textpod.
  • assets are served inline without downloading.

Examples:

Image: 20230215T131950--ieronim-bosch__art.jpeg

reddigg extensions: reddigg-rss and reddigg-images-to-html

· :Elisp:

In Update Reddigg is now a fullblown reddit client : r/emacs the reddigg.el author, u/Goator, asked me to share extensions I've (well, Claude Code) written for reddigg. Sharing.

reddigg-rss
advice reddigg to use RSS feed instead of json as Reddit blocked the latter
reddigg-images-to-html
create standalone HTML with all the images from current view in masonry grid

Here's my reddigg configuration block:

(use-package reddigg
  :config
  (require 'reddigg-images-to-html)
  (require 'reddigg-rss))

Embedding Imgur posts

Imgur post can carry multiple images. Can be useful for notes.

Yes, it's sending my images to some company on the internet, so I (eventually) better self-host it, but Imgur has been alive for a long time and I like it.

Let's try to embed Imgur post:

Textlog replies flow

textlog

monkey-id
textlog.el

A quiet, text-only microblogging platform, open-source, no JS.

HN
Show HN: textlog
github
stagas/textlog
website
https://textlog.cc
(no term)
(◊ff 'velpa "textlog.el")

I created handle @hotter and ./src/textlog.el package to send regions to textlog.

Microblogs, related to Textpod.

Another self-hosted microblogs and related:

Implement textlog.el

~/.velppa/velpa/textlog.el

Use new API methods

textlog-post should be using POST /posts method.

Implement textlog-reply command

It should get recent replies to the current user in completing-read.

Upon selection a message, store its id, then post new message (read interactively).

Textlog replies flow

Assign CapsLock to RightControl

I'm using Handy.app (cjpais/Handy) for text-to-speech and hold-to-speak functionality. Which button to use? Right Option rarely used, but I do use it as Hyper key in Emacs, in particular {H-RET} calls visit-source (visit-source.el).

Right Control also rarely used and does exists on my Keyboardio Model 100. But, it turned out macOS remaps CapsLock to Right Control from the SystemSettings.app.

260804--keyboard-remapping__macos.png

I need some remapping then, for internal keyboard only:

  • CapsLock to Left Control
  • Left Control to Right Control

To achieve that, store the plist to ~/Library/LaunchAgents/com.local.keyboard-remap.plist file.

To rebind live without reboot, run hidutil commands manually. In SystemSettings.app set default CapsLock binding (CapsLock to CapsLock).

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.local.keyboard-remap</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/sh</string>
    <string>-c</string>
    <string>
      /usr/bin/hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000039,"HIDKeyboardModifierMappingDst":0x7000000E0}]}';
      /usr/bin/hidutil property --matching '{"VendorID":0x0,"ProductID":0x0}' --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x700000039,"HIDKeyboardModifierMappingDst":0x7000000E0},{"HIDKeyboardModifierMappingSrc":0x7000000E0,"HIDKeyboardModifierMappingDst":0x7000000E4}]}'
    </string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>