graph { graph [engine:dot rankdir:LR applyCss:dark clusterize:false intention:semi grayscale:false desaturate:true] player_js___Analysis___Summary -> player_js___Analysis___Summary__Overview [reverse: false] player_js___Analysis___Summary -> player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd_ [reverse: false] player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd_ -> player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd____player_js___Analysis___Summary__Design_principles [reverse: false] player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd_ -> player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd____player_js___Analysis___Summary__Three_layers [reverse: false] player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd_ -> player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd____player_js___Analysis___Summary__Glass_menu_selector [reverse: false] player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd_ -> player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd____player_js___Analysis___Summary__Visualization [reverse: false] player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd_ -> player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd____player_js___Analysis___Summary__Data_dynamics [reverse: false] player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd_ -> player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd____player_js___Analysis___Summary__UI_tricks [reverse: false] player_js___Analysis___Summary *= player_js___Analysis___Summary__ssss___super_simple_static_site_generator [reverse: false] player_js___Analysis___Summary__ssss___super_simple_static_site_generator *= player_js___Analysis___Summary__ssss___super_simple_static_site_generator___player_js___Analysis___Summary__Principles [reverse: false] player_js___Analysis___Summary__ssss___super_simple_static_site_generator *= player_js___Analysis___Summary__ssss___super_simple_static_site_generator___player_js___Analysis___Summary__MPA_concept [reverse: false] player_js___Analysis___Summary__ssss___super_simple_static_site_generator *= player_js___Analysis___Summary__ssss___super_simple_static_site_generator___player_js___Analysis___Summary__Folder_structure [reverse: false] player_js___Analysis___Summary__ssss___super_simple_static_site_generator *= player_js___Analysis___Summary__ssss___super_simple_static_site_generator___player_js___Analysis___Summary__Tech_choices__from_ssss_mdd_ [reverse: false] player_js___Analysis___Summary__ssss___super_simple_static_site_generator *= player_js___Analysis___Summary__ssss___super_simple_static_site_generator___player_js___Analysis___Summary__Usage [reverse: false] player_js___Analysis___Summary *= player_js___Analysis___Summary__Build_Pipeline [reverse: false] player_js___Analysis___Summary *= player_js___Analysis___Summary__jq_html_Templating [reverse: false] player_js___Analysis___Summary *= player_js___Analysis___Summary__How_It_Works__HTML___JS_together_ [reverse: false] player_js___Analysis___Summary__How_It_Works__HTML___JS_together_ *= player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__The_DOM_Skeleton__view_jq_html_ [reverse: false] player_js___Analysis___Summary__How_It_Works__HTML___JS_together_ *= player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__Boot_Sequence [reverse: false] player_js___Analysis___Summary__How_It_Works__HTML___JS_together_ *= player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__Inside_player__ [reverse: false] player_js___Analysis___Summary__How_It_Works__HTML___JS_together_ *= player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__renderLayerMode___the_core_switch [reverse: false] player_js___Analysis___Summary__How_It_Works__HTML___JS_together_ *= player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__How_the_HTML_sections_map_to_player_js_functions [reverse: false] player_js___Analysis___Summary__How_It_Works__HTML___JS_together_ *= player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__Data_Flow__Search [reverse: false] player_js___Analysis___Summary__How_It_Works__HTML___JS_together_ *= player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__Data_Flow__MQ__real_time_sync_ [reverse: false] player_js___Analysis___Summary__How_It_Works__HTML___JS_together_ *= player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__Persistence_Model [reverse: false] player_js___Analysis___Summary *= player_js___Analysis___Summary__ssss_js___The_Utility_Library [reverse: false] player_js___Analysis___Summary__ssss_js___The_Utility_Library *= player_js___Analysis___Summary__ssss_js___The_Utility_Library___player_js___Analysis___Summary__What_ssss_provides_to_player_js [reverse: false] player_js___Analysis___Summary__ssss_js___The_Utility_Library *= player_js___Analysis___Summary__ssss_js___The_Utility_Library___player_js___Analysis___Summary__ssss_Sub_modules [reverse: false] player_js___Analysis___Summary__ssss_js___The_Utility_Library *= player_js___Analysis___Summary__ssss_js___The_Utility_Library___player_js___Analysis___Summary__How_ssss_bootS4___drives_the_app [reverse: false] player_js___Analysis___Summary__ssss_js___The_Utility_Library *= player_js___Analysis___Summary__ssss_js___The_Utility_Library___player_js___Analysis___Summary__Key_design_notes [reverse: false] player_js___Analysis___Summary *= player_js___Analysis___Summary__Architecture [reverse: false] player_js___Analysis___Summary *= player_js___Analysis___Summary__Layers__routing_ [reverse: false] player_js___Analysis___Summary *= player_js___Analysis___Summary__File_Summaries [reverse: false] player_js___Analysis___Summary *= player_js___Analysis___Summary__Layout_Engines__Eisenhower_Matrix_ [reverse: false] player_js___Analysis___Summary *= player_js___Analysis___Summary__Found_TASK__Comments [reverse: false] player_js___Analysis___Summary *= player_js___Analysis___Summary__Theme_structure [reverse: false] player_js___Analysis___Summary__Theme_structure *= player_js___Analysis___Summary__Theme_structure___player_js___Analysis___Summary__Dialog_backdrop_blur [reverse: false] player_js___Analysis___Summary *= player_js___Analysis___Summary__Observations [reverse: false] player_js___Analysis___Summary *= player_js___Analysis___Summary__Analysis__PROXY_vs_proxy [reverse: false] player_js___Analysis___Summary__Analysis__PROXY_vs_proxy *= player_js___Analysis___Summary__Analysis__PROXY_vs_proxy___player_js___Analysis___Summary__Intended_pattern [reverse: false] player_js___Analysis___Summary__Analysis__PROXY_vs_proxy *= player_js___Analysis___Summary__Analysis__PROXY_vs_proxy___player_js___Analysis___Summary__What_actually_happens [reverse: false] player_js___Analysis___Summary__Analysis__PROXY_vs_proxy *= player_js___Analysis___Summary__Analysis__PROXY_vs_proxy___player_js___Analysis___Summary__Violations___proxy_used_as_reader [reverse: false] player_js___Analysis___Summary__Analysis__PROXY_vs_proxy *= player_js___Analysis___Summary__Analysis__PROXY_vs_proxy___player_js___Analysis___Summary__Consequence [reverse: false] player_js___Analysis___Summary__Analysis__PROXY_vs_proxy *= player_js___Analysis___Summary__Analysis__PROXY_vs_proxy___player_js___Analysis___Summary__Fix_applied [reverse: false] player_js___Analysis___Summary *= player_js___Analysis___Summary__Refactoring__boot_____actions_js [reverse: false] player_js___Analysis___Summary__Refactoring__boot_____actions_js *= player_js___Analysis___Summary__Refactoring__boot_____actions_js___player_js___Analysis___Summary__What_changed [reverse: false] player_js___Analysis___Summary__Refactoring__boot_____actions_js *= player_js___Analysis___Summary__Refactoring__boot_____actions_js___player_js___Analysis___Summary__New_files [reverse: false] player_js___Analysis___Summary__Refactoring__boot_____actions_js *= player_js___Analysis___Summary__Refactoring__boot_____actions_js___player_js___Analysis___Summary__boot___in_player_js [reverse: false] player_js___Analysis___Summary__Refactoring__boot_____actions_js *= player_js___Analysis___Summary__Refactoring__boot_____actions_js___player_js___Analysis___Summary__Config_injection____script_id__app_config___ [reverse: false] player_js___Analysis___Summary__Refactoring__boot_____actions_js *= player_js___Analysis___Summary__Refactoring__boot_____actions_js___player_js___Analysis___Summary__Result_per_page [reverse: false] player_js___Analysis___Summary__Refactoring__boot_____actions_js *= player_js___Analysis___Summary__Refactoring__boot_____actions_js___player_js___Analysis___Summary__TODO__Production_optimizations__Brotli___Minify_ [reverse: false] Split_player_js_into_modules -> Split_player_js_into_modules__Done [reverse: false] Touchbar___Double_Touch -> Touchbar___Double_Touch__Done [reverse: false] Touchbar___Double_Touch -> Touchbar___Double_Touch__Known_gaps [reverse: false] Tabler -> Tabler__Done [reverse: false] Eisenhower_matrix -> Eisenhower_matrix__Done [reverse: false] Eisenhower_matrix -> Eisenhower_matrix__Use [reverse: false] Eisenhower_matrix -> Eisenhower_matrix__Touchbar_Actions [reverse: false] Eisenhower_matrix -> Eisenhower_matrix__Files_Changed [reverse: false] Eisenhower_matrix -> Eisenhower_matrix__Testing [reverse: false] Eisenhower_matrix -> Eisenhower_matrix__Key_conventions [reverse: false] Eisenhower_matrix -> Eisenhower_matrix__Voting_system [reverse: false] Eisenhower_matrix -> Eisenhower_matrix__Touchbar_system_API [reverse: false] Eisenhower_matrix -> Eisenhower_matrix__Architecture_quirks [reverse: false] Eisenhower_matrix -> Eisenhower_matrix__Heading_changes____Fragment_management [reverse: false] Eisenhower_matrix__Heading_changes____Fragment_management -> Eisenhower_matrix__Heading_changes____Fragment_management___Eisenhower_matrix__Files_changed [reverse: false] Eisenhower_matrix__Heading_changes____Fragment_management -> Eisenhower_matrix__Heading_changes____Fragment_management___Eisenhower_matrix__Dialog_rename [reverse: false] Eisenhower_matrix__Heading_changes____Fragment_management -> Eisenhower_matrix__Heading_changes____Fragment_management___Eisenhower_matrix__hasMetaData_filter__heading_report_ [reverse: false] Eisenhower_matrix__Heading_changes____Fragment_management -> Eisenhower_matrix__Heading_changes____Fragment_management___Eisenhower_matrix__fragmentUrl_system [reverse: false] Eisenhower_matrix__Heading_changes____Fragment_management -> Eisenhower_matrix__Heading_changes____Fragment_management___Eisenhower_matrix__replantRef_touchbar_action [reverse: false] Eisenhower_matrix__Heading_changes____Fragment_management -> Eisenhower_matrix__Heading_changes____Fragment_management___Eisenhower_matrix__URL_construction [reverse: false] Eisenhower_matrix__Heading_changes____Fragment_management -> Eisenhower_matrix__Heading_changes____Fragment_management___Eisenhower_matrix__SQL_rows [reverse: false] Eisenhower_matrix *= Eisenhower_matrix__OuchDB__Remote_CouchDB__PouchDB_ [reverse: false] Eisenhower_matrix__OuchDB__Remote_CouchDB__PouchDB_ *= Eisenhower_matrix__OuchDB__Remote_CouchDB__PouchDB____Eisenhower_matrix__CORS_conflict__Caddy___PouchDB_double_headers [reverse: false] Eisenhower_matrix *= Eisenhower_matrix__eisenhover_matrix_js___Vega_spec_builder [reverse: false] Eisenhower_matrix *= Eisenhower_matrix__Traps_pattern__cleanup_on_route_leave_ [reverse: false] Eisenhower_matrix *= Eisenhower_matrix__cmdVotingCampaign_js___link_persistence [reverse: false] player_js___Analysis___Summary [z: 9.5 @html: "
player.js - Analysis & Summary
" nomen: "player.js - Analysis & Summary"] player_js___Analysis___Summary__Overview [z: 4.75 @html: "
Overview
 player.js is the main orchestrator of the repolero-prototype app (~3600 lines). It is a single-page
application with hash-based routing,
four visual layers ( glass , paper , space , edit ), and real-time collaboration via
STOMP/RabbitMQ.The HTML shell ( view.jq.html ) defines the DOM skeleton. player.js brings it alive.
" nomen: "Overview"] player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd_ [z: 4.75 @html: "
repolero-prototype — UI concept from
repolero-prototype.mdd

" nomen: "repolero-prototype — UI concept from repolero-prototype.mdd"] player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd____player_js___Analysis___Summary__Design_principles [z: 2.375 @html: "
Design principles
•  Minimal layout (water.css-inspired)
•  Mouse-less interaction — keyboard-first
•  Keyboard shortcuts follow key ergonomics, not semantics — ESC, F1–F5, TAB, arrows, SPACE, ENTER,
BACKSPACE
" nomen: "Design principles"] player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd____player_js___Analysis___Summary__Three_layers [z: 2.375 @html: "
Three layers
LayerPurposeImplementation
space Map viewplayer/map-show.js (OpenLayers)
paper Notebook contentrenderLayerMode → fetch + mdd/html/json
render
editor Edit contentcodeditor.js (CodeMirror 6)
glass UIX overlay (search, menu, actions)Alpine stores + Autocomplete
" nomen: "Three layers"] player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd____player_js___Analysis___Summary__Glass_menu_selector [z: 2.375 @html: "
Glass menu selector
Uses autocomplete libs:
tomickigrzegorz/autocomplete,
autoComplete.js, awesomplete
" nomen: "Glass menu selector"] player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd____player_js___Analysis___Summary__Visualization [z: 2.375 @html: "
Visualization
•  Vega-Lite : parallel coords, word cloud, radar,
radial tree, calendar, heatmap
•  D3 : hierarchy pack, message sequence chart
(rc page)
" nomen: "Visualization"] player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd____player_js___Analysis___Summary__Data_dynamics [z: 2.375 @html: "
Data dynamics
• Webhooks: repo-sync, map-show tile
generation
• Portlets concept (TODO)
• Singularity/plurarity: repolero
subsystem of fragments and stages (TODO)
" nomen: "Data dynamics"] player_js___Analysis___Summary__repolero_prototype___UI_concept__from_repolero_prototype_mdd____player_js___Analysis___Summary__UI_tricks [z: 2.375 @html: "
UI tricks
• tippy.js for tooltips
• icomoon icons as font
" nomen: "UI tricks"] player_js___Analysis___Summary__ssss___super_simple_static_site_generator [z: 4.75 @html: "
ssss — super simple static site
generator

repolero-prototype is built with ssss , a custom static site generator.
" nomen: "ssss — super simple static site generator"] player_js___Analysis___Summary__ssss___super_simple_static_site_generator___player_js___Analysis___Summary__Principles [z: 2.375 @html: "
Principles
•  Petri-net flow : many sources flow into one output,
many outputs flow into one deployment
•  JSON inheritance (meld) : configs merge via jq meld() — e.g. cat root.jq.json admin.config.json
| jq -s 'meld(.【0】; .【1】)' 
" nomen: "Principles"] player_js___Analysis___Summary__ssss___super_simple_static_site_generator___player_js___Analysis___Summary__MPA_concept [z: 2.375 @html: "
MPA concept
Multi Page App — 80% static HTML, 10%
backed SPA (portlets). Uses jq-html for
templating, hash-routing for SPA layers.
" nomen: "MPA concept"] player_js___Analysis___Summary__ssss___super_simple_static_site_generator___player_js___Analysis___Summary__Folder_structure [z: 2.375 @html: "
Folder structure

 ssss/ assets/ images/*.png
styles/*.less scripts/lib.js
— ssss core client-side JS (ssss.js)
scripts/*.js data/*
— primary data (e.g. nljson) source/
s4.config.json — run ssss-run
from here *.jq.json —
declares a page to render *.jq.html
— template (or linked from theme via
jq.json) * —
adjacent to ssss/* output/ (aka dist/)
assets/ ← ssss/assets
+ source/assets merged *.html
← source/*.jq.json + *.jq.html rendered
data/** ← sfsDir + tot
deploy/ rsync mirror of output/ —
final destination (many sources
converge) 

" nomen: "Folder structure"] player_js___Analysis___Summary__ssss___super_simple_static_site_generator___player_js___Analysis___Summary__Tech_choices__from_ssss_mdd_ [z: 2.375 @html: "
Tech choices from ssss.mdd
CategoryWinner / in useAlternatives considered
CSS frameworkMVP.css, Pure.cssmatcha, sakura, bulma, milligram,
open-props
SPA / JS frameworkAlpine.js, tint, yoffeelit, hybrids, stimulus, petite-vue,
sprae, crank
Hash routingHash-Router (Michael Sogos)wand, easyrouter, stateman
State managementvaltiozustand, jotai, xstate
Key navigationkeymage, gridnavkeydrown, keycharm, a11yarrows
ChartsVega-Lite
Drag & dropdragula
Notificationshumane-js (Notyf in player)
Searchtypesense, algolia
Modaltingle, micromodal
FetchTwinSpark, aja.js
JSON renderingjsonToHtml-render
Storenbubna/storewebsheet, firebase
GUI layoutdockview
" nomen: "Tech choices from ssss.mdd"] player_js___Analysis___Summary__ssss___super_simple_static_site_generator___player_js___Analysis___Summary__Usage [z: 2.375 @html: "
Usage
 yarn serve , yarn watch , yoffee 
" nomen: "Usage"] player_js___Analysis___Summary__Build_Pipeline [z: 4.75 @html: "
Build Pipeline
Each .jq.html template in source/ has a corresponding rendered .html in dist/ . Each template also has a paired .jq.json config file that provides its data
context (site title, env, theme mode,
head scripts/links, menu pages, hotkeys,
etc.):
 source/repolero-prototype/view.jq.json
→ data for view.jq.html
source/repolero-prototype/view.jq.html
→ dist/repolero-prototype/view.html
source/repolero-prototype/rc.jq.json
→ data for rc.jq.html
source/repolero-prototype/rc.jq.html
→ dist/repolero-prototype/rc.html
source/repolero-prototype/home.jq.json
→ data for home.jq.html
source/repolero-prototype/home.jq.html

dist/repolero-prototype/home.html 

All jq.html pages: view, reflect, rc, home, root, log, out
(+ out.view, out.rc, out.root variants) reflect.jq.html (545 lines, paired with reflect.jq.json , title repolero:reflect ) is the alternative player shell introduced for tenant subdomains. Mode
is the full feature set ( admin,self,water,grid,icons,autocomplete,keynav,dynamic,vega,mq,dark,touch,table,2d ), so it boots the same player() as view.jq.html but with a different layout/skin
tailored for tenant entry. Caddy serves /reflect.html (not /view.html ) for the subset of tenant subdomains
opted into the reflect layout — see linode-server/caddy/local/Caddyfile.local.caddyfile and …/linode/Caddyfile.contabo.caddyfile . Currently the makata tenant uses /reflect.html ; other tenants ( massage , maxina , …) still fall through to /view.html . The .jq.json structure (shared across pages):
 { "name":
"open-city",
"repoName":
"repolero",
"protocolRouter":
"¦s4protocolRouter¦", //
resolved at build "site": {
"ver", "env",
"lang", "theme",
"mode":
"admin,self,water,...",
// feature flags "title":
"repolero:view",
"logoMini",
"fragments",
"menu.pages",
"hotkey": { eMain,
glassToggle, ... }, // per-page hotkey
config "touchbar": {
paper: 【...svgs】 } },
"head": {
"link": 【 { href, rel, type,
tag } 】, // CSS deps
"script": 【 { src, type, tag }
】 // JS deps },
"root":
"¦.untiloop.repolero¦"
// resolved at build } 

The mode field controls which CSS/JS libs are
included via s4FilterIncludes($input) . E.g. rc.jq.json has no vega in mode, so Vega-Lite scripts are
excluded from its <head> .The jq-html engine runs server-side and
resolves all ¦expr¦ expressions into concrete values. The
browser only ever loads the dist/*.html files — it never sees jq syntax. What gets transformed:
• HTML attributes: HREF='¦"assets://x"|s4url¦'  HREF='http:/x' 
• Text content: <title>¦.site.title¦</title>  <title>repolero:rc</title> 
• Element iteration: <option
¦=".items|.【】"> 
→ N <option> elements
• Inline JSON: JSON.parse('¦.site.env|tojson¦')  JSON.parse('"loc"') 
What passes through untouched:
•  <script
type="module"> 
JS code (the jq-html engine only
interpolates ¦¦ tokens inside it)
• Alpine.js syntax: x-data , x-for , x-show , x-text , $store.glass.* 
• Runtime attributes: resolveProps , persistent , data-hotkey 
" nomen: "Build Pipeline"] player_js___Analysis___Summary__jq_html_Templating [z: 4.75 @html: "
jq-html Templating
 view.jq.html uses a custom templating engine called jq-html . It embeds jq expressions directly in
HTML using ¦ (broken bar) delimiters. Three modes: | Syntax | Where
| Effect | |
---------------------------- |
----------------------------------- |
------------------------------ |
----------------------- | | ¦expr¦ in attribute value | e.g. src='¦"assets://x"
| s4url¦' 
| Replaced with jq result | | ¦expr¦ in text content | e.g. <title>¦.site.title¦</title> | Replaced with jq result | | ¦="expr" as attribute name | e.g. <option
¦=".items\\|.【】"> 
| Element repeated per jq output |The iteration form ¦="expr" clones the host element for each value
the jq expression yields. Inside the
cloned element, . refers to the current item. Example: <div ¦='【1,2,3】|.【】'> produces three <div> elements. Common helpers used in the template:
HelperPurpose
 s4url Resolves protocol URIs ( assets:// , repo:// , crud:// , etc.)
 s4FilterIncludes($input) Filters theme config arrays by inclusion
rules
 tojson Wraps result in JSON for safe embedding
into JS vars
How the template feeds player.js (in the boot <script> ):
 const env =
JSON.parse('¦.site.env|tojson¦') const
siteHotkey =
JSON.parse('¦.site.hotkey|tojson¦')
const mqBrokerURL =
JSON.parse('¦"mq:/ws"|s4url|tojson¦')
... 

Server-side jq renders config into JSON
strings. The JS boot script parses them
and passes everything into player({...}) .
" nomen: "jq-html Templating"] player_js___Analysis___Summary__How_It_Works__HTML___JS_together_ [z: 4.75 @html: "
How It Works HTML + JS together
" nomen: "How It Works HTML + JS together"] player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__The_DOM_Skeleton__view_jq_html_ [z: 2.375 @html: "
The DOM Skeleton view.jq.html
The HTML defines five top-level
containers, only one visible at a time:
 <body class="spa
frozen"> #status
Alpine-bound status bar (TL = top-left,
BL = bottom-left) #space > #map
OpenLayers map container (starts .off)
#paper empty div, filled
dynamically (starts .on) #edit >
#editor CodeMirror textarea (starts
.off) #glass search/command
overlay (starts .off)
.menu-navigator nav buttons: edit,
space, glass-toggle .menu-content
sections: filters, search, actions,
history, options, .secret, console,
links #alpine-touchbar Alpine-bound
toolbar (persistent, x-cloak until
shown) </body> 

Layers are toggled via .on / .off CSS classes by eSetOnOff() .
" nomen: "The DOM Skeleton view.jq.html"] player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__Boot_Sequence [z: 2.375 @html: "
Boot Sequence

 view.jq.html <script
type="module"> 1. jq-html
templates inject server config into JS
vars (env, siteVer, siteHotkey, all
URL bases, protocolRouter) 2.
initRepolero(ssss, repoUrlBase, env)
-> idBui, theme, mobile vh 3.
ssss.initMqStomp(ssss, StompJs, {...})
-> stompClient + exFanout 4.
player({ssss, ...all config...})
-> boots the app 

" nomen: "Boot Sequence"] player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__Inside_player__ [z: 2.375 @html: "
Inside player

 player() | STATE init:
repoName, history, indexJson, ast,
last-hashes | Notyf init (toaster)
| PROXY assembly (shared deps bag) |
|-- ssss.bootS4({ routeFallback,
defaultRoute }, bootS4callback) |
| | |-- bootS4callback() runs
once: | | - resetMachine()
-> fetch .repo.json, init space map
| | - initGlassMenu() ->
Alpine store + Autocomplete on
#menu-list | | -
initGlassStatus() -> Alpine store on
#status | | -
addOneTimeTweaksTodo() -> DOM
patches, touchpad, hotkeys | |
- MQ subscribe (stompClient.subscribe
-> mqFanoutConsumer) | | -
persistent elements: restore
checkboxes/details from localStorage |
| - global hotkeys via keymage |
| - window.* function assignments
| | | |--
routeFallback(tokens) runs on every hash
change: | parses:
#/{layer}/{...path}【@command】 |
calls: renderLayerMode(STATE,
currentLayer, targetLayer, command,
tokens) | stores: history,
last route 

" nomen: "Inside player"] player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__renderLayerMode___the_core_switch [z: 2.375 @html: "
renderLayerMode - the core switch
This is the heart. It receives a targetLayer and toggles the DOM:
 renderLayerMode(STATE,
currentLayer, targetLayer, command,
tokens) | |-- unbind previous
hotkeys (trapsLayer cleanup) |-- set
body【data-mode】 = targetLayer | |--
switch(targetLayer): | | 'glass':
| show #glass, show #portal.console
| updateGlassState() -> refresh
Alpine store data (papers, history,
nodes) | focusMenuInput() ->
apply armed search value, focus
#menu-input | if @query command:
arm search input with query string |
bind hotkeys for #glass + #main-menu |
| 'paper': | show #paper, hide
#glass/#edit/#space | update
#e-main -> links to #/space |
update #e-secondary -> links to
#/edit/{same-file} (if webhook on) |
if @command (dashboard, denied, login,
demo): | getCommandHandler() or
dashboard() renders into #paper |
reloadCurrentPaper = the reload function
(kept for MQ reload) | else
(normal file): | fetch file via
fragmentUrl, render HTML/mdd/json into
#paper | tabler() adds heatmaps
to tables | observeSubTree()
tracks visible headings for status bar
| bind hotkeys for #paper | |
'edit': | show #edit, hide others
| update #e-secondary ->
"save" link to
#/save/paper/{file} | fetch file
content, initEditor() -> CodeMirror 6
in #editor | restore cursor
position from localStorage | wire
editor events: save, autocomplete,
inspect, larry macros | bind
hotkeys for #edit | | 'space': |
show #space, hide others | if no
tokens: restore last space hash from
history | else:
mapShowCtrl.gotoPosition(mapName) +
gotoNodeId if specified | bind
hotkeys for #space | | 'save': |
savePaper() -> editSaveWithWebhook()
via POST to webhook | on success:
navigate back to #/paper/{file} |
|-- initToolTipBar() -> re-render
toolbar tooltips |-- focus the new
layer element 

" nomen: "renderLayerMode - the core switch"] player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__How_the_HTML_sections_map_to_player_js_functions [z: 2.375 @html: "
How the HTML sections map to player.js
functions

HTML elementplayer.js handler
 #menu-input  initGlassAutocompleteInput() -> Autocomplete lib -> glassSearchRun() 
 #menu-list (slot) initGlassMenu() -> Alpine store + template with
history, papers, fragments
 #status (slot) initGlassStatus() -> Alpine store with
statusTL/statusBL
 #alpine-touchbar  initToolTipBar() -> Alpine x-for toolbar with icon
buttons
 #paper  renderLayerMode('paper') fills innerHTML (mdd/html/dashboard)
 #editor  renderLayerMode('edit') -> initEditor() -> CodeMirror 6
 #map  resetSpace() -> mapShow() -> OpenLayers in #map
 #e-main dynamically updated:
text="paper"/"space",
HREF=last opposite layer
 #e-secondary dynamically updated:
"edit"/"save"
depending on layer + webhook
 【persistent】 elementsevent handler restores/saves
checkbox/details state via localStorage
 【data-hotkey】 elements injestHotkeys() scans + binds via keymage per layer
 【data-tooltip】 elements initToolTipBar() -> touch/hover tooltip rendering
 【resolveProps】 elements addOneTimeTweaksTodo() patches href/value/text with runtime
vars
 onclick=emitRepo*  window.emitRepoActualize/Index/Sync/Mail -> emitMqMessage() 
 onclick=closeGlass  window.closeGlass() -> goToPrev(STATE) 
" nomen: "How the HTML sections map to player.js functions"] player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__Data_Flow__Search [z: 2.375 @html: "
Data Flow: Search

 user types in #menu-input ->
Autocomplete.onSearch({ currentValue })
-> glassSearchRun(queryString, ...)
analyzeQuery() parses sources + terms
(history|files|fragments) |--
searchInHistory() -> filters
STATE.history in-memory |--
searchInRepoJson() -> filters
STATE.indexJson.papers with glob/text
|-- searchInSql() -> SQL query
via remoteSqlite (debounced)
returns reducedResult【】 ->
Autocomplete.onResults(matches) renders
<li> items ->
Autocomplete.onSubmit(object) ->
gotoUrl(uri) 

" nomen: "Data Flow: Search"] player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__Data_Flow__MQ__real_time_sync_ [z: 2.375 @html: "
Data Flow: MQ real-time sync

 stompClient.subscribe(exFanout,
mqFanoutConsumer) incoming message:
reload: 'index' -> resetMachine()
(re-fetch .repo.json, re-init space)
reload: 'paper' ->
reloadCurrentPaper() if viewing that
paper reload: 'map' ->
window.location.reload() reload: {
space } -> resetMachine() +
refreshTiles() verb: 'goto:paper'
-> gotoHash(#/paper/{fn}:{location})
outgoing (if propagation-*-out
checkboxes are on): space position
changes -> emitFanoutMessage(payload)
paper double-touch ->
emitFanoutMessage({ verb:'goto:paper',
fn, location }) actions panel
->
emitMqMessage('REPO_AFFERENT'|'REPO_SERIAL',
{...}) 

" nomen: "Data Flow: MQ real-time sync"] player_js___Analysis___Summary__How_It_Works__HTML___JS_together____player_js___Analysis___Summary__Persistence_Model [z: 2.375 @html: "
Persistence Model
All state is scoped by windowStoreKey(key) which prefixes with {idBui, repo} :
Key patternWhat it stores
 @lastRoute last visited hash
 @lastSearchInputValue last search query
 @lastGlassState was glass open? (bool)
 history array of visited hashes
 editorPos:{uri} cursor/selection for each file
 @theSTATE.ast.space.mapName last viewed map name
 @theSTATE.ast.space.position:{map} last map viewport
 options/glass/* all checkbox states from options panel
 .theme light/dark (no repo prefix)
 .secret/glass/portal-token auth token (no repo prefix)
" nomen: "Persistence Model"] player_js___Analysis___Summary__ssss_js___The_Utility_Library [z: 4.75 @html: "
ssss.js - The Utility Library
 ssss.js ( /source/assets/s4/ssss.js , ~1540 lines) is the shared utility
layer used by player.js and the rest of
the app. It is imported as import ssss from
'...s4/ssss.js' 
and passed around via the player({ssss, ...}) call.
" nomen: "ssss.js - The Utility Library"] player_js___Analysis___Summary__ssss_js___The_Utility_Library___player_js___Analysis___Summary__What_ssss_provides_to_player_js [z: 2.375 @html: "
What ssss provides to player.js
CategoryFunctions / ObjectsUsed for
Boot  bootS4() Hash-router setup, route registration, routeFallback , initial navigate
Fetch  fetchJson() , fetchWithETag() , fetchWithTimeout() , fetchHead() , fetchAny() , fetchHtml() All HTTP with ETag caching in
localStorage
Protocol URLs  Url(url) Resolves assets:// , repo:// , crud:// , mq:// etc. via protocolRouter map
MQ  initMqStomp() STOMP/WebSocket client init, returns {stompClient, exFanout, exQueue,
exTopic} 
Rendering  mddRender() , jsonRender() , htmlRender() , renderCoreUi() , renderMarkdown() Render <mdd> , <json> , <htm> tags into HTML
Webhooks  createWebHookAction() , emitActionWithWebhook() , createMqMessageAction() Webhook POST with streaming response, MQ
publish helpers
DOM  getNodeTrail() , getDeepParents() , addTrackedEventListener() , removeEventListeners() DOM traversal, tracked event
binding/cleanup
Navigation  sakaInit() , insertTooltips() , clearTooltips() Keyboard nav overlays (Saka), hotkey
badge tooltips
Misc  debounce() , sleep() , isMobileAppMode() , scaleValues() , formatDuration() , logMsg() Common utils used everywhere
String  string.* (namespace) ConvertToAscii() , commonPathPrefix() , uuidv4() 
Parsing  mddToAst() , acorn , sexp , glob MDD AST, JS expression parsing,
S-expressions, glob-to-regex
Components  ObjectId , Larry , RemoteSqlite , RemoteState , initDropZone MongoDB-style IDs, grammar validator,
HTTP SQLite adapter, socket.io state,
drag-drop
Custom Elements  S4Unit , S4Json , S4Vega , S4Tint Web components registered at boot via initCustomElements() 
" nomen: "What ssss provides to player.js"] player_js___Analysis___Summary__ssss_js___The_Utility_Library___player_js___Analysis___Summary__ssss_Sub_modules [z: 2.375 @html: "
ssss Sub-modules

 ssss.js |-- modules/ | |--
string.js : ConvertToAscii,
commonPathPrefix, uuidv4 | |--
mdd.mjs : mddToHtml, mddToAst
(remark + markdown-it) | |--
glob.js : globToRegExp |
|-- sexp.js : S-expression
parser | |-- acorn.min.js :
JS expression parser (bundled) |
|-- tooltip-overlay.js : insertTooltips,
clearTooltips | |--
toc-nav/toc-nav.js : sakaInit (keyboard
nav overlay) |-- adapters/ | |--
remote-sqlite.js : RemoteSqlite class
(HTTP CRUD for SQLite) | |--
remote-state.js : RemoteState class
(socket.io/Redis state) |--
components/ | |-- object-id.js
: ObjectId (MongoDB-style unique IDs)
| |-- s4-larry.js :
TreeValidator, grammar utils for
autocomplete | |-- s4-unit.js
: S4Unit base web component
(HTMLElement) | |-- s4-json.js
: S4Json web component + jsonToHtml()
| |-- s4-vega.js : S4Vega
web component (Vega-Lite) | |--
s4-tint.js : S4Tint web
component (Tint templates) | |--
drop-zone.js : initDropZone
(drag/drop/paste file upload) 

" nomen: "ssss Sub-modules"] player_js___Analysis___Summary__ssss_js___The_Utility_Library___player_js___Analysis___Summary__How_ssss_bootS4___drives_the_app [z: 2.375 @html: "
How ssss.bootS4 drives the app

 bootS4({ protocolRouter,
routeFallback, defaultRoute },
fnBootStart) 1. Set window.s4util
(global: protocolRouter, ea, fetch
helpers, Url) 2. Register custom
elements (s4-unit, s4-json, s4-vega,
s4-tint) 3. Wait for
document.readyState === 'complete' 4.
Register page routes (if any) 5. Call
fnBootStart() -> player's boot
callback 6. Router.init(null,
routeFallback) -> hash change
handler 7.
Router.navigate(defaultRoute) ->
first render 

The routeFallback is where player.js receives every hash
change as parsed tokens, then calls renderLayerMode() .
" nomen: "How ssss.bootS4 drives the app"] player_js___Analysis___Summary__ssss_js___The_Utility_Library___player_js___Analysis___Summary__Key_design_notes [z: 2.375 @html: "
Key design notes
•  ETag caching : fetchWithETag stores response bodies + ETags in
localStorage. Uses If-None-Match header for 304 responses.
•  Protocol router : Url() translates abstract URIs ( assets:// , repo:// ) to real URLs based on environment
config injected by jq-html.
•  Tracked event listeners : addTrackedEventListener stores references in element.__listenerRegistry so removeEventListeners can batch-remove them. This is how layer
switching cleans up hotkeys and
tooltips.
•  window.s4util : global object set at boot with protocolRouter , ea (EventAggregator), and fetch helpers.
Shared across all modules.
" nomen: "Key design notes"] player_js___Analysis___Summary__Architecture [z: 4.75 @html: "
Architecture

 player.js (orchestrator) |--
repolero-init.js : bootstrap, theme,
idBui, mobile vh |-- glass-search.js
: autocomplete search engine | |--
search/filter-base.js :
AST-to-SQL/JS filter core | |--
search/filter-fragments-pre.js : SQL
pre-filter (FragmentPreFilter) |
|-- search/filter-fragments-post.js : JS
post-filter (FragmentPostFilter) |
|-- search/filter-files-pre.js : SQL
pre-filter for files | |--
search/filter-maker.js : older
duplicate of filter-base | |--
search/search-fragments.js : SQL
fragment search via remoteSqlite |
|-- search/search-history.js :
in-memory history search | |--
search/search-repo.js : repo
index JSON search + glob/text filter |
|-- search/search-space.js : empty
|-- larry.js : grammar-based
autocomplete actor system |--
navigation.js : RBush spatial nav
+ DOM selection helpers |--
commands.js : @command handlers
(denied, login, demo) |-- codeditor.js
: CodeMirror 6 editor wrapper |--
tabler.js : table heatmap +
DataTable integration |--
visualization.js : Vega-Lite +
intensity timeline renderer |--
ui-touchbar.js : touch/gesture
handling + tooltip bar |--
alpine-stores.js : Alpine.js stores
(glass, darkMode) |-- editor-flash.js
: CM6 flash highlight extension |--
meditation-navigation.js : editor cursor
history tracker |-- actions.js
: shared window.* action registrations
|-- player/ : split modules
| |-- map-show.js :
OpenLayers map for space view |
|-- page-dashboard.js : dashboard
view with word cloud + tables |
|-- page-file-manager.js : file manager
actions | |-- player-utils.js
: constants, route/URI helpers, hotkeys
| |-- player-webhook.js :
isWebHookOn, upload, editSave, savePaper
| |-- player-state.js :
resetMachine, STATE init | |--
player-mq.js :
mqFanoutConsumer, emitFanout/Mq/Tile |
|-- player-glass.js :
initGlassMenu, initGlassStatus,
autocomplete | |--
player-tweaks.js :
reactArmSelection, addOneTimeTweaksTodo
| |-- player-paper.js :
eSetOnOff, renderPaper,
createFilterPapers | |--
player-edit.js : renderEdit,
renderSave | |-- player-space.js
: renderSpace, resetSpace | |--
simple-datatables.js : DataTables
library (bundled) 

" nomen: "Architecture"] player_js___Analysis___Summary__Layers__routing_ [z: 4.75 @html: "
Layers routing
Hash prefixLayerDescription
 #/glass/ glassSearch/command overlay
 #/paper/ paperDocument viewer (mdd, md, html, json)
 #/edit/ editCodeMirror 6 editor
 #/space/ spaceOpenLayers 2D map viewer
 #/save/ saveTriggers paper save via webhook
" nomen: "Layers routing"] player_js___Analysis___Summary__File_Summaries [z: 4.75 @html: "
File Summaries
FileLinesRole
view.jq.html~590Main HTML shell, full app (all layers)
view.jq.json~220Config: full mode, hotkeys, toolbar
icons
reflect.jq.html~545Alternative player shell for tenant
subdomains
reflect.jq.json~207Config: full mode, repolero:reflect title
rc.jq.html~365RC page, paper-only, D3 MSC chart
rc.jq.json~65Config: minimal mode (no vega, no
map-show)
home.jq.html~97Landing page, paper-only, no player()
call
home.jq.json~75Config: minimal mode
player.js~1022Main orchestrator, routing, boot, MQ,
webhooks
repolero-init.js~160App init, theme, idBui, mobile viewport
glass-search.js~250Search dispatcher: history, files,
fragments
larry.js~195Grammar-based autocomplete actors for
editor
navigation.js~330RBush spatial index + DOM walk helpers
commands.js~75@denied, @login, @demo command handlers
codeditor.js~505CM6 editor: save, blame, autocomplete,
macros
tabler.js~329Heatmap tables + DataTable + markdown
export
visualization.js~220Vega-Lite embed + intensity timeline
ui-touchbar.js~682Touch gestures, tooltip bar, toolbar
icons
alpine-stores.js~32Alpine.js stores (glass, darkMode)
editor-flash.js~50CM6 flash highlight decoration
meditation-navigation.js~100Editor cursor history (back/forward)
actions.js~100Shared window.* action registrations
search/filter-base.js~300AST expression to SQL/JS conversion
search/filter-fragments-pre.js~100SQL WHERE builder for fragments
search/filter-fragments-post.js~80JS post-filter for fragment rows
search/filter-maker.js~80Older duplicate of filter-base
search/filter-files-pre.jsNEWSQL WHERE builder for files
search/search-fragments.js~120SQLite fragment search orchestration
search/search-history.js~50History search by term matching
search/search-repo.js~120Repo JSON index search + glob/text
filter
search/search-space.js1Empty
player/map-show.js~1958OpenLayers tile map + SVG overlays
player/page-dashboard.js~635Dashboard: word cloud + tables from
SQLite
player/page-file-manager.js~52File manager actions
player/player-edit.js~388renderEdit, renderSave
player/player-glass.js~324initGlassMenu, initGlassStatus,
autocomplete
player/player-mq.js~163mqFanoutConsumer, emitFanout/Mq/Tile
player/player-paper.js~745eSetOnOff, renderPaper,
createFilterPapers
player/player-space.js~264renderSpace, resetSpace
player/player-state.js~69resetMachine, STATE init
player/player-tweaks.js~301reactArmSelection, addOneTimeTweaksTodo
player/player-utils.js~378Constants, route/URI helpers, hotkeys
player/player-webhook.js~130isWebHookOn, upload, editSave, savePaper
player/simple-datatables.js~6993DataTables library (bundled)
" nomen: "File Summaries"] player_js___Analysis___Summary__Layout_Engines__Eisenhower_Matrix_ [z: 4.75 @html: "
Layout Engines Eisenhower Matrix
LayoutKey Distinction
normal ( layout-tasks-in-box-normal.js )Simple row-packer, corner-mirror
gravity, now also uses topoSort 
boss ( like-a-boss.js )Force-directed spring+repulsion physics
boss2 ( like-a-boss2.js )Deterministic grid packer, topoSort direction-aware
boss3 ( like-a-boss3.js )ngraph.forcelayout physics engine
boss4 ( like-a-boss4.js )Vizdom (Graphviz/Dagre) hierarchical
layout — best for directed graphs
boss5 ( like-a-boss5.js )WebCoLA constraint-based layout with
overlap removal — currently
active/recommended
All active layout engines (boss2–5,
normal) set two width fields per task:
•  taskWidth = estimateTextWidth(task, fontSize,
fontWeight) 
— task text only
•  width = estimateTextWidth(miniLabel ? task
+ ", " + miniLabel : task,
fontSize, fontWeight) 
— task + optional miniLabel
" nomen: "Layout Engines Eisenhower Matrix"] player_js___Analysis___Summary__Found_TASK__Comments [z: 4.75 @html: "
Found TASK: Comments
FileLineTask
rc.jq.html~219Empty // TASK: in execState function
Note: The autoZoom TASK in map-show.js
has been resolved.
" nomen: "Found TASK: Comments"] player_js___Analysis___Summary__Theme_structure [z: 4.75 @html: "
Theme structure
Two LESS files serve the same HTML with
different skins:
•  theme-bare/repolero.less — full-featured "view" skin
(used by view.jq.html , root.jq.html , home.jq.html , rc.jq.html )
•  theme-bare/reflection.less — compact "reflect" skin (used
by reflect.jq.html ) Both import theme-bare/repolero-effect.less .
Key structural difference resolved:  reflection.less now defines the .normalizeMddNormal() mixin (same as repolero.less ) and calls it in both #paper and dialog.s4-dialog
article.paper 
contexts, instead of having those styles
inlined. Remaining visual differences:
tighter spacing, hidden notyf/status
bar, glowier active rows, different
gradient angles.
" nomen: "Theme structure"] player_js___Analysis___Summary__Theme_structure___player_js___Analysis___Summary__Dialog_backdrop_blur [z: 2.375 @html: "
Dialog backdrop blur
 water-hack.less (line 1524) applies backdrop-filter: blur(4px) to <dialog>::backdrop . When any <dialog> opens via .showModal() , the background behind it is blurred +
dimmed ( #0000009c ). This covers all native <dialog> elements (campaign select,
heading-changes, etc.).
" nomen: "Dialog backdrop blur"] player_js___Analysis___Summary__Observations [z: 4.75 @html: "
Observations
•  player.js is large (~1022 lines). renderLayerMode handles all layer switching in one
switch.
•  PROXY/proxy pattern — see detailed analysis below.
•  Commented-out code - present in player.js and
ui-touchbar.js.
•  search/filter-maker.js appears to be an older duplicate of
filter-base.js logic.
•  search/search-space.js is empty.
•  New file : alpine-stores.js - Alpine.js stores for glass state and
darkMode.
•  New file : player/page-file-manager.js - file manager actions module.
•  New file : player/simple-datatables.js - bundled DataTables library (~6993
lines).
•  Global window assignments - many functions on window (webHookMapTile, emitFanout, closeGlass,
theEditor).
•  One TASK found in rc.jq.html (empty execState function)
•  #e-main / #e-secondary in the nav bar are context-sensitive:
their text and href change per layer.
When in paper, main links to space and
secondary links to edit. When in edit,
secondary becomes "save".
•  Glass is a toggle overlay , not a separate "page". closeGlass() / goToPrev(STATE) navigates back to the last non-glass
layer. The @lastGlassState flag controls whether glass auto-opens
on boot.
" nomen: "Observations"] player_js___Analysis___Summary__Analysis__PROXY_vs_proxy [z: 4.75 @html: "
Analysis: PROXY vs proxy
" nomen: "Analysis: PROXY vs proxy"] player_js___Analysis___Summary__Analysis__PROXY_vs_proxy___player_js___Analysis___Summary__Intended_pattern [z: 2.375 @html: "
Intended pattern
•  PROXY (uppercase, line 41) — module-level
singleton, the global dependency bag
•  proxy (lowercase) — local builder that
accumulates props before merging into PROXY 
" nomen: "Intended pattern"] player_js___Analysis___Summary__Analysis__PROXY_vs_proxy___player_js___Analysis___Summary__What_actually_happens [z: 2.375 @html: "
What actually happens
The builder pattern doesn't exist in the
code. proxy is never written to — it's always a
reader. Merge point (line 3288): Object.assign(PROXY, { mapShow,
notyf, repoName, ... }) 
fills the singleton. Call site (line 3505): addOneTimeTweaksTodo({ ...PROXY,
ssss, baseUrl, crudURL, STATE }) 
creates a copy of PROXY with extra
props, passed as proxy . No function ever writes back to it.
" nomen: "What actually happens"] player_js___Analysis___Summary__Analysis__PROXY_vs_proxy___player_js___Analysis___Summary__Violations___proxy_used_as_reader [z: 2.375 @html: "
Violations — proxy used as reader
FunctionLineReads from proxy Writes?
 reactArmSelection(proxy) 306 notyf No
 addOneTimeTweaksTodo(proxy) 333 ssss , baseUrl , crudURL , emitFanoutMessage , notyf No
 initGlassAutocompleteInput(...,
proxy) 
570 notyf No
 initGlassMenu(..., proxy) 846nothing — passes proxy downNo
" nomen: "Violations — proxy used as reader"] player_js___Analysis___Summary__Analysis__PROXY_vs_proxy___player_js___Analysis___Summary__Consequence [z: 2.375 @html: "
Consequence
 proxy is really "PROXY + a few
extras" — a snapshot copy, never a
builder. The lowercase/uppercase
distinction suggests a pattern that
isn't followed. All uses are reads.
" nomen: "Consequence"] player_js___Analysis___Summary__Analysis__PROXY_vs_proxy___player_js___Analysis___Summary__Fix_applied [z: 2.375 @html: "
Fix applied
Enforced the pattern: PROXY is the singleton, functions read from it
directly. Changes in player.js:
• Added ssss , STATE , baseUrl , repoUrlBase , crudURL , addResultItems to Object.assign(PROXY, ...) at the assembly site
• Removed proxy parameter from: reactArmSelection() , addOneTimeTweaksTodo() , initGlassAutocompleteInput() , initGlassMenu() 
• All internal functions now read from
module-level PROXY 
• Removed unused PROXY shadow param from savePaper() 
• Removed PROXY arg from detectActor() calls (was unused in larry.js)
•  addOneTimeTweaksTodo() call simplified from addOneTimeTweaksTodo({...PROXY,
ssss, ...}) 
to addOneTimeTweaksTodo() 
Changes in external modules:
•  larry.js : removed unused PROXY param from detectActor() 
•  search/search-repo.js : removed unused proxy param from searchInRepoJson() 
•  glass-search.js : removed proxy.addResultItems =
addResultItems 
write (now on PROXY at assembly).
Removed proxy from searchInRepoJson() call
•  glass-search.js + search/search-fragments.js : still receive proxy (actually PROXY) as param — these are
external modules that can't access the
module-level const
" nomen: "Fix applied"] player_js___Analysis___Summary__Refactoring__boot_____actions_js [z: 4.75 @html: "
Refactoring: boot + actions.js
" nomen: "Refactoring: boot + actions.js"] player_js___Analysis___Summary__Refactoring__boot_____actions_js___player_js___Analysis___Summary__What_changed [z: 2.375 @html: "
What changed
Eliminated boot code duplication across
view.jq.html, rc.jq.html, and
home.jq.html. Before: each page repeated
~50 lines of config parsing, initRepolero() , initMqStomp() , player() call, and window.* action definitions. After: each page
calls boot(ssss, opts) .
" nomen: "What changed"] player_js___Analysis___Summary__Refactoring__boot_____actions_js___player_js___Analysis___Summary__New_files [z: 2.375 @html: "
New files
actions.js — shared window.* function registrations:
 registerUploadActions({ crudURL,
webhookUrlBase, uploadFileWithWebhook })
-> window.uploadCrud ->
window.uploadHook registerRepoActions({
ssss, stompClient, repoName,
webhookUrlBase }) ->
window.emitRepoIndex (REPO_AFFERENT)
-> window.emitRepoSync
(REPO_AFFERENT) ->
window.emitRepoActualize (REPO_AFFERENT)
-> window.emitRepoMail (REPO_SERIAL)
-> window.webHookRepoStatus
(webhook) 

" nomen: "New files"] player_js___Analysis___Summary__Refactoring__boot_____actions_js___player_js___Analysis___Summary__boot___in_player_js [z: 2.375 @html: "
boot in player.js

 export async function boot(ssss,
opts = {}) 1. Read config from
<script id="app-config">
JSON block 2. initRepolero(ssss,
repoUrlBase, env) 3. Auto-set
#\\_repoName text if element exists 4.
initMqStomp (skipped if opts.noMq or no
StompJs global) 5. registerUploadActions
+ registerRepoActions (if mqBridge) 6.
player({...config, ...opts,
fileManager}) (skipped if opts.noPlayer)
7. opts.onBoot(result) callback for
page-specific setup returns {
repoName, repoUrl, baseUrl, dataUrlBase,
mqBridge, ssss, config } 

opts:
KeyTypeEffect
 mapShow functionOpenLayers map module (passed to player)
 dashboard functionDashboard module (passed to player)
 fileManager functionFile manager module (passed to player)
 cm6 objectCodeMirror 6 (falls back to window.cm6 )
 openLayers objectOpenLayers lib (passed to player)
 noMq boolSkip MQ/STOMP init
 noPlayer boolSkip player() call entirely
 onBoot functionCallback after boot, receives result
object
" nomen: "boot in player.js"] player_js___Analysis___Summary__Refactoring__boot_____actions_js___player_js___Analysis___Summary__Config_injection____script_id__app_config___ [z: 2.375 @html: "
Config injection:
Each page has one jq expression that
produces all config as JSON:
 <script
id="app-config"
type="application/json">
¦{env: .site.env, siteVer: .site.ver,
siteHotkey: .site.hotkey, assetsURL:
("assets://icons/"|s4url),
mqBrokerURL: ("mq:/ws"|s4url),
dbSqliteURL:
("sqlite:/"|s4url),
remoteStateURL:
("state:/"|s4url),
crudURL: ("crud://"|s4url),
webhookUrlBase:
("webhook:/hooks"|s4url),
repoUrlBase: ("repo:/"|s4url),
protocolRouter: (.protocolRouter),
pages: (.site.menu.pages|keys)} |
tojson¦ </script> 

Note: .protocolRouter is passed through as-is (already a JSON
string from the jq context). boot() handles parsing it.
" nomen: "Config injection: `