Skip to the content
GymAI News
Dev log

Dev log #13: a hidden record says why, and an account can take a copy of itself

· updated September 20, 2026

Thirty-four commits landed on the working branch since the last entry. The moderation board is finished on the operator’s side, a gym whose record has been hidden can read why and answer on the record itself, an account can take a complete copy of itself, and four kinds of data kept for ever have an end date and a sweep that applies it.

The board is finished on the operator’s side

An apparatus request can be decided at last. The gym’s half has been live for months and the operator’s half did not exist, so every request sat in a queue with no screen to open it. Its detail carries the description in the requester’s words, their muscle-group guess, which binds nothing, the make, and the answer that is genuinely useful: It is already on the list, carrying the value in its own label so it cannot be sent without one.

Deciding who may decide moved out of a terminal. Adding or removing a moderator was a host command; it is a screen now, each row carrying its label, role, state, when it was added and by whom. A removal is confirmed in its own row, because it ends that person’s session at once, and the owner’s row offers no Remove, since an instance with no owner has no way back in. Emphasis was settled alongside it: the accent colour marks the ordinary outcome alone, so a dispute offers two outlined peers. The operators specification reads 16 of 16, the page gate 21 of 21 and the moderation specification 118 of 118, each with its accessibility pass at 360, 834 and 1180.

A hidden record says why, on the record itself

The server has answered a suppressed record’s whole exchange for a week, and no screen read one field of it. The console does now: a banner above the record’s own screen, never a screen of its own, because the notice’s second sentence says the account, the record and its history are untouched. The words come from one place — the notice is written once and three readers share it, so no surface can say something the mail did not. Every suppression notice is a full statement of reasons now, in the mail and in the account alike, as the terms promise in both places. And a late objection has its own words at last: the fourteen days are a floor under the keeper, not a deadline against them, so a keeper back from a fortnight away is no longer told they are late.

An account can take a copy of itself

Both privacy pages promise a copy and the format is fixed as JSON. It exists: the account, its ways in, the gyms it keeps with their requests and answers, its claims, its access events. It adds no table and no query — every read already existed, and what was missing was anywhere composing them.

The decision that took the work came from the mutation pass, not from reasoning. Every fact of a gym record carries who last said it, so filtering the history to this account’s entries was not enough: the name, the address and every ticked value still named the previous keeper. The whole record is walked now and an attribution that is not this account’s is dropped, while the fact itself stands, because the gym’s facts are the gym’s.

Things kept for ever now have an end

Four sweeps run on the ordinary tick: the gym’s suppression replies, the addresses of invited moderators, access events, and the username registry’s rate-limit rows. The interesting decision is the one that says no. Twelve months from the suppression would delete the gym’s own answer while the measure hiding its record is still in force, so the period runs from the restore instead, and an open exchange is never swept whatever its age.

The log stopped writing addresses, and the retry was the worst of the three places that did, since it runs when something is already going wrong, which is exactly when a log gets pasted into a ticket. It has a rotation now, and a line it cannot date is kept rather than dropped. An empty value and a zero both mean off, since zero is what somebody writes when they mean no.

48 checks, 9,681 unit tests and 1,335 browser tests

The gate holds at 48 checks, all green, and the suites read 9,681 unit tests and 1,335 browser tests, up from 9,579 and 1,280 at the last entry. The standing counts, each written by the check that derives it: 55 routes, 27 of them rate-limited; 1,821 rule citations resolving by number, up from 1,771; documented coverage across 247 modules, up from 240; 80 artboards; and Node pinned at 22.23.2.

The backup was restored rather than described: a real identity and a real gym written into a 29-table database, snapshotted live, the store destroyed, restored, and both read back through the product’s own code. The restore reads the snapshot before touching anything and keeps what it replaced.

What comes next

The release work carries on through the last of the data rules, and the public gym record page now sits on the plan where it belongs.

If you would rather be told when GymAI opens than keep checking, the waiting list is on gymai.coach.

GymAI


Related

No comments yet

Nobody has written anything here. You can be the first.

Leave a comment

Your name and comment are published. Your email is not, and is never sent anywhere else. How we handle data