now using setup.html for RT-Style setup
authorThomas Walker Lynch <eknp9n@reasoningtechnology.com>
Fri, 9 Oct 2026 08:51:23 +0000 (08:51 +0000)
committerThomas Walker Lynch <eknp9n@reasoningtechnology.com>
Fri, 9 Oct 2026 08:51:23 +0000 (08:51 +0000)
40 files changed:
administrator/document/RT-Manuscript_locator.js [deleted file]
administrator/document/how-to_release.html
developer/authored/Manuscript.copy/Document/RT-Manuscript_locator.js [deleted file]
developer/authored/Manuscript.copy/Document/design.html
developer/authored/Manuscript.copy/Document/user.html
developer/authored/Manuscript.copy/Locator/URL-only.js [deleted file]
developer/authored/Manuscript.copy/Locator/direct.js [deleted file]
developer/authored/Manuscript.copy/Locator/immediate.js [deleted file]
developer/authored/Manuscript.copy/Locator/indirect.js [deleted file]
developer/authored/Manuscript.copy/initialize.html [deleted file]
developer/authored/Manuscript.copy/setup.html [new file with mode: 0644]
developer/document/RT-Manuscript_locator.js [deleted file]
developer/document/RT-code-format-Lisp.html
developer/document/RT-code-format.html
developer/document/naming_file-and-directory.html
developer/document/single-file_C-module-and-namespace.html
document/RT-Manuscript_locator.js [deleted file]
document/introduction_Harmony.html
document/role-and-workflow_product-development.html
document/role-and-workflow_product-maintenance.html
shared/tool/version
tester/authored/Counter/RT-Manuscript_locator.js [deleted file]
tester/authored/Counter/test_0.html
tester/authored/Counter/test_1.html
tester/authored/Counter/test_2.html
tester/authored/Counter/test_3.html
tester/authored/Counter/test_4.html
tester/authored/Counter/test_5.html
tester/authored/Endnote/RT-Manuscript_locator.js [deleted file]
tester/authored/Endnote/test_0.html
tester/authored/Grid/RT-Manuscript_locator.js [deleted file]
tester/authored/Grid/test_dictionary.html
tester/authored/Grid/test_grid.html
tester/authored/Grid/test_matrix.html
tester/authored/Grid/test_relation.html
tester/authored/Note/RT-Manuscript_locator.js [deleted file]
tester/authored/Note/test_0.html
tester/authored/TOC/RT-Manuscript_locator.js [deleted file]
tester/authored/TOC/test_0.html
tester/authored/setup_file/test_0.html [new file with mode: 0644]

diff --git a/administrator/document/RT-Manuscript_locator.js b/administrator/document/RT-Manuscript_locator.js
deleted file mode 100644 (file)
index 4a1b936..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-  direct.js
-
-
-  We have four scenarios
-
-  immediate - used in the RT-style distribution itself (authored, consummer, staged)
-  direct - used in the RT-style project itself, but not in the distribution
-  indirect - the version all Harmony projects use
-  URL_only - always pulls style through a URL, a webserver must be present
-  
-*/
-
-window.RT = window.RT || {};
-
-(function() {
-  const project_name = "RT-Style"; 
-  const path = window.location.pathname;
-  const project_root_index = path.indexOf('/' + project_name + '/');
-  
-  if (project_root_index !== -1) {
-    // substring(0, x) excludes the trailing slash. We must prepend it to the payload.
-    const absolute_project_root = path.substring(0, project_root_index + project_name.length + 1);
-    window.RT.dirpr_library = absolute_project_root + "/consumer/Manuscript";
-  } else {
-    // Fallback for when served via local Python HTTP daemon from the project root
-    window.RT.dirpr_library = "../consumer/made/Manuscript";
-  }
-  
-  document.write(
-      '<script src="'
-      + window.RT.dirpr_library
-      + '/Core/RT-Manuscript_make.js"'
-      + '><\/script>'
-  );
-
-})();
index b564eb6..d3d437b 100644 (file)
@@ -5,7 +5,15 @@
   <head>
     <meta charset="UTF-8">
     <title>Release howto</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
diff --git a/developer/authored/Manuscript.copy/Document/RT-Manuscript_locator.js b/developer/authored/Manuscript.copy/Document/RT-Manuscript_locator.js
deleted file mode 100644 (file)
index 8863939..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
-  immediate.js
-
-  There are 4 variations for RT-Manuscript-locator.js:
-
-  URL_only - used by websites
-  indirect - used by Harmony projects, except for RT-Manuscript
-
-  immediate - used by RT-Manuscript in the distribution (authored, consummer, staged)
-  direct - used by RT-Manuscript project outside of the distribution, e.g. the main document directory
-*/
-
-window.RT = window.RT || {};
-
-(function() {
-  window.RT.dirpr_library = "..";
-  document.write(
-      '<script src="'
-      + window.RT.dirpr_library
-      + '/Core/RT-Manuscript_make.js"'
-      + '><\/script>'
-  );
-})();
index 7d39fef..68a61e8 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>RT Manuscript: Design & Implementation Manual</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index c5b36d1..597a722 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>RT Manuscript: User Manual</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
diff --git a/developer/authored/Manuscript.copy/Locator/URL-only.js b/developer/authored/Manuscript.copy/Locator/URL-only.js
deleted file mode 100644 (file)
index 7e67356..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-    URL_only.js
-
-  We have four scenarios
-
-  immediate - used in the RT-Style distribution itself (authored, consumer, staged)
-  direct - used in the RT-Style project itself, but not in the distribution
-  indirect - the version all Harmony projects use
-  URL-only - always pulls style through a URL, a webserver must be present
-*/
-
-window.RT = window.RT || {};
-
-(function() {
-  window.RT.dirpr_library = "https://style.ReasoningTechnology.com/Manuscript"; // Production URL
-  
-  document.write(
-      '<script src="'
-      + window.RT.dirpr_library
-      + '/Core/RT-Manuscript_make.js"'
-      + '><\/script>'
-  );
-
-})();
diff --git a/developer/authored/Manuscript.copy/Locator/direct.js b/developer/authored/Manuscript.copy/Locator/direct.js
deleted file mode 100644 (file)
index 4a1b936..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-  direct.js
-
-
-  We have four scenarios
-
-  immediate - used in the RT-style distribution itself (authored, consummer, staged)
-  direct - used in the RT-style project itself, but not in the distribution
-  indirect - the version all Harmony projects use
-  URL_only - always pulls style through a URL, a webserver must be present
-  
-*/
-
-window.RT = window.RT || {};
-
-(function() {
-  const project_name = "RT-Style"; 
-  const path = window.location.pathname;
-  const project_root_index = path.indexOf('/' + project_name + '/');
-  
-  if (project_root_index !== -1) {
-    // substring(0, x) excludes the trailing slash. We must prepend it to the payload.
-    const absolute_project_root = path.substring(0, project_root_index + project_name.length + 1);
-    window.RT.dirpr_library = absolute_project_root + "/consumer/Manuscript";
-  } else {
-    // Fallback for when served via local Python HTTP daemon from the project root
-    window.RT.dirpr_library = "../consumer/made/Manuscript";
-  }
-  
-  document.write(
-      '<script src="'
-      + window.RT.dirpr_library
-      + '/Core/RT-Manuscript_make.js"'
-      + '><\/script>'
-  );
-
-})();
diff --git a/developer/authored/Manuscript.copy/Locator/immediate.js b/developer/authored/Manuscript.copy/Locator/immediate.js
deleted file mode 100644 (file)
index 8863939..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
-  immediate.js
-
-  There are 4 variations for RT-Manuscript-locator.js:
-
-  URL_only - used by websites
-  indirect - used by Harmony projects, except for RT-Manuscript
-
-  immediate - used by RT-Manuscript in the distribution (authored, consummer, staged)
-  direct - used by RT-Manuscript project outside of the distribution, e.g. the main document directory
-*/
-
-window.RT = window.RT || {};
-
-(function() {
-  window.RT.dirpr_library = "..";
-  document.write(
-      '<script src="'
-      + window.RT.dirpr_library
-      + '/Core/RT-Manuscript_make.js"'
-      + '><\/script>'
-  );
-})();
diff --git a/developer/authored/Manuscript.copy/Locator/indirect.js b/developer/authored/Manuscript.copy/Locator/indirect.js
deleted file mode 100644 (file)
index 704752b..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
-  indirect.js
-
-  We have four scenarios
-
-  immediate - used in the RT-Style distribution itself (authored, consumer, staged)
-  direct - used in the RT-Style project itself, but not in the distribution
-  indirect - the version all Harmony projects use
-  URL-only - always pulls style through a URL, a webserver must be present
-  
-*/
-
-window.RT = window.RT || {};
-
-// --- Configuration ---
-// Define the consumer project name to allow dynamic local file:// calculation.
-window.RT.project_name = "Harmony"; 
-
-// Fallback URL when served over a network where the project root is not in the URI.
-window.RT.server_url = "http://localhost:8000/shared/linked-project/RT-Style/Manuscript";
-
-(function() {
-  let style_path = window.RT.server_url;
-
-  if (window.RT.project_name) {
-    const path = window.location.pathname;
-    const project_root_index = path.indexOf('/' + window.RT.project_name + '/');
-    
-    if (project_root_index !== -1) {
-      // substring(0, stop) extracts up to the project name, leaving off the trailing slash.
-      // We append the explicit forward slash before navigating into the shared boundary.
-      const absolute_project_root = path.substring(0, project_root_index + window.RT.project_name.length + 1);
-      
-      // The symlink 'RT-Style' already drops us inside the 'consumer/' directory, 
-      // so we proceed directly to 'Manuscript'.
-      style_path = absolute_project_root + "/shared/linked-project/RT-Style/Manuscript";
-    } else {
-      console.warn("RT-Style: Cannot locate project root '/" + window.RT.project_name + "/' in URI. Falling back to server_url.");
-    }
-  }
-  
-  window.RT.dirpr_library = style_path;
-  
-  document.write(
-      '<script src="'
-      + window.RT.dirpr_library
-      + '/Core/RT-Manuscript_make.js"'
-      + '><\/script>'
-  );
-  
-})();
diff --git a/developer/authored/Manuscript.copy/initialize.html b/developer/authored/Manuscript.copy/initialize.html
deleted file mode 100644 (file)
index db3c381..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-<!doctype html>
-<html lang="en">
-<head>
-<meta charset="utf-8">
-<title>RT-Manuscript initialize</title>
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<!--
-  RT-Manuscript_initialize.html
-
-  Sits in a Manuscript directory. Opening or reloading it from disk records
-  that directory in the browser as the RT-Manuscript library for local
-  documents. The last initializer opened or reloaded wins, so with several
-  installs open in tabs, reloading a tab selects its install.
-
-  The record is one localStorage key, shared by all file:// pages in Chrome:
-    RT.dirpr_library   the URL of this directory, without a trailing slash
-
-  Documents read it in their header block and fall back to the server when
-  it is absent.
-
-  This page does not use RT-Manuscript, so it works when the library is broken.
--->
-<style>
-  :root{ --bg: #fbfaf6; --fg: #222; --muted: #6b6b6b; --accent: #8a5a00; --button: #efe9da; --line: #d8d4c8; }
-  @media (prefers-color-scheme: dark){
-    :root{ --bg: #141414; --fg: #e8e2d0; --muted: #9a958a; --accent: #f0b000; --button: #2a2822; --line: #3a372f; }
-  }
-  body{ background: var(--bg); color: var(--fg); font: 16px/1.5 system-ui, sans-serif;
-        max-width: 48rem; margin: 2rem auto; padding: 0 1rem; }
-  h1{ color: var(--accent); font-size: 1.5rem; }
-  #message{ border-left: 4px solid var(--accent); padding: 0.5rem 0.9rem; margin: 1.5rem 0; }
-  code{ font-family: ui-monospace, monospace; font-size: 0.9em; word-break: break-all; }
-  button{ background: var(--button); color: var(--fg); border: 1px solid var(--line);
-          border-radius: 4px; padding: 0.25rem 0.7rem; font: inherit; cursor: pointer; }
-  .muted{ color: var(--muted); }
-</style>
-</head>
-<body>
-  <h1>RT-Manuscript initialize</h1>
-  <div id="message"></div>
-  <p>Local RT documents load RT-Manuscript from:<br><code id="current"></code></p>
-  <p><button id="uninstall">Uninstall</button></p>
-  <p class="muted">Reload an open document to apply a change. Reload this page to make
-  this directory the library again. With nothing recorded, documents load from
-  <code id="server"></code>.</p>
-
-<script>
-(function(){
-  const KEY = "RT.dirpr_library";
-  const SERVER = "https://style.ReasoningTechnology.com/Manuscript";
-  const el = id => document.getElementById(id);
-  el("server").textContent = SERVER;
-
-  function show(){
-    let v = null;
-    try{ v = localStorage.getItem(KEY); }catch(e){}
-    el("current").textContent = v || SERVER + "  (server)";
-  }
-
-  if(location.protocol !== "file:"){
-    el("message").textContent = "Open this page from disk (a file:// address). Nothing was recorded.";
-    el("uninstall").disabled = true;
-    show();
-    return;
-  }
-
-  const here = location.href.split("#")[0].split("?")[0].replace(/\/[^\/]*$/ ,"");
-
-  try{
-    const before = localStorage.getItem(KEY);
-    localStorage.setItem(KEY ,here);
-    el("message").textContent =
-      before === here ? "This directory is the RT-Manuscript library."
-      : before ? "Switched the RT-Manuscript library to this directory."
-      : "Installed. This directory is now the RT-Manuscript library.";
-  }catch(e){
-    el("message").textContent = "This browser blocks storage for local pages. Nothing was recorded.";
-  }
-
-  el("uninstall").onclick = () => {
-    try{ localStorage.removeItem(KEY); }catch(e){}
-    el("message").textContent = "Uninstalled. Documents now load from the server.";
-    show();
-  };
-
-  show();
-})();
-</script>
-</body>
-</html>
diff --git a/developer/authored/Manuscript.copy/setup.html b/developer/authored/Manuscript.copy/setup.html
new file mode 100644 (file)
index 0000000..6cf59ac
--- /dev/null
@@ -0,0 +1,90 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<title>RT-Manuscript setup</title>
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<!--
+  setup.html
+
+  Sits in a RT-Style Manuscript directory. Opening or reloading it from disk records
+  that directory in the browser as the RT-Manuscript library for local
+  documents. The last setup.html opened or reloaded wins, so with several
+  installs open in tabs, say for testing, reloading a tab selects its install.
+
+  The record is one localStorage key, shared by all file:// pages in Chrome:
+    RT.dirpr_library   the URL of this directory, without a trailing slash
+
+  Documents read it in their header block and fall back to the server when
+  it is absent.
+
+  This page does not use RT-Manuscript, so it works even when the library is broken.
+-->
+<style>
+  :root{ --bg: #fbfaf6; --fg: #222; --muted: #6b6b6b; --accent: #8a5a00; --button: #efe9da; --line: #d8d4c8; }
+  @media (prefers-color-scheme: dark){
+    :root{ --bg: #141414; --fg: #e8e2d0; --muted: #9a958a; --accent: #f0b000; --button: #2a2822; --line: #3a372f; }
+  }
+  body{ background: var(--bg); color: var(--fg); font: 16px/1.5 system-ui, sans-serif;
+        max-width: 48rem; margin: 2rem auto; padding: 0 1rem; }
+  h1{ color: var(--accent); font-size: 1.5rem; }
+  #message{ border-left: 4px solid var(--accent); padding: 0.5rem 0.9rem; margin: 1.5rem 0; }
+  code{ font-family: ui-monospace, monospace; font-size: 0.9em; word-break: break-all; }
+  button{ background: var(--button); color: var(--fg); border: 1px solid var(--line);
+          border-radius: 4px; padding: 0.25rem 0.7rem; font: inherit; cursor: pointer; }
+  .muted{ color: var(--muted); }
+</style>
+</head>
+<body>
+  <h1>RT-Manuscript initialize</h1>
+  <div id="message"></div>
+  <p>Local RT documents load RT-Manuscript from:<br><code id="current"></code></p>
+  <p><button id="uninstall">Uninstall</button></p>
+  <p class="muted">Reload an open document to apply a change. Reload this page to make
+  this directory the library again. With nothing recorded, documents load from
+  <code id="server"></code>.</p>
+
+<script>
+(function(){
+  const KEY = "RT.dirpr_library";
+  const SERVER = "https://style.ReasoningTechnology.com/Manuscript";
+  const el = id => document.getElementById(id);
+  el("server").textContent = SERVER;
+
+  function show(){
+    let v = null;
+    try{ v = localStorage.getItem(KEY); }catch(e){}
+    el("current").textContent = v || SERVER + "  (server)";
+  }
+
+  if(location.protocol !== "file:"){
+    el("message").textContent = "Open this page from disk (a file:// address). Nothing was recorded.";
+    el("uninstall").disabled = true;
+    show();
+    return;
+  }
+
+  const here = location.href.split("#")[0].split("?")[0].replace(/\/[^\/]*$/ ,"");
+
+  try{
+    const before = localStorage.getItem(KEY);
+    localStorage.setItem(KEY ,here);
+    el("message").textContent =
+      before === here ? "This directory is the RT-Manuscript library."
+      : before ? "Switched the RT-Manuscript library to this directory."
+      : "Installed. This directory is now the RT-Manuscript library.";
+  }catch(e){
+    el("message").textContent = "This browser blocks storage for local pages. Nothing was recorded.";
+  }
+
+  el("uninstall").onclick = () => {
+    try{ localStorage.removeItem(KEY); }catch(e){}
+    el("message").textContent = "Uninstalled. Documents now load from the server.";
+    show();
+  };
+
+  show();
+})();
+</script>
+</body>
+</html>
diff --git a/developer/document/RT-Manuscript_locator.js b/developer/document/RT-Manuscript_locator.js
deleted file mode 100644 (file)
index 4a1b936..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-  direct.js
-
-
-  We have four scenarios
-
-  immediate - used in the RT-style distribution itself (authored, consummer, staged)
-  direct - used in the RT-style project itself, but not in the distribution
-  indirect - the version all Harmony projects use
-  URL_only - always pulls style through a URL, a webserver must be present
-  
-*/
-
-window.RT = window.RT || {};
-
-(function() {
-  const project_name = "RT-Style"; 
-  const path = window.location.pathname;
-  const project_root_index = path.indexOf('/' + project_name + '/');
-  
-  if (project_root_index !== -1) {
-    // substring(0, x) excludes the trailing slash. We must prepend it to the payload.
-    const absolute_project_root = path.substring(0, project_root_index + project_name.length + 1);
-    window.RT.dirpr_library = absolute_project_root + "/consumer/Manuscript";
-  } else {
-    // Fallback for when served via local Python HTTP daemon from the project root
-    window.RT.dirpr_library = "../consumer/made/Manuscript";
-  }
-  
-  document.write(
-      '<script src="'
-      + window.RT.dirpr_library
-      + '/Core/RT-Manuscript_make.js"'
-      + '><\/script>'
-  );
-
-})();
index 9655cbd..a4ff863 100644 (file)
@@ -5,7 +5,15 @@
   <head>
     <meta charset="UTF-8">
     <title>RT Code Format: Lisp Addendum</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index e42ee2e..b16702f 100644 (file)
@@ -5,7 +5,15 @@
   <head>
     <meta charset="UTF-8">
     <title>RT code format conventions</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index 54e8dc8..8adc549 100644 (file)
@@ -5,7 +5,15 @@
   <head>
     <meta charset="UTF-8">
     <title>File and directory naming conventions</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index 1782008..0e6cd17 100644 (file)
@@ -5,7 +5,15 @@
   <head>
     <meta charset="UTF-8">
     <title>C modules, namespaces, and the build lifecycle</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
diff --git a/document/RT-Manuscript_locator.js b/document/RT-Manuscript_locator.js
deleted file mode 100644 (file)
index 4a1b936..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-  direct.js
-
-
-  We have four scenarios
-
-  immediate - used in the RT-style distribution itself (authored, consummer, staged)
-  direct - used in the RT-style project itself, but not in the distribution
-  indirect - the version all Harmony projects use
-  URL_only - always pulls style through a URL, a webserver must be present
-  
-*/
-
-window.RT = window.RT || {};
-
-(function() {
-  const project_name = "RT-Style"; 
-  const path = window.location.pathname;
-  const project_root_index = path.indexOf('/' + project_name + '/');
-  
-  if (project_root_index !== -1) {
-    // substring(0, x) excludes the trailing slash. We must prepend it to the payload.
-    const absolute_project_root = path.substring(0, project_root_index + project_name.length + 1);
-    window.RT.dirpr_library = absolute_project_root + "/consumer/Manuscript";
-  } else {
-    // Fallback for when served via local Python HTTP daemon from the project root
-    window.RT.dirpr_library = "../consumer/made/Manuscript";
-  }
-  
-  document.write(
-      '<script src="'
-      + window.RT.dirpr_library
-      + '/Core/RT-Manuscript_make.js"'
-      + '><\/script>'
-  );
-
-})();
index 96cbbd8..4271b0b 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>Introduction to Harmony</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index bede081..a15ab9c 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>Product development roles and workflow</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index 803e132..e93f12d 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>Product maintenance roles and workflow</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index 40aed1e..9d3b10b 100755 (executable)
@@ -1,4 +1,4 @@
-echo "RT-Style v5.4 2026-08-28 03:00:50 Z"
+echo "RT-Style v6.0 2026-10-09 08:50:19 Z"
 echo "Harmony v3.3 2026-06-21 13:20:18 Z"
 
 
diff --git a/tester/authored/Counter/RT-Manuscript_locator.js b/tester/authored/Counter/RT-Manuscript_locator.js
deleted file mode 100644 (file)
index 4a1b936..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-  direct.js
-
-
-  We have four scenarios
-
-  immediate - used in the RT-style distribution itself (authored, consummer, staged)
-  direct - used in the RT-style project itself, but not in the distribution
-  indirect - the version all Harmony projects use
-  URL_only - always pulls style through a URL, a webserver must be present
-  
-*/
-
-window.RT = window.RT || {};
-
-(function() {
-  const project_name = "RT-Style"; 
-  const path = window.location.pathname;
-  const project_root_index = path.indexOf('/' + project_name + '/');
-  
-  if (project_root_index !== -1) {
-    // substring(0, x) excludes the trailing slash. We must prepend it to the payload.
-    const absolute_project_root = path.substring(0, project_root_index + project_name.length + 1);
-    window.RT.dirpr_library = absolute_project_root + "/consumer/Manuscript";
-  } else {
-    // Fallback for when served via local Python HTTP daemon from the project root
-    window.RT.dirpr_library = "../consumer/made/Manuscript";
-  }
-  
-  document.write(
-      '<script src="'
-      + window.RT.dirpr_library
-      + '/Core/RT-Manuscript_make.js"'
-      + '><\/script>'
-  );
-
-})();
index 508fe0a..2badb58 100644 (file)
@@ -49,7 +49,15 @@ snapshot() == (between ,[1])
   <head>
     <meta charset="UTF-8">
     <title>Counter Status Machine Diagnostics</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index 08cf6d2..f14abe3 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>Counter Status Machine Diagnostics (Outline Style)</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index 1f47d53..fb4e1cc 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>Counter Status Machine Diagnostics (Milestone Mode)</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index e781837..67da1c0 100644 (file)
@@ -8,7 +8,15 @@ uses manual primitive page breaks and hard coded splits and continuations
   <head>
     <meta charset="UTF-8">
     <title>Counter 3-Page Continuation Test</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index 65e75b7..f9ff396 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>Counter Split Continuation Test</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index 2e914e1..0f01f9a 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>Counter Named Step Test</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
diff --git a/tester/authored/Endnote/RT-Manuscript_locator.js b/tester/authored/Endnote/RT-Manuscript_locator.js
deleted file mode 100644 (file)
index 4a1b936..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-  direct.js
-
-
-  We have four scenarios
-
-  immediate - used in the RT-style distribution itself (authored, consummer, staged)
-  direct - used in the RT-style project itself, but not in the distribution
-  indirect - the version all Harmony projects use
-  URL_only - always pulls style through a URL, a webserver must be present
-  
-*/
-
-window.RT = window.RT || {};
-
-(function() {
-  const project_name = "RT-Style"; 
-  const path = window.location.pathname;
-  const project_root_index = path.indexOf('/' + project_name + '/');
-  
-  if (project_root_index !== -1) {
-    // substring(0, x) excludes the trailing slash. We must prepend it to the payload.
-    const absolute_project_root = path.substring(0, project_root_index + project_name.length + 1);
-    window.RT.dirpr_library = absolute_project_root + "/consumer/Manuscript";
-  } else {
-    // Fallback for when served via local Python HTTP daemon from the project root
-    window.RT.dirpr_library = "../consumer/made/Manuscript";
-  }
-  
-  document.write(
-      '<script src="'
-      + window.RT.dirpr_library
-      + '/Core/RT-Manuscript_make.js"'
-      + '><\/script>'
-  );
-
-})();
index 5ea051d..5c7db33 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>Endnote Integration Diagnostics</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
diff --git a/tester/authored/Grid/RT-Manuscript_locator.js b/tester/authored/Grid/RT-Manuscript_locator.js
deleted file mode 100644 (file)
index 4a1b936..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-  direct.js
-
-
-  We have four scenarios
-
-  immediate - used in the RT-style distribution itself (authored, consummer, staged)
-  direct - used in the RT-style project itself, but not in the distribution
-  indirect - the version all Harmony projects use
-  URL_only - always pulls style through a URL, a webserver must be present
-  
-*/
-
-window.RT = window.RT || {};
-
-(function() {
-  const project_name = "RT-Style"; 
-  const path = window.location.pathname;
-  const project_root_index = path.indexOf('/' + project_name + '/');
-  
-  if (project_root_index !== -1) {
-    // substring(0, x) excludes the trailing slash. We must prepend it to the payload.
-    const absolute_project_root = path.substring(0, project_root_index + project_name.length + 1);
-    window.RT.dirpr_library = absolute_project_root + "/consumer/Manuscript";
-  } else {
-    // Fallback for when served via local Python HTTP daemon from the project root
-    window.RT.dirpr_library = "../consumer/made/Manuscript";
-  }
-  
-  document.write(
-      '<script src="'
-      + window.RT.dirpr_library
-      + '/Core/RT-Manuscript_make.js"'
-      + '><\/script>'
-  );
-
-})();
index 070488a..7a3a34a 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>Test: RT Dictionary</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index a4993f1..031a452 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>Test: RT Grid Primitive</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index 1ed44d8..5027ccc 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>Test: RT Matrix</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
index d897a9b..d3042bd 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>Test: RT Relation</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
diff --git a/tester/authored/Note/RT-Manuscript_locator.js b/tester/authored/Note/RT-Manuscript_locator.js
deleted file mode 100644 (file)
index 4a1b936..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-  direct.js
-
-
-  We have four scenarios
-
-  immediate - used in the RT-style distribution itself (authored, consummer, staged)
-  direct - used in the RT-style project itself, but not in the distribution
-  indirect - the version all Harmony projects use
-  URL_only - always pulls style through a URL, a webserver must be present
-  
-*/
-
-window.RT = window.RT || {};
-
-(function() {
-  const project_name = "RT-Style"; 
-  const path = window.location.pathname;
-  const project_root_index = path.indexOf('/' + project_name + '/');
-  
-  if (project_root_index !== -1) {
-    // substring(0, x) excludes the trailing slash. We must prepend it to the payload.
-    const absolute_project_root = path.substring(0, project_root_index + project_name.length + 1);
-    window.RT.dirpr_library = absolute_project_root + "/consumer/Manuscript";
-  } else {
-    // Fallback for when served via local Python HTTP daemon from the project root
-    window.RT.dirpr_library = "../consumer/made/Manuscript";
-  }
-  
-  document.write(
-      '<script src="'
-      + window.RT.dirpr_library
-      + '/Core/RT-Manuscript_make.js"'
-      + '><\/script>'
-  );
-
-})();
index e5985d1..8d5d007 100644 (file)
@@ -3,7 +3,15 @@
   <head>
     <meta charset="UTF-8">
     <title>Note Integration Diagnostics</title>
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
diff --git a/tester/authored/TOC/RT-Manuscript_locator.js b/tester/authored/TOC/RT-Manuscript_locator.js
deleted file mode 100644 (file)
index 4a1b936..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
-  direct.js
-
-
-  We have four scenarios
-
-  immediate - used in the RT-style distribution itself (authored, consummer, staged)
-  direct - used in the RT-style project itself, but not in the distribution
-  indirect - the version all Harmony projects use
-  URL_only - always pulls style through a URL, a webserver must be present
-  
-*/
-
-window.RT = window.RT || {};
-
-(function() {
-  const project_name = "RT-Style"; 
-  const path = window.location.pathname;
-  const project_root_index = path.indexOf('/' + project_name + '/');
-  
-  if (project_root_index !== -1) {
-    // substring(0, x) excludes the trailing slash. We must prepend it to the payload.
-    const absolute_project_root = path.substring(0, project_root_index + project_name.length + 1);
-    window.RT.dirpr_library = absolute_project_root + "/consumer/Manuscript";
-  } else {
-    // Fallback for when served via local Python HTTP daemon from the project root
-    window.RT.dirpr_library = "../consumer/made/Manuscript";
-  }
-  
-  document.write(
-      '<script src="'
-      + window.RT.dirpr_library
-      + '/Core/RT-Manuscript_make.js"'
-      + '><\/script>'
-  );
-
-})();
index c2673a3..883b79c 100644 (file)
@@ -4,7 +4,15 @@
     <meta charset="UTF-8">
     <title>Test 0: Table of Contents</title>
     <!-- Adjust the locator path relative to the specific tester/authored subdirectory -->
-    <script src="RT-Manuscript_locator.js"></script>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
     <script>
       window.RT.theme_preference('inverse_wheat');
       window.RT.load('Layout/paginate');
diff --git a/tester/authored/setup_file/test_0.html b/tester/authored/setup_file/test_0.html
new file mode 100644 (file)
index 0000000..d39690f
--- /dev/null
@@ -0,0 +1,118 @@
+<!-- library location test
+
+Checks the header block that locates the RT-Manuscript library, and the
+initializer that records it.
+
+  stored  = localStorage "RT.dirpr_library", written by RT-Style Manuscript setup.html
+  server  = https://style.ReasoningTechnology.com/Manuscript
+  used    = RT.dirpr_library after the header block
+
+Automatic checks, made while the page parses:
+
+  1. used == stored, or used == server when nothing is stored
+  2. the engine ran: RT.load and RT.Module exist
+  3. every engine script on the page came from used, so no install is mixed with another
+
+Manual procedure, with two installs A and B (for example the authored
+Manuscript.copy and consumer/Manuscript):
+
+  open A's initializer, reload this page   -> used == A, checks pass
+  open B's initializer, reload this page   -> used == B, checks pass
+  reload A's initializer tab, reload this  -> used == A
+  Uninstall in either initializer, reload  -> used == server
+  record a directory that does not exist   -> page does not format; the plain
+                                              text report still shows used
+
+The report is written as plain text during parsing, so it can be read when
+the engine fails to load.
+-->
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8">
+    <title>Library Location</title>
+    <script>
+      {
+        let dirpr_library = null;
+        try{ dirpr_library = localStorage.getItem("RT.dirpr_library"); }catch(e){}
+        window.RT = window.RT || {};
+        RT.dirpr_library = RT.dirpr_library || dirpr_library || "https://style.ReasoningTechnology.com/Manuscript";
+        document.write('<script src="' + RT.dirpr_library + '/Core/RT-Manuscript_make.js"><\/script>');
+      }
+    </script>
+    <script>
+      window.RT.theme_preference('inverse_wheat');
+      window.RT.load('Layout/paginate');
+      window.RT.load('Layout/article_tech_ref');
+      window.RT.load('Element/theme_selector');
+    </script>
+    <style>
+      .line { margin-bottom: 0.5rem; font-family: monospace; word-break: break-all; }
+      .comment { color: #6a9955; }
+      .pass { color: #4caf50; font-weight: bold; }
+      .fail { color: #e53935; font-weight: bold; }
+      .line a { color: #6fa8dc; }
+    </style>
+  </head>
+  <body>
+    <RT·theme-selector></RT·theme-selector>
+    <RT·article>
+      <RT·title
+        author="Thomas Walker Lynch"
+        date="2026-10-09"
+        title="Library Location">
+      </RT·title>
+
+      <script>
+        {
+          const SERVER = "https://style.ReasoningTechnology.com/Manuscript";
+          const esc = s => String(s).replace(/&/g ,"&amp;").replace(/</g ,"&lt;");
+
+          let stored = null ,storage_ok = true;
+          try{ stored = localStorage.getItem("RT.dirpr_library"); }catch(e){ storage_ok = false; }
+
+          const used = window.RT && window.RT.dirpr_library;
+          const expected = stored || SERVER;
+
+          const engine_scripts = Array.from(document.scripts)
+            .map(s => s.getAttribute("src"))
+            .filter(src => src && /\/(Core|Layout|Element|Theme|Math)\//.test(src));
+          const foreign = engine_scripts.filter(src => !src.startsWith(used + "/"));
+
+          const checks = [
+            ["header chose " + (stored ? "the stored library" : "the server")
+              ,used === expected]
+            ,["engine ran (RT.load and RT.Module exist)"
+              ,!!(window.RT && typeof window.RT.load === "function" && window.RT.Module)]
+            ,["all " + engine_scripts.length + " engine scripts came from the chosen library"
+              ,engine_scripts.length > 0 && foreign.length === 0]
+          ];
+
+          const line = (label ,value) =>
+            '<div class="line"><span class="comment">// ' + esc(label) + '</span><br>' + esc(value) + '</div>';
+
+          let html = "";
+          html += line("stored (localStorage RT.dirpr_library)"
+                       ,storage_ok ? (stored || "(nothing stored)") : "(storage blocked)");
+          html += line("used (RT.dirpr_library)" ,used);
+          html += line("source" ,used === SERVER ? "server" : "local install");
+          for(const [label ,ok] of checks){
+            html += '<div class="line"><span class="' + (ok ? 'pass">PASS' : 'fail">FAIL')
+                  + '</span> ' + esc(label) + '</div>';
+          }
+          if(foreign.length) html += line("scripts from elsewhere" ,foreign.join("\n"));
+          if(used !== SERVER){
+            html += '<div class="line"><span class="comment">// initializer for this library</span><br>'
+                  + '<a href="' + esc(used) + '/RT-Manuscript_initialize.html">'
+                  + esc(used) + '/RT-Manuscript_initialize.html</a></div>';
+          }
+          document.write(html);
+
+          console.log("Library location test:" ,{stored ,used ,engine_scripts ,foreign
+            ,pass: checks.every(c => c[1])});
+        }
+      </script>
+
+    </RT·article>
+  </body>
+</html>