Stylesheet did not load — you are NOT looking at the design. Check that ../_kit.css is reachable from this page.

MOCKUP — not the live site. Proposed /activities/, three columns, per the owner. Every entry is a real activity from the August, July and June 2026 guides, read 10 Aug — real bodies, real photographs, real dates. ⚠️ The headlines are mine; the source has none, so distilling one sentence per entry is editorial work and is flagged rather than passed off as found copy. ⛔ No daybands — see the note under June, and the whole corpus was counted to decide it.
aikyam space Subscribe

Day by day

What happened here

What was made here, who came, what worked. Written by the people who were there.

⛔⛔ Two rulings rebuilt this page after it was first drawn, and both DELETED work. ⭐ The unit is an ACTIVITY, not a day — several can share a date — and ⭐ there are no future entries at all. Activities are a record of what happened.

⭐⭐ The source already proves the first ruling. August 7's block in the guide contains two different things — a stitching session and the cats — run together under one date heading because the container had no room for a second entry. The owner was describing something the corpus was already doing.

⭐ And multiple entries per date makes the headline inversion load-bearing rather than merely better. “Saturday 4 July” cannot headline three different things; each activity keeps its own. ⛔⛔ The date was a group label until 10 Aug and is now a field on each card — the grouping did not survive the move to three columns, and the reason is measured in the note under June. ⚠️ Repeating the date on three sibling cards is the cost, and it is the right cost: each of these is a shareable URL that will arrive somewhere with no neighbours to inherit a heading from.

⛔ The months are a selector, not a filter, and March is not in it — the March guide covers five days and carries no activity lines at all. An empty month in a jump list is a dead end that looks like a bug.

⛔⛔ A club label was added above every headline and removed four minutes later — and the part worth keeping is what happened in between. The owner read the first headlines and found them incomplete: “moved in where? who pulled out the DNA? which dance?” He was right. A label was proposed to carry the who.

⭐⭐ He then ruled the label out — and the completeness stayed, because it had been fixed in the HEADLINES rather than propped up by something above them. “The cats have moved into the garden”, “The stitching team's bags went on sale at Local Sustainable Living”, “The dance group talked about their first performance, in the Main Hall”. ⛔ Removing the label must not take the completeness with it, or we are back at his original complaint with an extra round trip.

⭐ Checking that found two that did NOT survive. “Up-cycling in the lab” and “The group talked about…” both leaned on the label above them and read as fragments without it. Rewritten. ⚠️ That is the real cost of a decorative element: things quietly start depending on it, and the dependency only shows when it is taken away.

⭐ The feed is back to headline + date and nothing above — which is closer to what was measured on Airbnb in the first place: their dated record has no kicker either.

⚠️ What he wants instead is a different thing, later: Ghost tags for categories — Education (science), Livelihood (stitching) — a layer above the club, added by the team, not the import, and shown on the entry page only. ⛔ So do not design filtering on it: a category that appears only on the entry page cannot be browsed by.

⭐ PROPOSAL, not ruled — have the importer capture the club as an internal tag anyway (#club-stitching). It is derivable from the schedule prefix the importer already strips, so keeping it costs one line and recovering it later means re-parsing 150 guides. ⛔ It displays nothing, it is not the category he described, and it commits nobody to anything — it only means the answer still exists when somebody asks.

⭐ Months are a selector, not a filter. Nobody browsing a record wants to filter it; they want to jump. May pulls 282 six-month visitors, so the months carry real traffic.


August

July

June

⛔⛔ THE DAYBAND IS GONE, and the record killed it — not a preference. The owner asked for three columns here as well. The obvious way to keep both was a full-width date heading with that day's activities gridded beneath it. Measured against all six monthly guides — 157 days, 250 activities, March 27 to August 30 — that option does not survive:

⛔ 92 of 157 days (59%) have no photographed activity at all, so they never appear in a photo-only feed. A dayband claims a day-by-day record this page no longer is.
⛔ Of the 65 days that DO appear, 45 (69%) contribute exactly one card — a full-width heading over one card and two empty cells, two times in three, all the way down.
⭐ And the owner already ruled the day is not the unit — “there could be more than one activity entry per day”. The dayband was a holdover from the single column; it contradicts a decision already made.

⭐⭐ So the date lives on the card, where it is already, and the month stays as the heading. A month heading is honest about being a container of a selection; a day heading is not. Nothing new was added to _kit.css — this page now uses the homepage's grid component unchanged.

⚠️ The repeated date survives and is deliberate. Three cards read Saturday 4 July above — that is what that Saturday was. ⭐ Only 14 of 65 days contribute more than one card, so this is the uncommon case, not the page. ⛔ Suppressing the repeat would leave a card that cannot be read on its own, and every one of these is a shareable URL that will arrive somewhere with no neighbours.

⭐ What makes the grid work here is the same thing that made it work on the homepage: the excerpt. Measured — 100 of the 109 photographed activities carry real prose (median 248 characters). Nine do not, and those are the pre-filled schedule lines. ⚠️ Those nine will render as a headline and a date in a cell sized for more — acceptable at 8%. ⛔ A reason to order the FEED by fullness, never to leave an entry out: the import takes all 250 and display is a query.


The quiet state — designed first

Nothing written since Tuesday

The clubs still run every afternoon, 2–6 PM. See the week.

⭐ Designed before the good state, as “Coming up” was — but as an EXCEPTION, because the habit is measured: June carries 29 written days of 30, July 23 of 31. ⛔ Quiet stretches are not the norm here.

⛔ It names the gap and hands over something true. “Nothing written since Tuesday” is honest and dated; ⛔ never “no recent activity”, which reads as the room is dead when the room is open and full.

⚠️ Still unanswered and not a design question: who writes these, and what happens when that person is away.

⚠️ Reviewer notes — not page copy

⛔⛔ 1. This page was outside the design system for an hour

Its component lived in a <style> block inside the page — so the responsive rules, the measure caps, the kitnote cap and the li exception list, all of which live in _kit.css, reached every kit except this one.

⭐⭐ And the part nobody spotted: assertion 13 could never have caught anything here, because the check knows classes and this page was built from classes the system had never seen. A page outside the system passes the system's checks by being invisible to them. ⛔ A clean measurement would have been meaningless and would have read as a pass — the "gate that cannot fail" pattern arriving through a door nobody had shut. Moved into _kit.css.

⛔ 2. Every entry has its own URL, and it is nested

Owner ruled: /activities/{slug}/, not root-level. ⭐ The second URL shape this project has chosen rather than inherited. At ~30 entries a month, deciding this a year from now means redirecting ~360 URLs; deciding it today costs a routes.yaml collection. ⚠️ Which is the Ghost Settings wall — a human in admin, not a script — and joins the paste-in package already pending.

⛔ The individual entry page does not exist as a kit and is now the gap. ⭐ Shareability is its primary requirement, not a property it happens to have: direct traffic is 60.8% — 5,449 visitors — against 20.7% search. This is already a shared-link site whose pages contain nothing shareable. A heading inside a 12,628px guide cannot be sent to anybody. So the entry page is designed for the moment it arrives in a WhatsApp thread, which makes og:image, og:title and the description product decisions, not metadata hygiene.

⚠️ The floor is adequate and should be stated as such: every post already has og_image, og_title, og_description, meta_* and canonical_url fields — all currently empty, so Ghost falls back to the title and feature image. ⛔ That fallback is fine. Nobody is blocked on hand-writing 360 descriptions; a hand-written one earns its keep only where the headline alone would mislead.

⚠️ 3. The photographs now carry width and height — a defect I had already solved

All three lacked both attributes, so the feed reflowed as each image arrived — content jumping under a reader's thumb, on the page whose whole purpose is scrolling. ⛔ I got this right on /team/ one page earlier — “width/height on every one so the grid does not reflow as thirteen images arrive” — and did not carry it here. ⚠️ These are unresized WhatsApp originals, the worst case for it.

⚠️ 4. What the import must guarantee — not mine to build

The monthly guides stay, and the duplicate-content worry does not apply: ⭐ a past record cannot drift. “On 7 August we finished fourteen bags” is true forever. The one real cost is Google splitting signals, solved by setting each entry's canonical_url to the guide it came from.

⛔⛔ CORRECTED 10 Aug — March and April DO have day headings, in a different tag. This note previously said they had none. They use h3 where May onward uses h2, and a parser keyed on h2 finds zero days in them and exits clean. ⭐ April holds 30 days, 41 activities and 30 photographed ones — the second-best-photographed month in the corpus — and it is precisely the month a working script would silently drop. ⚠️ “No day headings” and “day headings I did not look for” produce the identical output; only reading the markup separates them. Accept both tags, and assert a per-month day count.

⛔ Two more will bite the splitter: Matching each photograph to the right day is the fuzzy-match trap in a new place, and unlike a redirect map a wrong answer here is invisible. And ⛔ the newsletter: 796 subscribers. Seven posts on this site already have status sent — prove, do not assume, that API-created posts do not send. A hundred creations with the wrong flag is a hundred emails.

⚠️ Newsletter is publish-only by an existing team habit, not by a setting — Ghost's default is the other way, so the next person to join needs to know it is a habit that can be broken by accident.

⛔⛔ 4b. THE MOCKUP COMMITTED THE EXACT ERROR NOTE 4 WARNS ABOUT

Note 4 says “matching each photograph to the right day is the fuzzy-match trap in a new place, and unlike a redirect map a wrong answer here is invisible.” ⛔⛔ Three cards on this page and four on the homepage carried the WRONG photograph — the images were shifted one place against their headlines. A dance rehearsal sat under “Chapter leaders met for a quarterly district meeting”, and children sitting at a science session sat under “The community dance class practised together again”.

⭐ It was found by looking at the rendered page, not by any check. Every photograph loaded, every card measured correctly, every date was right. ⚠️ A wrong picture is a well-formed page.

⛔⛔ RETRACTED, and the retraction is the more useful half. This note said “4 July's five real activities are…none of them is stitching…that entry did not happen that day.” It did. 4 July has SIX activities and one of them is the Stitching Lab, 2–6 PM, Mary Gracy — “The stitching team continued working on new products while improving quality and exploring better production techniques.”

⭐⭐ The reason I could not see it is the whole lesson: the stitching paragraph is the only one of the six with NO photograph after it. I enumerated the day from a photo-filtered extraction and then stated a fact about the day. ⛔ I read “absent from my filtered view” as “did not occur” — and the filter was the very thing under test.

⛔ This is my own rule from the homepage notes, broken by me: “out of view, not out of existence.” ⚠️ And it matters at scale, not just here: 141 of the corpus's 250 activities have no photograph. 56%. Any rule that treats an unphotographed entry as doubtful doubts the majority of the record. ⭐ The replacement card stands on its own merits — Monday 6 July, a real 6 July photograph — so no page is wrong; only this note was.

⛔⛔ 4c. AND THE SOURCE ITSELF MISPAIRS. Verified by rendering all twelve photographs on one page and reading the headline under each. The 6 July stitching entry's picture — placed by the guide, correct by DOM order, correct by day — is a person dragging a cut branch of she-oak foliage along a paved lane. ⛔ Not fabric. Not stitching. Not indoors. Card removed rather than given an invented headline.

⭐⭐ So “the photograph follows the paragraph” is a rule about the DOCUMENT, not about reality. ⛔⛔ A pairing audit built from the guides can only prove conformance to the guides — a source-level mispairing is invisible to it and audits as correct. The only instrument that finds these is a person looking at the picture beside the headline.

⚠️ Three softer cases in the same sweep, all kept: the bags-on-sale entry shows someone sewing rather than bags on a shop shelf; the Reading Corner entry shows the science session it shares a paragraph with; the fruit-seed entry shows the room, no seeds. ⭐ Each is a picture from that activity's session rather than of the thing the headline names — acceptable for a record, and worth knowing the corpus is like this. ⛔ The hard failure is the one where the picture is of a different activity entirely.

⭐ Two things the full 4 July block shows that the filtered one could not. The district meet-up entry contains a participant quotation — “The home-like feeling. Jasentha Chechi who cooked us breakfast at short notice…” — so testimonials live inside the activity guides, not only in posts, which widens the testimonial inventory. And a non-paragraph element can sit between an activity and its photograph, so the DOM-order rule must skip blockquotes rather than reset on them.

⭐⭐ For the importer this raises the bar on note 4: the pairing must come from DOM order inside the day block — each photograph belongs to the activity paragraph it follows — and the result must be spot-checked by a human against the pictures. ⛔ There is no automated check for “this is a photograph of a different thing.” ⚠️ Only the entries with no prose are ambiguous to pair — so those are the ones a human checks first. ⛔ Not a reason to leave them out.

⛔⛔ 5. Every July and August weekday in these mockups was WRONG

Against the real 2026 calendar: 4 July is a Saturday, not a Friday. 7 August is a Friday, 6 August a Thursday, 4 August a Tuesday. Corrected here and on the homepage. ⚠️ The May dates were right, so it was not a uniform slip — a wrong stretch inside a correct list looks like data.

⛔ This is not a layout defect and no layout check could see it. The whole claim of this page is this happened, on this day; naming the wrong weekday is a different statement, not a smaller one. Someone who was in the room on Saturday reads “Friday” and stops believing everything else on the page.

⭐⭐ The source guides carry no weekday at all — they say “July 4”. So every weekday on this site is computed, and it must be computed in one place, from the date, at Asia/Kolkata. ⛔ A date rendered in UTC lands on the previous evening and shifts the weekday back by one — which is this exact error, mechanised and applied to all 250 entries.

⛔ 6. The no-photo form is out of view, and must not be deleted

The owner ruled the mockups pull only photographed entries for now, so the two exemplars that were on this page are gone from it: 1 August, a rain closure — nobody photographs a shut room, so that one can never have a picture — and 2 August, a dance group meeting that simply was not photographed. ⭐ 92 of 157 days are in the same position.

⛔⛔ The CSS for that form stays in _kit.css and stays documented. The rule behind it is unchanged and is the reason the grid has no holes: no slot without a guaranteed filler — an entry with a photograph is a card, an entry without one has no container at all. The failure to guard against is somebody later reading “we never see this” as “this cannot happen”, deleting it as dead code, and rediscovering it as an empty 4:3 well on the day a rain closure ships.

⚠️ The site still has no surface for “something is coming up”, and that is deliberate — future entries were cut. ⛔ It must not creep back in here. The record says what happened, and nothing else.

⚠️ 7. The source has a typo the importer will trip on

July 11 reads Faclilitated by Olimalar Foundation. ⛔ A schedule-prefix stripper matching Facilitated by exactly will leave that string in the body of a published entry, where it reads as our error rather than the source's. ⭐ Match loosely, then assert that no published body still contains a time range or the word lab-prefixed room name — a check on the output, not on the pattern.