Back to Adventures Home S.P.A.R.K. Chat Log  •  08/02/2026  •  Session 1
S.P.A.R.K. with AI — Development Dialog

Building TNT Adventures

Session 1: Foundations & File Naming
How the Adventures section was placed in TNT, named, and wired into the ecosystem

About This Chat Log

This is the running development diary for TNT Adventures — the section of TechNoviceTools dedicated to structured learning missions: Scavenger Hunts, Fix the Bug challenges, and DevTools Challenges.

The log follows the S.P.A.R.K. method: Set goal → Prompt thoughtfully → Analyze the response → Refine → Know what you built. Each development session adds its goals, the conversation that shaped the decisions, and the lessons that came out of it.

Session 1 (2026-08-02) covers the rationale for the Adventures section and the file-naming decisions that established adventureHome.html and sHuntHome.html as canonical entry points.

Session 2 (2026-08-02) documents the stoogeAdventures.html refactor (adopting the swingAlphabetSPARK.html page format) and the addition of an intro blurb and patron saints link to the adventureHome.html hero.

Session 3 (2026-08-07) adds a localStorage-backed student identity modal to adventureHome.html — a welcome form that collects first name, last name, and subject/period on first visit, skips on return visits, and exposes the profile under the key tntAdventureProfile for use by all hunt pages.

Session 4 (2026-08-07) fixes two initialization bugs: the profile modal was not appearing on first load (Bootstrap CSS not yet applied when the script ran), and navigating away then back via the browser’s Back button bypassed re-initialization entirely due to the Back-Forward Cache.

Session 5 (2026-08-07) standardizes the footer across all five Adventures pages, applying CRAP’s Repetition principle to establish one consistent footer template for the section.

Session 6 (2026-08-15) introduces the DevTools training curriculum arc: the Training X-Men movie clip page, Xavier’s Danger Room Guidelines (Tier 1 — ephemeral, resets on refresh), and Field Mission: Local Overrides (Tier 2 — persistent, saved to disk). The X-Men metaphor, the two-tier decision, the “Field Mission” naming choice, and the restructuring of the Adventures landing page from three cards to five are all documented here, along with the rationale for splitting into separate chatlogs per activity type going forward.

🎯
S — Set Goal Adventures is TNT’s structured-activity layer — built on top of existing pages and content, not alongside them. Before expanding it, two housekeeping problems needed to be solved: confusing file names and the absence of a development diary.
Why Adventures Exists
GitHub Copilot

TNT Adventures: the design rationale. Most of the TNT site is organized by technology — JS Apps, Processing, PHP, Styl’n. Adventures is organized by learning activity. It answers the question: what can a student do with the existing TNT pages beyond reading them?

Three mission types are planned:

  • Scavenger Hunts — navigate real TNT pages, read source code, use DevTools, answer questions that prove genuine understanding. Hunt #1 launched 2026-08-01.
  • Fix the Bug — a deliberately broken TNT page, with an answer key that teaches rather than just corrects. (Coming soon.)
  • DevTools Challenges — live pages, professional browser tools, no file downloads. (Coming soon.)

Every hunt uses a three-tier model: 🥉 Bronze (read the page) · 🥈 Silver (inspect the code) · 🥇 Gold (understand the why). A student can stop at Bronze and still learn something; a stronger student pushes to Gold.

Why it matters: Adventures turns TNT’s existing content into an active learning environment without requiring new apps. The pages already built are the curriculum. Hunt #1 covers navigation, source reading, hyperlink inspection, the XRAY framework, and first use of DevTools — entirely through nine guided stops on existing live pages.

Session 1 Prompt
💬
P — Prompt Session 1 began with two requests: fix the confusing file names across the Adventures section, and start a chatlog to document the work going forward.
klp (TTG)

I am working on some ‘adventures’ improvements. We link to it from the TNT index only to find it’s index and then an index for Scavenger Hunts. The word ‘index’ in so many connected settings is head-spinning. Let’s rename the adventure one: adventureIndex or adventureHome and the scavenger hunt one sHuntIndex or sHuntHome. Also, since we will be doing some ‘hefty’ work together on this, let’s create a adventuresChatlog.html to chronicle our work, in the same way we’ve done other work and laid out our SPARK method analysis. Tell me your thoughts on the index renames for clarity.

Prompt Critique — Naming the Real Problem

The phrase “head-spinning” is precise. The problem is not that index.html files are wrong — they function correctly. The problem is cognitive overhead for the developer. Three browser tabs labelled “index.html,” VS Code showing adventures/index.html and adventures/scavenger-hunts/index.html side by side — they look identical. The names do not reflect the files’ roles.

Offering two naming options (adventureIndex or adventureHome) and asking for a recommendation is the correct approach — it establishes intent without locking in a choice before hearing the reasoning. Good prompting leaves room for the agent to inform the decision.

Requesting the chatlog in the same breath as the rename is good planning. It means Session 1 of the log documents its own origin — the log begins with its own story.

Naming Recommendation & Link Audit
🔍
A — Analyze Before committing to names, two things were needed: a clear recommendation between the two options, and a complete audit of every file that linked to the old names.
GitHub Copilot

Naming recommendation:

adventureHome.html over adventureIndex. A landing page that orients visitors and sends them to three activity types is performing the role of a home page, not a sorted list. “Index” implies catalogued content; “Home” implies orientation and departure. The file’s job is to tell you where you are and where you can go.

sHuntHome.html over sHuntIndex for the same reason, and for an additional one: sHunt already exists in the project’s naming convention. Individual hunt files are named sh-xray-2026-08-01.html — the sh- prefix is established. sHuntHome (camelCase) extends that prefix to the catalog level, distinguishing the “all hunts” page from an individual hunt by name pattern alone.

One production consideration: index.html is what Apache serves automatically for a directory URL (e.g. technovicetools.com/adventures/). The fix — keeping the old index.html as a thin redirect shim — costs nothing and preserves that directory URL for existing bookmarks or external links.

Decision 1 — Home vs. Index: Name the Function, Not the Origin

“Home” describes what the file does; “Index” describes how it was historically generated. In the early web, index.html was auto-generated by Apache directory listings — a convention that survived long after most sites stopped using directory listings. In a deliberately designed site, every file should have a name that communicates its role to the developer who opens the project in an editor six months from now.

Rule: If you can read the filename and immediately know what the page does without opening it, the name is correct. adventureHome.html passes that test. index.html does not.

Decision 2 — The sHunt Prefix Convention

The naming hierarchy for the Adventures section now has three distinct patterns, each self-describing:

  • adventureHome.html — the section landing page
  • sHuntHome.html — the scavenger hunt catalog (camelCase: activity type + role)
  • sh-xray-2026-08-01.html — individual hunts (kebab-case: type prefix + topic + date)
GitHub Copilot

Link audit results: Seven files contain links that needed updating — ten link instances total.

FileOld linkNew link
index.html (TNT root)adventures/index.htmladventures/adventureHome.html
news.htmladventures/index.htmladventures/adventureHome.html
movie_clips.htmladventures/index.htmladventures/adventureHome.html
adventureHome.html (self nav + card)index.html / scavenger-hunts/index.htmladventureHome.html / scavenger-hunts/sHuntHome.html
sHuntHome.html (self ×3)../index.html (nav, hero, button)../adventureHome.html
sh-xray-2026-08-01.html../../scavenger-hunts/index.html & ../../index.html../../scavenger-hunts/sHuntHome.html & ../../adventureHome.html
sh-xray-2026-08-01-chatlog.html../../index.html../../adventureHome.html
Implementation
✏️
R — Refine With names chosen and links audited, the implementation created two new named files, two redirect shims, and updated all cross-references in one pass.
Decision 3 — Redirect Shims for Live-Server Compatibility

When index.html is removed from a directory, any browser that navigates to the bare directory URL (/adventures/) gets a 404. Keeping a redirect shim in place — two-line HTML with <meta http-equiv="refresh"> plus a JS fallback — costs nothing and eliminates all compatibility risk.

The canonical name is the new one (adventureHome.html). The old file exists only to serve any traffic that arrives via the directory URL or an outdated bookmark. It is not linked from anywhere in the project going forward.

Files Created or Modified in Session 1
FileActionWhat Changed
adventures/adventureHome.htmlCreatedRenamed from index.html; self-nav and scavenger-hunts card link updated
adventures/scavenger-hunts/sHuntHome.htmlCreatedRenamed from index.html; all three ../index.html back-links updated to ../adventureHome.html
adventures/adventuresChatlog.htmlCreatedThis page — Adventures development diary, Session 1
adventures/index.htmlRedirect shimConverted to meta-refresh redirect → adventureHome.html
adventures/scavenger-hunts/index.htmlRedirect shimConverted to meta-refresh redirect → sHuntHome.html
index.html (TNT root)UpdatedFeature card link updated
news.htmlUpdatedEntry #045 text link updated
movie_clips.htmlUpdatedStooges Adventures card link updated
sh-xray-2026-08-01.htmlUpdatedHero back-link and two footer buttons updated
sh-xray-2026-08-01-chatlog.htmlUpdatedAdventures Home button updated
💡
K — Know Three principles from this session that apply to any multi-level site structure.
Session Takeaways
  1. Name files after their function, not their origin. index.html is a web-server convention inherited from directory listings, not a design decision. A landing page that orients visitors should be called adventureHome.html. A catalog that lists hunts should be called sHuntHome.html. When you open the project in an editor six months from now, the filename should tell you immediately what the file does.
  2. Audit all inbound links before renaming anything. This rename touched 10 link instances across 5 external files. Without a prior audit, at least one link would have produced a silent 404. An audit is not overhead — it is the work. Building a complete list of inbound links before touching a filename is always faster than debugging broken navigation afterward.
  3. Keep redirect shims when renaming files on a live server. A renamed file on a live server becomes a 404 for any user with a bookmark, any external site that linked to it, and any browser with a cached path. A two-line meta-refresh shim in the old location eliminates all of those problems at zero cost. The canonical name is the new one; the old file exists only to serve stragglers.
Session 2 — Stooges Refactor & Hero Blurb
Session 2 — 2026-08-02

With Session 1 file-naming complete, two content improvements followed: (1) refactoring stoogeAdventures.html to match the swingAlphabetSPARK.html format, and (2) adding an intro blurb and patron saints link to the adventureHome.html hero section.

💬
P — Prompts (Session 2) Two sequential requests: refactor the Stooges clip page to match swingAlphabet’s collapsible format; then add an intro blurb with patron saints link to the Adventures landing page hero.
klp (TTG)

If you look at the swingAlphabet movie clip, you added a bit of history about the episode. I liked the page’s format. Can you refactor the stoogeAdventures page to do likewise? It is the motivating page for our ‘Adventures’ area and I’d like to create a short intro blurb on that page (similar to what you wrote on the movie short) to set a fun, thematic tone for the adventures area.

Decision 4 — Adopting the swingAlphabet Format for stoogeAdventures

The three-section <details> format from swingAlphabetSPARK.html maps directly onto the Stooges page:

  • Episode overview (open)We Want Our Mummy (1939), a .mission-quote dialogue block, and the persistence theme
  • The Adventures connection — the Curly–student parallel, with Hunt #1 stops 1 and 9 as concrete evidence
  • Fun Facts — Stooges adventure-genre history with amber border (matching swingAlphabet)

The .content-card was updated to #111827 and the clip frame border changed from green to amber — consistent with swingAlphabet and other clip pages. Adventures green stays in the hero gradient; the shared dark card palette is now uniform across the clip collection.

klp (TTG)

On the adventuresHome, let’s write a short intro blurb about the purpose of the adventures and a mention of our ‘patron saints’ in the hero image: the 3 stooges and perhaps a link to the stoogeAdventures movie clip. Let’s also update our adventuresChatlog with the progress we are making.

Decision 5 — Hero Blurb Placement

Two placements were considered: in the content area (between hero and activity cards) or inside the hero itself. The hero wins: the blurb is visible on load alongside the title, setting tone before anything else is read.

The blurb renders at 88% size and 62% opacity — subordinate to the title and subtitle, but immediately readable. The “Meet them →” link uses amber so it reads as the one actionable element in the hero without competing with the main headings.

“Meet them” implies the Stooges are characters you can go and encounter — not a footnote about the background image. The arrow makes it a direction, not a label.

Files Modified in Session 2
FileWhat Changed
movie_clips/stoogeAdventures.htmlThree <details> sections; .mission-quote block; .clip-label header; card + frame CSS aligned to swingAlphabet pattern; Adventures nav link corrected
adventures/adventureHome.htmlIntro blurb added to hero: purpose statement + patron saints + link to stoogeAdventures.html
adventures/adventuresChatlog.htmlSession 2 added (this entry); about-box updated; nav updated with Patron Saints button
Session 3 — Student Identity Modal
Session 3 — 2026-08-07

With the Adventures structure established, the focus shifted to student identification. A welcome modal now collects first name, last name, and subject/period on first visit, storing the profile under the key tntAdventureProfile in localStorage so that hunt pages can access it without asking again.

💬
P — Prompt (Session 3) Add a localStorage-backed welcome modal to adventureHome.html that collects student name and period on first visit. Skip it on return visits. Provide subtle edit and reset links at the bottom of the page. Document here.
klp (TTG)

When a novice visits our ‘adventureHome’ it’s likely they will be interacting with some form of challenge, eventually. It would be nice to secure information from them that can be used to populate identity and class/period information from them. Why not have a modal welcome to secure their: first, last name; their subject/period. (The date can be secured for each activity at the point of submission). We could store this info in local storage and once it’s there, the modal would not need launching. In case someone wants to edit their info, we could have a subtle link at the bottom of the page to edit their info or to ‘reset’ the app. I think this will be a useful feature and we can use it for our Scavenger Hunt scenarios to start with.

Decision 6 — localStorage as the Identity Layer

The profile is stored under tntAdventureProfile as a JSON object: { firstName, lastName, period }. Date is deliberately excluded — it belongs to individual activity submissions, not the identity record. When a hunt page needs to record a response, it reads the profile from localStorage and appends the submission date at that moment.

Three behaviors driven by the presence or absence of the stored key:
No profile → modal opens immediately, non-dismissable (static backdrop, no Escape, no close button) until form is completed.
Profile exists → modal skipped; student bar renders at page bottom showing name, period, and Edit / Reset links.
Edit clicked → modal opens in edit mode with pre-filled values and a visible close button (fully dismissable).

Decision 7 — Two Modal Modes, One Modal Element

The same <div class="modal"> serves onboarding and editing, but with different Bootstrap options. On first visit: backdrop: 'static', keyboard: false. On edit: backdrop: true, keyboard: true with the close button made visible.

Options are passed programmatically as the second argument to new bootstrap.Modal(el, options) rather than set as data-bs-* HTML attributes, because the behavior must differ between the two modes. One element, two instantiation contexts, correct behavior in both cases.

Decision 8 — Student Bar and Reset Confirmation

The student bar sits at the bottom of <main>, between the content section and the footer — visible to a student looking for it, unobtrusive for one who is not. It is a status indicator, not a call to action.

The Reset link invokes confirm() before clearing the profile. A student who clicks Reset accidentally should not lose their saved data without a second deliberate action.

Files Modified in Session 3
FileWhat Changed
adventures/adventureHome.htmlStudent identity modal added; student bar added before </main>; profile management IIFE added after Bootstrap bundle; lastUpdate updated to 08/07/2026
adventures/adventuresChatlog.htmlSession 3 documented; about-box updated; lastUpdate updated to 08/07/2026
💡
K — Know (Session 3) Two rules from this session on storage strategy and modal UX.
Session 3 Takeaways
  1. localStorage is the correct identity layer for a classroom tool without a back-end. Server-side accounts are disproportionate when the teacher already knows the students. localStorage is per-browser, per-device, and requires no server round-trip. The profile persists until the student explicitly resets it or clears browser storage — simple, auditable, and sufficient for submitting named responses from a known-student population.
  2. Separate onboarding behavior from edit behavior, even when they share a UI element. First-time collection requires non-dismissable interaction — the profile is a prerequisite for submission tracking. Editing is always optional — the profile already exists. Conflating the two behaviors produces the wrong experience for one of the two cases. Programmatic options per mode, one element, correct behavior in both contexts.
Session 3 Addendum — Reset UX Bug Fix
klp (TTG)

I notice when I reset my personal information, an ugly popup happens (it should be ‘pretty’) and then, once cleared, the modal pops back up immediately, almost like an infinite loop. We need to document this ‘hiccup’ in the chatlog as well as a fleshed out solution to it.

Root Cause Analysis — Two Separate Bugs

Bug 1 — The ugly popup: The reset confirmation used window.confirm() — the browser’s native blocking dialog. It cannot be styled; its appearance is controlled entirely by the OS and browser. On different platforms it looks different, and on none of them does it match the page. It also blocks the entire browser thread while waiting for an answer.

Bug 2 — The apparent infinite loop: When openModal(false) was called after clearing localStorage, it ran new bootstrap.Modal(el, options) on the same DOM element that already held a Bootstrap Modal instance from the original page-load call. Bootstrap 5 does not dispose a stale instance when a second one is created on the same element — both instances coexist on the element, sharing its internal event handlers. The result: the first instance’s hidden.bs.modal event fires when the second instance shows, which can immediately trigger the modal to reappear.

Fix 1 — Inline Confirmation Row Replaces window.confirm()

The student bar now has two layers: the normal status row (id="studentBarMain") and a hidden confirmation row (id="resetConfirm"). When Reset is clicked, the confirmation row slides into view below the status line with two styled buttons: Yes, clear it (red) and Cancel (grey). Cancel hides the confirmation row. Yes, clear it performs the actual reset.

No overlay, no browser dependency, no thread blocking — and the visual language (red for destructive, grey for safe) communicates the intent without any words beyond the label.

Fix 2 — Dispose Stale Bootstrap Modal Instances

openModal() now calls bootstrap.Modal.getInstance(el) before creating a new instance. If a stale instance exists, prev.dispose() is called first. Only then is new bootstrap.Modal(el, options) called, with a clean element.

Rule: Always call getInstance() before new Modal() on a shared DOM element. Stale instances are the most common source of unexpected Bootstrap modal behavior, and they are invisible — no console error, just wrong behavior.

Fix 3 — Clear Form State on First-Visit Opens

When openModal(false) is called (first-visit or post-reset mode), the three form fields are now explicitly cleared and any is-invalid classes from a previous attempt are removed. Without this, old values and red validation highlights from a prior session persist in the form after a reset — which is confusing precisely because the user just cleared their profile and expects a blank slate.

Files Modified in Session 3 Addendum
FileWhat Changed
adventures/adventureHome.htmlStudent bar: studentBarMain wrapper + hidden resetConfirm row added; confirm() removed; inline button handlers added; openModal() updated with dispose() guard and form-clear on non-edit mode
adventures/adventuresChatlog.htmlSession 3 addendum documented
Session 4 — BFCache & Init Timing Fix
Session 4 — 2026-08-07

The student identity modal was not appearing on first load, and navigating away then back produced a console error about the Back-Forward Cache with no modal or status bar on the restored page. Both symptoms share a root cause: profile initialization ran too early and did not survive cache restoration.

💬
P — Prompt (Session 4) Profile modal not appearing on first run; no status bar after saving and navigating away; BFCache error on back-navigation. Fix initialization timing and BFCache handling. Chronicle in chatlog.
klp (TTG)

I just opened the adventuresHome ‘from scratch’ and it did not show a ‘login’ status for me, nor a modal for input of data. When I went to a scavenger hunt and back again, the console reported: sHuntHome.html:1 WebSocket connection to ‘ws://127.0.0.1:5500/…’ failed: Page entered Back-Forward Cache. Let’s get this corrected so we can incorporate the data use in scavenger hunts.

Root Cause Analysis — Two Separate Timing Problems

Problem 1 — Script runs before Bootstrap CSS is applied: The profile IIFE’s final line called initProfile() synchronously as soon as the <script> tag was parsed. Bootstrap JS is loaded synchronously and is available at that moment — but Bootstrap CSS is fetched asynchronously from a CDN <link> tag in <head>. On any non-trivial connection, that stylesheet may still be downloading when the script runs. bootstrap.Modal.show() executes before Bootstrap’s CSS transitions are active, so the modal is technically “shown” but the backdrop and positioning render incorrectly or not at all.

Problem 2 — Back-Forward Cache (BFCache) bypasses re-initialization: Modern browsers cache full page states — HTML, JS heap, scroll position — so back/forward navigation is instantaneous. When a page is restored from BFCache, neither DOMContentLoaded nor window.load fires. The IIFE ran once on the original load; it never runs again on a cache restoration. The result: navigating from adventureHome.html to any hunt page and pressing Back produced a frozen page state with neither modal nor status bar. The WebSocket error in the console is the VS Code Live Server losing its hot-reload connection — it is not a JavaScript error and does not affect the deployed site.

Fix 1 — Defer to window.load with readyState Guard

The immediate initProfile() call is replaced with a two-branch check. If document.readyState === 'complete', all resources are already loaded and initProfile() runs immediately. Otherwise, it is registered as a window.load listener, which fires only after every stylesheet, script, and image is fully applied.

The readyState guard is necessary because the script sits at the bottom of <body>: by the time the browser parses it, load may have already fired. Registering a listener for an event that has already fired does nothing — the guard prevents that silent failure.

Fix 2 — pageshow Event Handles BFCache Restoration

The pageshow event fires for both normal loads and BFCache restorations. When event.persisted === true, the page was served from cache. A listener for this event calls initProfile() again, correctly rendering either the student status bar (if a profile is saved) or the welcome modal (if not).

pageshow is the only event that fires in both load and cache-restore contexts. DOMContentLoaded and window.load do not fire on BFCache restoration — this is by design, for performance. Any page that initializes UI from stored state must listen for pageshow to behave correctly after back/forward navigation.

Files Modified in Session 4
FileWhat Changed
adventures/adventureHome.htmlImmediate initProfile() call replaced with readyState guard + window.load listener; pageshow listener added for BFCache restoration
adventures/adventuresChatlog.htmlSession 4 documented; about-box updated
💡
K — Know (Session 4) Two page-lifecycle rules every student building multi-page web apps should internalize.
Session 4 Takeaways
  1. A script at the bottom of <body> runs before CDN-hosted stylesheets are guaranteed to be applied. Scripts load in document order, but external CSS fetches are asynchronous. If your script calls code that depends on CSS being active (like Bootstrap’s Modal), defer to window.load or check document.readyState === 'complete' first. “Script at bottom of body” is not a substitute for “all resources loaded.”
  2. The Back-Forward Cache is invisible to load and DOMContentLoaded — use pageshow. BFCache is a major performance feature in all modern browsers. Pages served from it look identical to freshly-loaded pages, but no initialization code re-runs. Any UI state driven by JavaScript — modals, status bars, dynamic content — will be stale on a cached restoration. Listen for pageshow with event.persisted === true to re-initialize that state every time the user arrives on the page, regardless of how they got there.
Session 5 — Footer Consistency
Session 5 — 2026-08-07

A design audit of the Adventures section revealed inconsistent footers across five pages — three distinct footer patterns where CRAP’s Repetition principle demands one. Standardization corrects this without loss of information or function.

💬
P — Prompt (Session 5) Adventure section footers are inconsistent: some have a Bootstrap icon, one has a duplicate validator icon and a mission-statement paragraph not present on any other page. Apply CRAP Repetition to establish one footer standard for the section.
klp (TTG)

I’m looking at the footers of adventure-related pages as compared to footers of more ‘main’ pages like explore. Since the genre is like a sister site, I can see the logic of having a lower-footprint footer, like on the sHuntHome page. However, those pages have inconsistent footers: Using our CRAP design principles, I think they should all be the same, albeit simplified. Your view? Minimally, they should be consistent while all still validating.

GitHub Copilot

The CRAP Repetition principle is exactly right here. Five pages in the Adventures section, three footer patterns — that’s a design inconsistency that erodes the “sister site” identity. The footer is the one element that appears on every page in the section; it should be the one element that is absolutely uniform.

Two of the five pages (adventureHome.html and sHuntHome.html) already share the correct footer structure — TNT home icon, Validate icon, one copyright/date line. That pattern is the right target: simple, functional, and already validated. The other three pages deviate in three different ways, none of which add value worth the inconsistency cost.

Audit — Three Deviation Types Across Three Pages

Pages already matching the standard: adventureHome.html, sHuntHome.html — no changes needed.

PageDeviationWhy it matters
sh-xray-2026-08-01.htmlBootstrap icon; footer text prefixed with “TNT Adventures — Hunt #1: X-Ray Vision”Bootstrap credit does not belong in the Adventures sister-section footer. The hunt title is already in the page title, hero, and print header.
sh-xray-2026-08-01-chatlog.htmlBootstrap iconInconsistent with section standard; adds dependency credit no other Adventures page includes.
adventuresChatlog.htmlDuplicate validator icon; mission-statement paragraphTwo links to the same validator domain add no information. The mission statement belongs on the main site footer, not the Adventures sub-section footer.
Decision — Adventures Footer Standard

One template for all five Adventures pages. Path values vary by directory depth; the structure is identical:

  • Icon 1: TNT dynamite icon → site home (index.html)
  • Icon 2: Validate icon → W3C validator (dynamic URL via validateLink JS pattern)
  • Text: All rights reserved. • © 2015–[year] TechNoviceTools (TNT) • Last updated: [date]

Why no Bootstrap icon? Bootstrap is a framework dependency, not a content partner. Dependency credit belongs in page comments or chatlog tech notes, not in student-facing footer chrome.

Files Modified in Session 5
FileWhat Changed
sh-xray-2026-08-01.htmlBootstrap icon removed from footer; footer text changed from hunt-title prefix to standard copyright/date line
sh-xray-2026-08-01-chatlog.htmlBootstrap icon removed from footer; lastUpdate updated to 08/07/2026
adventuresChatlog.htmlDuplicate validator icon removed from footer; mission-statement paragraph removed; Session 5 documented; about-box updated
💡
K — Know (Session 5) CRAP Repetition governs this session entirely.
Session 5 Takeaway

Repetition is not decoration — it is trust. When every page in a section shares the same footer, the footer disappears from conscious attention. The student never has to ask “wait, is this still the same site?” because every visual cue confirms it. Inconsistency forces that question — and cognitive load spent on navigation chrome is cognitive load stolen from the content. A sister-section footer standard exists not to look tidy but to let the student ignore it.

Session 6 — Training X-Men & the DevTools Curriculum Arc
Session 6 — 2026-08-15

With Adventures established and Hunt #1 live, the scope expanded from scavenger hunts to a full DevTools training arc. This session introduced three new resources — a movie clip page, a Tier 1 reference guide, and a Tier 2 field guide — all unified by a single metaphor borrowed from the X-Men universe. It also restructured the Adventures landing page from three activity cards to five, and produced the first news entry connecting the curriculum arc to the broader TNT site.

🎯
S — Set Goal Give novice developers a structured on-ramp to Chrome DevTools — not just “open F12 and look around,” but a scaffolded sequence grounded in a cultural metaphor that makes the concept of using browser tools responsibly feel worth remembering.
Why X-Men?
klp (TTG)

I want these clips to setup a discussion where I’ll be teaching the novices to go into developer tools and actually change a web page’s content, styling, and behavior beyond the page’s original design. That’s like a superpower where Jean Grey can move objects and channel herself into others. It’s a fun metaphor. I’ve been thinking: Xavier’s Danger Room is the safe training environment; DevTools is our Danger Room. Changes reset on refresh. What happens when a novice developer first opens DevTools on a real page for the first time?

GitHub Copilot

The DevTools → Danger Room mapping works on multiple levels simultaneously, which is what makes a metaphor pedagogically durable.

The first time a novice opens DevTools on a real production page, they see what Jean Grey saw: a flood of information they did not know existed, structured in ways they have no language for yet. Elements. Computed styles. Console warnings. Network requests. Event listeners. The instinct is to close the panel. Xavier’s instinct was to teach Jean to keep it open and learn to read it one layer at a time.

Three DevTools powers map directly onto X-Men characters:

  • HTML — the skeleton. Like the structural frame of the X-Mansion, it is what everything else attaches to. You can move elements, delete them, change their text. The Elements panel is X-ray vision.
  • CSS — Mystique’s makeover. Reshape any surface without touching the structure underneath. Styles pane changes are instant and invisible to everyone else.
  • JavaScript — Jean Grey’s telekinesis. Override functions, inject logic, move objects, rewrite behavior. Jean Grey’s domain precisely.

And the safety net: nothing breaks anything on the live site. Refresh and the world resets. That is the Danger Room property: consequence-free experimentation.

Decision 9 — The X-Men Metaphor as Curriculum Anchor

A metaphor earns its place in a curriculum when it illuminates the actual concept, not just illustrates it. The Danger Room metaphor does pedagogical work: it explains why DevTools is safe to experiment in (reset on refresh), who is responsible for what they learn (Xavier required discipline), and what power looks like without training (Jean Grey, uncontrolled).

The classroom discussion prompts in the third collapsible panel of the clip page all derive from this: power and responsibility, the Danger Room principle, training vs. raw talent, the choice Xavier made. These are not decorative questions — they are the same questions a software ethics curriculum asks. The metaphor bridges entertainment to content in a way a plain DevTools tutorial cannot.

Two Tiers: Danger Room vs. Field Mission
klp (TTG)

Now I’m thinking of a second-tier page. In the Danger Room everything resets on refresh — it’s a simulation. But what about when changes need to be saved? Chrome’s Local Overrides lets you save modified files locally so they persist across refreshes. That’s a field mission: your actions have real consequences. Should this be “Cerebro Simulation”? “Holodeck”? I’m reaching for a metaphor.

GitHub Copilot

Holodeck mixes universes (Star Trek). Cerebro has a natural X-Men fit — it amplifies your powers to persistent, world-scale effect — but there is a cleaner metaphor already in the franchise.

The Danger Room is explicitly a simulation. The X-Men’s actual missions are when training becomes reality. In X2, Jean Grey didn’t simulate saving the team; she actually saved them, and the world actually changed. That’s the shift Local Overrides represents: you’re no longer in the simulation. Your files persist on your machine. The page loads your version on every refresh. That’s a field mission.

The two-tier distinction also maps cleanly onto the DevTools tool difference: Tier 1 uses the Elements panel and Console (ephemeral). Tier 2 uses the Sources panel with Local Overrides and Snippets (persistent). Different tools, different consequences, different maturity level required.

Decision 10 — Two Tiers, Not One: Ephemeral vs. Persistent

The Danger Room/Field Mission split reflects a real technical distinction that is also a real pedagogical progression. Every novice should master the Danger Room first: experiment freely, break things deliberately, reset on refresh. Only after that foundation is solid does the “this is not a simulation” warning on the Field Mission page make sense — and carry appropriate weight.

The warning on fieldMissionOverrides.html opens with a deliberately bold callout: “This is not a simulation.” That sentence means nothing to a student who has never experienced the Danger Room’s consequence-free refresh. It means everything to one who has.

Decision 11 — “Field Mission” Over “Cerebro” or “Holodeck”

“Field Mission” wins on three criteria: it stays inside the X-Men universe, it describes exactly what the activity is (a structured mission beyond the training room), and it sets up a natural escalation ladder (Danger Room → Field Mission → ?) without requiring franchise knowledge to understand the progression.

Cerebro requires knowing that Cerebro amplifies telepathy to global range — useful for teachers who know the lore, confusing for students who don’t. “Field Mission” is self-explanatory to anyone who has seen any action film. Self-explanatory names win in educational contexts because cognitive load belongs to the content, not the label.

The Cheatsheet Format & Adventures Card Restructure
GitHub Copilot

Both guides follow the JDoodle/OnlineGDB cheat sheet format. Each training session has five quick-start steps, annotated key interface areas, a Tips card and a Gotchas card, and Bronze/Silver/Gold missions. The format is already familiar from two existing resources; novices do not have to learn a new document structure to use it.

The color distinction is intentional and informative: the Danger Room uses X-Men green (#1a7a3c) — the color of safety, simulation, consequence-free. The Field Mission uses steel blue (#1e4a9a) — more serious, more deliberate. The hero gradient and all section accents reflect this. A student who opens both pages side by side can feel the tonal difference before reading a word.

The Field Mission page adds features the Danger Room does not need: a Windows/Mac folder-creation walkthrough with platform cards, three sub-blocks for the Overrides activation sequence (Part A, B, C), a Snippets vs. Overrides comparison table, and six screenshot placeholder zones clearly marked for future imagery support.

Decision 12 — Screenshot Placeholder Zones for Future Imagery

The Field Mission guide is explicitly designed to receive screenshot support. Each placeholder is a styled dashed zone (role="img" for accessibility, with a descriptive aria-label) that shows exactly what screenshot will go there: “DevTools Sources panel, Overrides tab selected, showing the folder path and checked Enable Local Overrides checkbox.” When the screenshot is ready, replace the placeholder content with an <img> tag — the zone handles it.

The Danger Room guide has no screenshot zones because the operations it describes (Elements panel, Styles pane, Console) are visually simpler and more familiar from general DevTools exposure. The Field Mission guide covers the Sources panel, which students are much less likely to have encountered, making visual support proportionally more valuable.

Decision 13 — Adventures Card Grid: Three to Five

The Adventures landing page originally held three activity cards at col-md-4 (one row of three on medium+ screens). Adding Danger Room Training and Field Missions as the fourth and fifth cards required a grid change. All five cards now use col-sm-6 col-md-3: two columns on mobile, four per row on medium+ screens with a fifth wrapping cleanly.

Card status: Scavenger Hunts (live), Danger Room Training (live), Field Missions (coming — field manual linked from card), Fix the Bug (coming), DevTools Challenges (coming). Two of five are live. The ordering places both live activity types first, making the page feel active rather than aspirational.

Future Chatlog Structure
klp (TTG)

I could see us developing a separate chatlog for each activity type and a home page for each: Danger Room and Field Mission work. This Adventures chatlog is getting long and is really an umbrella for all adventure activity types. As we develop specific missions within each type, it makes sense to document them in their own dedicated logs.

Decision 14 — Per-Activity-Type Chatlogs Going Forward

This chatlog (adventuresChatlog.html) covers the Adventures infrastructure: naming, file structure, student identity, footer consistency, and the curriculum arc that introduced DevTools training. It is the founding document for the Adventures section.

Each activity type that develops beyond its initial card will earn its own chatlog and potentially its own cover page. Precedent already exists: the Scavenger Hunt section has sh-xray-2026-08-01-chatlog.html for Hunt #1. The Danger Room and Field Mission will follow the same pattern as they develop individual named missions (Alpha, Beta, Gamma, Delta).

The split makes logs useful at the right granularity: this file for anyone asking “how was Adventures built and why does it exist?” — individual activity logs for anyone asking “why did this specific mission work the way it does?”

💡
K — Know (Session 6) Three principles about cultural metaphors in CS curriculum design.
Session 6 Takeaways
  1. A metaphor earns its place when it does pedagogical work, not just illustrative work. The Danger Room metaphor doesn’t just make DevTools sound fun. It explains the safety model (reset on refresh), sets expectations about responsibility (Xavier required discipline), and provides a discussion framework (power without wisdom is dangerous). A metaphor that only makes something sound interesting is decoration. A metaphor that teaches alongside the content is curriculum.
  2. Two tiers that map onto a real technical distinction are better than one tier that oversimplifies. The Danger Room / Field Mission split reflects a genuine difference in DevTools tooling (Elements+Console vs. Sources+Local Overrides), skill progression (ephemeral vs. persistent), and consequence profile (consequence-free vs. files on disk). A single DevTools guide would have to either water down the complexity or overwhelm beginners. Splitting by consequence level lets each tier be fully honest about what it covers.
  3. Documentation granularity should match audience granularity. One chatlog for “how Adventures works as a section” and separate logs for “how this specific mission was built” serve different readers at different moments. A teacher orienting to the section needs the umbrella document. A student debugging a mission needs the activity-specific log. Mixing them serves neither reader well.
Files Created or Modified in Session 6
FileActionWhat Changed
movie_clips/trainingXmenSPARK.htmlCreatedThree X-Men clips; four collapsible panels (overview, Jean Grey raw power, Danger Room DevTools metaphor, classroom discussion); cross-link to Danger Room Guidelines
movie_clips.htmlUpdatedTraining X-Men card added to the movie grid with updated title, description, and icon
resources/xavierDangerRoomGuidelines.htmlCreatedTier 1 cheat sheet: four sessions (HTML, CSS, JavaScript, Bootstrap), each with 5 steps, interface areas, Tips + Gotchas, Bronze/Silver/Gold missions; Field Mission callout at bottom
resources/fieldMissionOverrides.htmlCreatedTier 2 guide: four sections (Setup, Local Overrides A/B/C, Snippets, Managing); screenshot placeholder zones; Snippets vs. Overrides comparison table; four coming-soon field mission teasers
adventures/adventureHome.htmlUpdatedGrid changed from col-md-4 (3 cards) to col-sm-6 col-md-3 (5 cards); Danger Room Training (live) and Field Missions (coming) cards added
resources.htmlUpdatedXavier’s Danger Room and Field Mission: Local Overrides cards added to Code Tools & Playgrounds accordion
news.htmlUpdatedEntry #050 added: Training X-Men clips, Danger Room Guidelines, Field Mission guide, Adventures card restructure; lastUpdate bumped to 08/15/2026
adventures/adventuresChatlog.htmlUpdatedSession 6 documented; about-box updated; nav buttons updated with Training X-Men, Danger Room, and Field Mission links; lastUpdate bumped to 08/15/2026