Skip to content

t27f live: the fleet headline reads the Queen's activity feed every 15 s (refs #1717) - #1750

Open
gHashTag wants to merge 6 commits into
mainfrom
feat/t27f-live-activity
Open

gHashTag wants to merge 6 commits into
mainfrom
feat/t27f-live-activity

Conversation

@gHashTag

@gHashTag gHashTag commented Oct 25, 2026 •

Copy link
Copy Markdown
Collaborator

Refs #1717. Follows the law of Trinity-S-AI-DNA/t27#12382 (PR Trinity-S-AI-DNA/t27#12383, specs/t27f/live_fleet.t27).

Owner-approved foreign edit (2026-10-25): apps/website/public/t27f/live/t27f_live.js, 39 added lines (budget 40), plus one token line in index.html. ASCII only.

Why

On 2026-10-25 the fleet panel of t27.ai/t27f/live/ showed no live fleet:

The live data is public at https://api.t27.ai/queen/public-activity. It needs no credential and is CORS-open to t27.ai.

What changes

In mountFleet, a new panel, "the queen -- live activity", sits above the GitHub panels. It follows live_fleet.t27:

Rule Glue
SOURCE, no credential fetch(ACT, {cache:'no-store'}); no cookie is sent cross-origin
next_wait_s 15 s after a success; 30, 60, then at most 120 s after failures
in_flight_count an issue counts when its newest dispatch-or-finished event, in list order, is a dispatch; a review decides nothing
kind_count, refused_count finished, refused (finished only) and review counts
newest_age_s, freshness age = cursor - at of the newest event, from the server's clock, never negative; "(quiet)" after 600 s; "no events" when empty
presentation, live_badge_allowed "THE FLEET, LIVE" only after a good reading. After a success then a failure: "THE FLEET, STALE" with the age of the last reading. Before any success: "activity feed unavailable". Offline: "offline". Before the first answer: "loading..." with no LIVE badge
GitHub is a second reading the open-PR count moves from the header to the PR panel's title ("pull requests -- N open")

The panel also lists the newest 10 events: UTC time, kind, state, issue and title. Refused events show in red. Every value is set through textContent.

Verified (local static serve of apps/website/public, built-in browser, 2026-10-25 10:52..10:57Z)

  • Header: "THE FLEET, LIVE | 21 in flight · 70 finished (70 refused) · 16 reviews · newest 2s ago", with 10 event rows.
  • Measured interval: requests at 0.4, 16.5, 31.9, 47.4, 62.8, 78.2 and 93.9 s, so gaps of 15.4 to 16.1 s. That is the 15 s wait plus the request time, because the next wait starts after the answer.
  • The case this fixes: on the same IP the GitHub panels stayed empty (budget spent, backing off), while the header was live.
  • Negative control: with ACT pointed at the dead /queen/public-feed (404), the header read "THE FLEET | activity feed unavailable" with no LIVE badge and no rows, and the second request came 30.3 s after the first. The URL was then restored and live again.
  • Hooks: pre-commit (sacred constants, both language contracts), commit-msg (english-only) and pre-push passed. gitleaks git --staged found no leaks.

Not exercised in the browser: the STALE branch (a success then a failure) and the offline branch. They were checked by reading only.

Pure black cards (commit 1167d93)

The owner asked for #000000 behind every card on this page, with no blue-black. The commit changes colour literals only:

  • Page tokens: --panel and --raised in index.html go from #0b0d0c and #121614 to #000000.
  • Glue tokens: the FC and C bg tokens go from #0d1117 to #000000.
  • Inline fills: the two graph boxes and the two button styles go from #0d1117 and #21262d to #000000.
  • Borders: card borders go from #30363d to feat(hslm): [D] Ternary Activations — STE quantizer + integer matmul #333.
  • Unchanged: text, accent and legend colours, and the 1px row dividers.

Checked on a local serve: getComputedStyle(...).backgroundColor reads rgb(0, 0, 0) on body, on #live, and on all 10 cards and buttons (graph, fleet header, queen activity, pull requests, activity, dispatches, model fleet, footage). Their borders read rgb(51, 51, 51). The only other fills on the page are the five 7 px legend dots.

/t27f/gnn/ and /t27f/graph/ on pure black too (commit d60d549)

The owner asked for the same black on these two pages. The commit changes colour literals only: gnn.js 5 lines, gnn/index.html 2 lines, graph/index.html 2 lines.

Checked on a local serve: getComputedStyle reads rgb(0, 0, 0) on the body, the TOC and the figure cards of /t27f/gnn/, and on the body and #graph card of /t27f/graph/. Their borders read rgb(51, 51, 51). The graph's SVG backdrop rect fill is #000000. check:t27f (shasum -c on t27f.build) passes.

Depends on: Trinity-S-AI-DNA/t27#12408 for the law. The copy here is correct whether or not that merges first, but it should not merge if #12408 is refused.

Review fix: an unparsable "at" (commit b0b3a5d)

The bee review pointed out that an event with a missing or malformed at gave a NaN age in the header and a garbage time in its row. The feed contract in specs/t27f/live_fleet.t27 says every event carries "at": <ISO>. A reply with an at that Date.parse cannot read is now refused as foreign, the same way the existing guard refuses a non-numeric cursor. Row times are printed from the parsed date, so +00:00 or fractional-second ISO strings still show HH:MM:SSZ. The file stays at 39 added hand lines; the change folds into two existing lines.

After merge

This is live only after the ghashtag.github.io publish run passes.

{
  "version": 1,
  "head_sha": "8dc7307dc140413f16cf8ae8dd542bde7b2c779f",
  "summary": "The fleet panel of t27.ai/t27f/live/ now reads the live Queen activity feed every 15 seconds, and the live, gnn and graph pages draw every card on pure black with grey borders.",
  "changes": [
    "t27f_live.js gains a queen live activity panel that polls api.t27.ai/queen/public-activity with no credential, following specs/t27f/live_fleet.t27 (39 added lines, owner-approved).",
    "The fleet header counts issues in flight, finished, refused and review events, and shows STALE, unavailable or offline instead of a false LIVE badge.",
    "A reply whose events carry an at that does not parse as a date is refused as foreign, and row times print from the parsed date, so the header never shows a NaN age.",
    "The open pull request count moves from the fleet header to the pull request panel title, so GitHub rate limits no longer blank the header.",
    "Cards, buttons and page tokens on /t27f/live/, /t27f/gnn/ and /t27f/graph/ go to #000000 with #333 borders; colour literals only.",
    "The graph SVG backdrop follows VIEW_BACKDROP 0x000000 from the vendored spec_graph_view.t27, with spec_graph_view.mjs regenerated by t27c gen-js and t27f.build hashes updated."
  ],
  "tests": [
    {
      "command": "cd apps/website/public/t27f/graph && grep -v '^#' t27f.build | shasum -a 256 -c -",
      "result": "All six hashed files report OK at the PR head.",
      "status": "passed",
      "evidence": "spec_graph_view.mjs, t27f.wasm and the four vendored specs each print OK."
    },
    {
      "command": "local static serve of apps/website/public, /t27f/live/ in a browser",
      "result": "The header read THE FLEET, LIVE with 21 in flight, 70 finished, 16 reviews, newest 2s ago.",
      "status": "passed",
      "evidence": "Requests came 15.4 to 16.1 s apart; ten event rows rendered while the GitHub panels were rate limited."
    },
    {
      "command": "same serve with the activity URL pointed at the dead /queen/public-feed route",
      "result": "The header read activity feed unavailable with no LIVE badge and no rows.",
      "status": "passed",
      "evidence": "The second request came 30.3 s after the first, the first backoff step."
    },
    {
      "command": "getComputedStyle backgroundColor and borderColor on body and cards of /t27f/live/, /t27f/gnn/, /t27f/graph/",
      "result": "Every page body and card reads rgb(0, 0, 0) with rgb(51, 51, 51) borders.",
      "status": "passed",
      "evidence": "Ten cards on live, the TOC and figure cards on gnn, the graph card and SVG backdrop rect fill #000000 on graph."
    },
    {
      "command": "node --check apps/website/public/t27f/live/t27f_live.js, then a local serve of /t27f/live/ with the guard in place",
      "result": "The syntax check passes and the header read THE FLEET, LIVE with 16 in flight, 71 finished (71 refused), 16 reviews, newest 60s ago.",
      "status": "passed",
      "evidence": "The served script contains the at guard and loaded with 200; event rows print times such as 13:13:57Z."
    },
    {
      "command": "STALE and offline branches of the activity panel in a browser",
      "result": "These two branches were checked by reading the glue only.",
      "status": "not_run",
      "evidence": "No browser run produced a success followed by a failure, or an offline event."
    }
  ],
  "limitations": [
    "The page is live only after this PR merges and the ghashtag.github.io publish run passes.",
    "The glue repeats the rules of live_fleet.t27 by hand; t27c gen-js does not lower fn bodies yet (gHashTag/t27#10993).",
    "The legacy /queen/public-feed poll still runs every 15 s and answers 404; removing it is a separate choice.",
    "The graph backdrop law change waits on Trinity-S-AI-DNA/t27#12408; this PR should not merge if that one is refused."
  ],
  "tags": ["t27f", "queen", "fleet", "website"],
  "blog": {
    "title": "The t27f live page now shows the real Queen fleet, on pure black",
    "summary": "The fleet panel on t27.ai/t27f/live/ stopped depending on anonymous GitHub calls that ran out of budget, and now reads the public Queen activity feed every 15 seconds, while three t27f pages move to pure black cards.",
    "outline": [
      "Why the panel showed loading forever: three anonymous GitHub calls every 150 seconds spend the 60 per hour budget of a shared IP address.",
      "The public Queen activity feed at api.t27.ai needs no credential, is open to t27.ai, and answered 120 events with the newest one second old.",
      "The rules of the panel live in specs/t27f/live_fleet.t27 with ten tests, and the page glue follows that card line by line in 39 owner approved lines.",
      "Measured in a browser: polls 15 to 16 seconds apart, a LIVE header with issues in flight, and an honest unavailable state when the feed URL is dead.",
      "The live, gnn and graph pages now draw every card on pure black with grey borders, and the graph backdrop colour comes from the spec, not the page."
    ]
  }
}

🤖 Generated with Claude Code

…5 s (refs #1717)

The fleet panel on t27.ai/t27f/live/ showed no live fleet: its headline came
from anonymous GitHub REST (3 calls per 150 s = 72/h, over the 60/h per-IP
budget, so a shared IP got 403 and "loading..." for good), and the Queen feed
of #1743 answers 404.

This follows the law of Trinity-S-AI-DNA/t27#12382, specs/t27f/live_fleet.t27:
- read https://api.t27.ai/queen/public-activity (public, no credential,
  CORS-open) every 15 s; on failure wait 30, 60, then at most 120 s;
- fold the events in list order: in flight, finished, refused, reviews;
- the newest event's age comes from the server's cursor, quiet after 600 s;
- only this reading carries the LIVE badge (stale after a success,
  unavailable before one, offline when offline); the GitHub panels are a
  second reading, and their open-PR count moves to the PR panel's title;
- a "the queen -- live activity" list shows the newest 10 events.

Owner-approved foreign edit (2026-10-25), 33 added lines in one file.

Refs #1717

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gHashTag added a commit to Trinity-S-AI-DNA/t27 that referenced this pull request Oct 25, 2026
…ved (Closes #12382)

GLUE_STEPS named finished_count, review_count and freshness_label, which this
spec never defines. The fns are kind_count (finished, review) and freshness;
the steps now say so. Found while writing the host glue that follows this card
(Trinity-S-AI-DNA/trinity#1750).

t27c test-report: 8 pass, 0 FAIL, 0 of 8 vacuous. Seal re-saved by the
master-built t27c.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gHashTag and others added 2 commits October 25, 2026 18:19
One conflict, the graph message line in t27f_live.js: keep main's
gxLayout.line prefix and this branch's "the Queen's live activity" wording.
Checked on a local serve: the gx layout line and the live headline both show.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The owner asked for #000000 behind every card on /t27f/live/, with no
blue-black. Colour literals only, no logic:

- index.html: the page tokens --panel and --raised were #0b0d0c and
  #121614. They are now #000000, so the #live box is black.
- t27f_live.js: the FC and C bg tokens were the GitHub navy #0d1117. They are
  now #000000, which covers the fleet header and all six panels. The two
  graph boxes and the two button styles had inline #0d1117 / #21262d fills;
  those are now #000000 too.
- Card borders go from the blue-grey #30363d to #333.

Text, accent and legend colours are unchanged. The 1px row dividers
(#21262d) are not fills and stay.

Checked on a local serve: getComputedStyle reads rgb(0, 0, 0) on body,
#live and all 10 cards and buttons. The card borders read rgb(51, 51, 51).
The only other fills are the five legend dots.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the status:in-progress 🔵 Agent working label Oct 25, 2026
… (refs #1717)

The owner asked for /t27f/gnn/ and /t27f/graph/ to follow /t27f/live/:
#000000 behind the page and every card, with grey #333 borders. Colour
literals only, no logic.

gnn:
- index.html: theme-color and the --bg, --panel and --raised tokens go from
  the GitHub navy (#0d1117, #161b22, #21262d) to #000000. --line goes from
  #30363d to #333. That covers the body, the TOC, the code chips and every
  figure card.
- gnn.js: the hero node boxes and the empty cells of the two matrix figures
  were filled #161b22. They are now #000000, and the cell strokes go from
  #30363d to #333.

graph:
- index.html: --panel and --raised go from #0b0d0c and #121614 to #000000.
  The #graph card border goes from the green hairline to #333.
- The SVG backdrop is not a page colour. The host draws VIEW_BACKDROP from
  the law, so the law changed first, in Trinity-S-AI-DNA/t27#12408. Here the vendored
  specs/spec_graph_view.t27 copies that one-line change. spec_graph_view.mjs
  was regenerated by `t27c gen-js` at t27 master 672aaca7d and not edited by
  hand: only the VIEW_BACKDROP line differs. Before the change, the same
  compiler reproduced the committed .mjs byte for byte. t27f.build carries
  the two new sha256 lines. The wasm is unchanged; it does not use the
  backdrop.

Kept: text, accent, legend and edge colours, and the label fills, which are
the T27F label encoding.

Checked on a local serve: getComputedStyle reads rgb(0, 0, 0) on the body and
on the cards of both pages, and the card borders read rgb(51, 51, 51). The
graph SVG backdrop rect fill is #000000. check:t27f (shasum -c on t27f.build)
passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gHashTag added a commit to Trinity-S-AI-DNA/t27 that referenced this pull request Oct 25, 2026
…0, the two clocks (Closes #12382)

The bee review of PR #12383 found five gaps. This commit answers them in the
spec, with two new tests.

- The fold window. The fold fns took [16]u32 while a measured reply holds
  120 events. The width is now FOLD_WINDOW, a named usize. New doc text says
  it is a limit of the fns, not of the feed: a host folds the whole reply
  with the same rules, as the glue of trinity#1750 does over all 120 events.
  A host that can only pass a window passes the newest events. On such a
  prefix the counts never exceed the whole reply's, and the issues in flight
  can only be undercounted. Test a_window_of_the_newest_events_never_overcounts
  pins this: the count only grows as the window grows, and an issue decided
  inside the window keeps its decision.
- newest_at_ms. It is the `at` of events[0], the first event in list order,
  and not the latest time in the list.
- queen/views.t27. The presentation rules are used, not copied. A change
  there is meant to reach this panel, and these tests are how it shows up.
- QUIET_S and P_STALE are not two thresholds of one thing. P_STALE has no
  time threshold: it means the feed failed after a success. F_QUIET means
  the fleet was idle while the feed answered. Test
  live_and_quiet_are_independent pins P_LIVE with F_QUIET, and P_STALE with
  F_FRESH.
- "NOT CLAIMED" said the page does not read this card. That was stale: the
  owner approved one foreign edit of t27f_live.js, and it is
  Trinity-S-AI-DNA/trinity#1750. The glue repeats these rules and does not
  call these fns, because gen-js does not lower fn bodies (#10993).

t27c test-report (master-built t27c 672aaca): 10/10 pass, 0 vacuous. The
two new tests ran 10 and 4 runtime asserts. Re-sealed with the same t27c;
the seal has no twin and no home path.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@tri-claw

tri-claw Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Summary by t27-bees

Checked by the t27 compiler

t27c parse, parse-complete and typecheck on each changed .t27 file at 8dc7307. Nothing was generated, built or run. A pass means the file is well formed, not that it is right.

  • apps/website/public/t27f/graph/specs/spec_graph_view.t27: parses and typechecks.

Read by the model

This PR adds a new "Queen live activity" panel that polls https://api.t27.ai/queen/public-activity every 15s (with exponential backoff on failure) and moves the GitHub open-PR count from the fleet header into the PR panel title. It also changes card/page backgrounds across several t27f pages to pure #000000 per the owner's request.

Worth a look

  • apps/website/public/t27f/live/t27f_live.js:391–424 – The activity() function assumes the API returns events in newest-first order (uses E[0] for newest age, and first-seen-in-list for in-flight logic). If the API ever returns oldest-first, the "newest Ns ago" age and the in-flight count will be wrong. The spec says "in list order" but doesn't guarantee the API's sort order.

  • apps/website/public/t27f/live/t27f_live.js:418 – age = Math.max(0, Math.floor((d.cursor - Date.parse(E[0].at))/1000)) mixes the server's cursor (epoch ms?) with a client-parsed Date.parse. If cursor is in seconds or a different epoch, the age will be wildly off. The verified run showed "2s ago" so it works now, but the units are not validated.

  • apps/website/public/t27f/live/t27f_live.js:421 – navigator.onLine === false is used to detect "offline" for the STALE/unavailable message. navigator.onLine only reports whether the browser has any network connection, not whether api.t27.ai is reachable. A user on Wi-Fi with no internet would still see "STALE" instead of "offline".

  • apps/website/public/t27f/live/t27f_live.js:421 – The backoff timer setTimeout(activity, Math.min(15*2**aFail,120)*1000) runs after every attempt, including successes (aFail reset to 0). This matches the verified 15–16s intervals, but note the spec says "15 s after a success; 30, 60, then at most 120 s after failures" – the code does exactly that.

  • apps/website/public/t27f/live/t27f_live.js:449 – The GitHub PR panel title is now set via h1.textContent = 'pull requests -- ' + openCount (line 461), but the fleet header n (which previously showed the open count) is now driven entirely by the Queen feed. If the Queen feed fails before the first GitHub refresh, the header shows "activity feed unavailable" while the PR panel still loads later – this is the intended "second reading" behavior, but the header no longer reflects GitHub data at all.


Read: 8 files, +56 -27, the whole diff. Head 8dc7307. Model: openai-compatible/nvidia/nemotron-3-ultra-550b-a55b. Commands: @t27-bees review | summary | help | pause | resume. Free for every repository.

gHashTag and others added 2 commits October 25, 2026 20:16
…; row times from the parsed date (refs #1717)

The bee review on #1750 pointed out that a missing or malformed "at" gives a
NaN age in the header and a garbage time in the row. The feed contract in
specs/t27f/live_fleet.t27 says every event carries "at": <ISO>, so a reply
with an unparsable "at" is now treated like any other foreign reply (the
existing guard already refuses a non-numeric cursor). Row times are printed
from the parsed date, so a "+00:00" or fractional-second ISO string still
shows HH:MM:SSZ.

Still 39 added hand lines in t27f_live.js against main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gHashTag added a commit to Trinity-S-AI-DNA/t27 that referenced this pull request Oct 26, 2026
…n/public-activity (Closes #12382) (#12383)

* spec(t27f): live_fleet.t27 -- the fleet panel of /t27f/live/ reads /queen/public-activity, as law (Closes #12382)

The page shows no live fleet: its Queen feed (/queen/public-feed) is 404, its fallback is a
24-event fixture, and its GitHub panel makes 72 anonymous calls an hour against a budget of 60.
The live data is public at api.t27.ai/queen/public-activity (newest event 1 s old, measured
2026-10-25). This card is the panel's law: the source and its measured shape, the in-flight
fold (a review decides nothing), the counts, the age from the server cursor, the 15 s poll with
backoff to 120 s, the budget proof, and the badge rule through queen/views.t27. 8 tests, 0
vacuous; a planted wrong value fails. The page's glue does not read it yet (only-t27; #10993).

Refs #10266

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* spec(t27f): live_fleet GLUE_STEPS name the fns that exist, seal re-saved (Closes #12382)

GLUE_STEPS named finished_count, review_count and freshness_label, which this
spec never defines. The fns are kind_count (finished, review) and freshness;
the steps now say so. Found while writing the host glue that follows this card
(Trinity-S-AI-DNA/trinity#1750).

t27c test-report: 8 pass, 0 FAIL, 0 of 8 vacuous. Seal re-saved by the
master-built t27c.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* spec(t27f): live_fleet names its fold window, the glue of trinity#1750, the two clocks (Closes #12382)

The bee review of PR #12383 found five gaps. This commit answers them in the
spec, with two new tests.

- The fold window. The fold fns took [16]u32 while a measured reply holds
  120 events. The width is now FOLD_WINDOW, a named usize. New doc text says
  it is a limit of the fns, not of the feed: a host folds the whole reply
  with the same rules, as the glue of trinity#1750 does over all 120 events.
  A host that can only pass a window passes the newest events. On such a
  prefix the counts never exceed the whole reply's, and the issues in flight
  can only be undercounted. Test a_window_of_the_newest_events_never_overcounts
  pins this: the count only grows as the window grows, and an issue decided
  inside the window keeps its decision.
- newest_at_ms. It is the `at` of events[0], the first event in list order,
  and not the latest time in the list.
- queen/views.t27. The presentation rules are used, not copied. A change
  there is meant to reach this panel, and these tests are how it shows up.
- QUIET_S and P_STALE are not two thresholds of one thing. P_STALE has no
  time threshold: it means the feed failed after a success. F_QUIET means
  the fleet was idle while the feed answered. Test
  live_and_quiet_are_independent pins P_LIVE with F_QUIET, and P_STALE with
  F_FRESH.
- "NOT CLAIMED" said the page does not read this card. That was stale: the
  owner approved one foreign edit of t27f_live.js, and it is
  Trinity-S-AI-DNA/trinity#1750. The glue repeats these rules and does not
  call these fns, because gen-js does not lower fn bodies (#10993).

t27c test-report (master-built t27c 672aaca): 10/10 pass, 0 vacuous. The
two new tests ran 10 and 4 runtime asserts. Re-sealed with the same t27c;
the seal has no twin and no home path.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

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

Labels

status:in-progress 🔵 Agent working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant