Skip to content

liveapp: priorities #116

Description

@lukaso-bot

Priorities for this app

This is the liveapp priorities control panel. The loop uses priorities.md as its north
star — but treats it as a dated hypothesis, re-examined when the evidence moves, never as
permanent truth. This panel makes it visible and lets you steer it without editing files.

Last re-tune (already applied)

The loop keeps these priorities current by itself — a priority it judges satisfied comes off
the list without waiting for you. This is what it changed most recently:

2026-09-04
priorities: re-tune (dreaming, 2026-09-04T20:18:45.095Z)


 priorities.md | 83 +++++++++++++++++++++++++++++------------------------------
 1 file changed, 41 insertions(+), 42 deletions(-)

Every re-tune is announced as a comment on this issue, labelled user fyi.

To steer the priorities

Comment steer priorities: <what should matter more/less> — e.g.

steer priorities: the Telegram flows matter more than layout guards right now

and the loop folds it into priorities.md and reflects it into the next cycle.

To stop automatic re-tuning altogether, comment reflect off.

Only you can do this: comments from the loop itself, or any bot, are ignored — it can
never re-tune its own priorities.

This loop runs as @lukaso-bot. Commands from @lukaso-bot are ignored — only other accounts can steer it.

Current priorities.md (last changed: 2026-09-04; the last pass judged the previous document DRIFTING and re-tuned it)

Priorities

What released is, what must never break, and where it hurts today. Inferred from the code on 2026-06-25; re-examined 2026-08-24, 2026-08-27, 2026-08-29, and on 2026-09-04 against live signal (production probes, open issues, recent loop journals). The last two passes were unanchored re-derivations.

What the product does

Answers "which release first contains this commit?" for GitHub and a curated set of GitLab hosts. No clone. Four surfaces, one algorithm (packages/core/src/find-release.ts):

  • Web (packages/web) — paste a commit/SHA/PR/MR/issue, get the first release tag, a shareable permalink, and an auto-updating badge.
  • CLI (packages/cli, npm git-released) — same answer in a terminal, including private repos via a host-scoped token.
  • Badge (/…/badge.svg) — shows "not yet released" and flips to the version tag automatically once a release contains the commit.
  • OG renderer (packages/web-og) — PNG unfurls for permalinks.

Critical user journeys

  1. Web lookup → permalink → share. Paste any GitHub commit URL / bare SHA / PR / issue, or a federated GitLab commit/MR. Get the first containing release + also-in list + shareable /r/… or /h/… permalink. The whole algorithm runs in the Worker under a wall-clock deadline. The homepage is the front door and the share is how the product spreads — the unfurl is the tail of this journey, not a separate feature.
  2. CLI lookup. npx git-released <input> → first release. Human, --json, --slack, --markdown output. Exit codes drive scripting.
  3. Auto-updating badge. Embedded in PRs/READMEs. Correctness here is a cache problem as much as a lookup problem: not-yet must be short-cache so it flips; released must be long-cache.
  4. Federated GitLab (gitlab.com, GNOME, KDE, Debian, freedesktop, Kitware). Anubis-protected hosts (freedesktop/GNOME) route provider fetches through the container relay; if the relay is unavailable they must degrade to the "use the CLI" card, never hard-fail.
  5. PR/MR as input. Resolve to the merge commit, then find its release. PR title becomes the headline.
  6. Private repos (CLI). Token resolves per host and is never sent to a host that didn't issue it.
  7. Bulk lookup (POST /api/lookup-bulk) — many inputs, shared deadline and tag-list memoization, capped at MAX_BULK.

What must never break

Correctness and safety invariants, not features:

  • First-release correctness. Sort tags by date ascending; never filter by date for containment. Ancestry (/compare) is the sole containment test. The gallop+bisect fast path and the containingTags shortcut must return the same answer a linear scan would. (CLAUDE.md "Algorithm guardrails", D24.)
  • Partial ≠ not-released, and partial ≠ terminal. A soft-deadline timeout surfaces a best-effort answer with a caveat, not the not-released UI — and it must not be cached as if the traversal had completed. A partial carrying a galloped firstRelease is an unconfirmed answer, so it has to stay revalidatable. Broken on main today. (partial-with-a-gallop-hit is cached as terminal: 30-day TTL, never revalidated #155/partial-with-a-firstRelease is cached as terminal on the web + badge surfaces (30d / 24h), so a truncated traversal pins a possibly-wrong tag #159)
  • Token host-scoping. A credential only ever goes to its issuing host. No generic token as a cross-host fallback (except GITLAB_TOKEN for gitlab.com by design). Security boundary.
  • A token-derived answer must never land in an anonymous shared slot. Host-scoping governs where a credential goes; this governs where the answer it bought is stored. The result cache key has five parts and none of them is auth, so this invariant does not hold on main. (PAT-computed results are cached in a public, auth-agnostic key namespace #164)
  • Release-notes sanitization. Provider release bodies are untrusted HTML. Strip <script>/<svg>/<iframe> and javascript: URIs before render.
  • Cache semantics on every auto-updating artifact — badge and OG card. Released → long cache; not-yet/checking → short cache. Get it wrong and the artifact stops flipping when the release lands. The badge honours this; the OG card does not. Stated for badges alone, this invariant read as satisfied while the identical bug shipped on a second surface. (OG card for a not-yet-released commit is cached 24h, so it never flips when the release lands #151)
  • Graceful degradation. Rate-limit, upstream-down, and Anubis-block paths show a recovery card (try-again / CLI-hint), never a stack trace or the wrong "not yet released."
  • Order of Worker publication. web before web-og (the Service Binding must exist). Publication is owned by CI on a push to main.

Current pain

The queue is frozen, and that is the whole story

Nothing has reached production in 14 days. main is still 0ee8e68, the live Worker matches it, the last merge was 2026-08-21, and the last human action on the repo was filing #154 on 2026-08-27. All four open PRs (#144, #153, #158, #163) are MERGEABLE, gates green, zero unresolved review threads anywhere. Every fix on this board exists only in a branch.

The loop has reported WIP limit reached (4 open PRs, limit 3) and ended idle on every cycle since 2026-08-29 (journals 09-01, 09-02, 09-03). Two of the four PRs holding that cap are one-click Dependabot merges (#153 npm-minor-patch, #163 changesets/action) — merging just those two unblocks the loop without touching any product code. That is the cheapest thing anyone can do on this repo right now.

The binding constraint is merge latency, not defect-finding. The highest-value work the loop can do is make each PR easier to merge; the second-highest is not to add to the pile; the third is work that does not consume a PR slot at all (see the probe item below). Filing another defect is the lowest-value thing available.

Severity order for whatever merges next

The green probe is lying about OG, and fixing that costs no PR slot

On 2026-09-04 all 30 journeys passed, including all six OG renders as real-result PNGs, with 0 SYSTEM errors over 24h and 7d against 9596 AE events/24h and a 95% result-cache hit rate. That green is real for the front door and worthless for OG: the probe re-requests the same fixed OG URLs every cycle and so keeps exactly those warm. A probe that warms its own fixtures measures only that it warmed them.

  • The health-map's named UNCOVERED seam — cold-input OG render — has been open since 2026-08-17, eighteen days. The reason recorded for it losing every cycle ("drained review threads") expired on 2026-08-29: threads have been at zero and the loop has idled every cycle since. The probe lives in $LIVEAPP_STATE_DIR/bin/liveness-probe.mjs, outside the app repo — building it opens no PR, consumes no WIP slot, and is not blocked by the merge queue. It is therefore the correct work for an idle cycle at the cap, and "WIP limit reached" is not a reason to skip it. A real guard needs one of: a genuinely cold input each run (a SHA/PR never requested before), or an assertion on the tell. The cheap tell got more expensive — once fix(web-og): cache the OG card by terminality, not by result presence (#151) #158 merges, max-age=60 no longer means "placeholder" (a real not-yet/partial card is short-cached by design), so pair the header with the byte-size floor, or keep fixtures on stably-released commits.
  • A guard must assert the tell that distinguishes a real answer from the fallback. The cold-OG bug hid behind a 200 and a valid PNG. Status codes and non-empty bodies are not evidence; the cache header, the byte size, and the rendered value are.
  • The standing program when the board is empty: iceberg detection. Every recurring top catch has been failures invisible while the front door is green (PRINCIPLES Build /bulk page (or remove the broken link) #3) — the bare-500 app.onError backstop (fix(web): app.onError backstop — uncaught exceptions degrade gracefully AND surface in the error history #99), the blank-PNG OG regression (fix(web-og): real per-commit OG card rendered a 0-byte PNG (blank unfurl) #56), an issue-badge route with no probe, and the whole cold-OG cluster (Cold-cache OG unfurls serve the placeholder again (#53 regression) — probe is blind because it re-warms its own fixtures #143). Event-driven rule: when a new route or input kind ships, re-derive the health-map inventory and add a read-only probe the moment it lands; when a new ReleasedError class is added, add it to CLIENT_ERRORS by class name so it reads as expected input, not a SYSTEM error. The map decays within about a week of a feature shipping — assume decay, re-derive rather than trusting the last "zero uncovered".

Review rounds on an unmerged PR open more issues than they close

#144 has run nineteen rounds since 2026-08-17 and is still unmerged. Round 10 produced #156 and #157; reviewing #158 produced #159 — which is #155, already open three days, found again from the other end; round 16 produced #162, which asks whether the PR works at all; round 18 produced #164. The findings are real (#164 is the most severe thing on this board), but they are findings in adjacent, untouched code, surfaced because a reviewer was reading files the PR happens to touch. This is where nearly all of the loop's non-idle time has gone. Two responses, both working and worth keeping: smaller, single-issue PRs off a freshly-fetched main, and check the open queue before filing — a defect found twice is one issue with a second reference. A PR the human can read and merge in one sitting is worth more than a PR that fixes everything.

/internal/* keeps producing defects on inspection, which reads as under-designed rather than merely buggy. Four open defects (#150, #152, #156, #157) are on that one route and none came from a probe. It deserves one deliberate pass over its deadline, cache, and back-off semantics — after the queue drains, not stacked onto #144.

Structural constraints — currently green, watch and mitigate rather than grind

Shipped / no longer pain (status only — do not re-litigate)

Open deferred work (open issues)

Human/demand-gated — do not pick up on a routine cycle:

Test gates

pnpm -r test, pnpm -r typecheck, pnpm -r build. TDD: failing test before implementation. Algorithm changes get a find-release test first.

Human steer (2026-07-26)

  • don't add any additional git/vcs providers. Until there is demand, we stick with the one that we have.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    liveapp: controlsliveapp control panel — the human steers the loop by commenting hereuser fyithe loop changed something you may want to look at

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions