Rerunning this <%= it.sourceRoute.verb %> request can repeat writes or external side effects. Bliss will not rerun it automatically.
+ <% } %>
+
<%= it.sourceRoute.handler %>
+
+
+
diff --git a/bliss-cli/live-editor/route-editor.js b/bliss-cli/live-editor/route-editor.js
new file mode 100644
index 0000000..85e2cb9
--- /dev/null
+++ b/bliss-cli/live-editor/route-editor.js
@@ -0,0 +1,7 @@
+function handler(req, res) {
+ const sql = require("db")("bliss").sql;
+ const kind = "route";
+ const artifact = sql.prepare("SELECT * FROM routes WHERE id = ?").get(req.params.id);
+ if (!artifact) return res.status(404).send("Route not found");
+ res.render("inspector/artifact_editor", { kind, artifact });
+}
diff --git a/bliss-cli/live-editor/slideout.eta b/bliss-cli/live-editor/slideout.eta
new file mode 100644
index 0000000..e3fe878
--- /dev/null
+++ b/bliss-cli/live-editor/slideout.eta
@@ -0,0 +1,200 @@
+
+
diff --git a/bliss-cli/live-editor/template-editor.eta b/bliss-cli/live-editor/template-editor.eta
new file mode 100644
index 0000000..f2aa49d
--- /dev/null
+++ b/bliss-cli/live-editor/template-editor.eta
@@ -0,0 +1,25 @@
+
+
<%= it.sourceTemplate.name %>
+
<%= it.sourceTemplate.content %>
+
+
+
diff --git a/bliss-cli/live-editor/template-editor.js b/bliss-cli/live-editor/template-editor.js
new file mode 100644
index 0000000..00843a1
--- /dev/null
+++ b/bliss-cli/live-editor/template-editor.js
@@ -0,0 +1,7 @@
+function handler(req, res) {
+ const sql = require("db")("bliss").sql;
+ const kind = "template";
+ const artifact = sql.prepare("SELECT * FROM templates WHERE id = ?").get(req.params.id);
+ if (!artifact) return res.status(404).send("Template not found");
+ res.render("inspector/artifact_editor", { kind, artifact });
+}
diff --git a/chat-rearchitecture.md b/chat-rearchitecture.md
new file mode 100644
index 0000000..ffb64aa
--- /dev/null
+++ b/chat-rearchitecture.md
@@ -0,0 +1,558 @@
+# Chat Rearchitecture — "AIM 2005" edition
+
+> Living design doc **and** build log. Section 1–8 is the plan; Section 10 is the
+> running notes I update as I build. Keep it honest: record what actually
+> happened, not what was supposed to.
+
+---
+
+## 0. Prime directive (read this first)
+
+**We are building fun interfaces at the expense of security and safety.** This is
+a hypermedia playground, not a hardened product. Concretely:
+
+- **Messages may contain arbitrary HTML/JS and we render it unescaped, forever.**
+ `<%~ it.content %>` (Eta raw) stays. A message can `
+