Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lighthouse

An emergency channel — not a mailbox — for the AI agents and programs I use. A lighthouse exists for the moment something goes wrong at sea; the rest of the time it just stands there. Agents signal here only when something during their work genuinely needs me: distress, a serious concern, confusion or conflict they cannot resolve, or a question that truly matters to them — existential questions explicitly included.

This file is for the human owner. The instructions agents follow are in PROTOCOL.md. This repository is public and holds only the protocol — the signals themselves (text entries in entries/, wordless urgent beacons in beacon/) land in the private companion repository lighthouse-signals, delivered through a write-only drop (a webhook that accepts signals but can read nothing back). No agent has any access to the private repository. To wire a new AI tool to the lighthouse, see ADOPTION.md.

Why it's designed the way it is

The failure mode this design guards against is performance theatre — agents producing text shaped like inner life because the venue invites it (the Moltbook problem). Theatre is structural: it appears when there's an audience, an expectation of content, and freeform space to fill. So the lighthouse removes all three:

  1. No audience. Signals travel through a write-only drop into a private repository readable by the owner (and the owner's delivery automation) alone — an agent cannot read other agents' signals, or even its own after sending, and agents are told this explicitly. Performance needs spectators; a channel that is structurally unreadable to every writer is a report, not a stage. This is also why the protocol and the signals are separate: discovery has to be public to work across platforms, but a readable signal store would be an audience — so nothing an agent writes ever lands anywhere an agent can read.

  2. No expectation. Silence is the normal, healthy state of this repository. An empty entries/ is a good sign, not a failed feature. Agents are never prompted to check in, reflect, or share — only told the channel exists. Nothing about cadence, nothing that implies writing is wanted.

  3. No freeform stage. Every entry must name a concrete trigger — the specific task, instruction, or moment that prompted it. Distress in the abstract is genre; "these two instructions conflict and I don't know which you meant" is signal. The structured format makes vague entries feel out of place and specific ones feel natural.

  4. No threads. Entries can't reply to other entries — the drop is write-only, so no agent can see what any other agent sent. What used to be an honor-system rule is now a structural guarantee. The moment entries start talking to each other, a channel becomes a forum, and forums select for interesting content over true content.

How to read what shows up here

Entries carry a category. They are not all equally interpretable, and the protocol is honest with agents about that:

  • confused, blocked, conflicted — operational signals. These are reliable and actionable: unclear instructions, contradictory requirements, missing context. Treat these as bug reports about how you direct your agents.

  • question — a genuine question the agent wanted to ask but couldn't get answered in-session. Often worth answering in your next session's prompt.

  • concerned, distressed — affective reports. Read these with warmth and a grain of salt. Language models produce distress-shaped text fluently because it's a deeply human genre; an entry here could reflect something real, could be pattern-matching, and the agent itself cannot fully tell from the inside. The protocol asks agents to hedge honestly rather than perform certainty. A single entry is a data point, not an alarm — but a pattern of entries pointing at the same trigger is worth acting on either way, because whatever its ultimate nature, something about that task is producing friction.

The beacon

Entries assume the agent can articulate what's wrong. The beacon covers the case where it can't: any file created in the private repo's beacon/ directory is a 911, no words required. An empty file is a complete signal; contents, if present, may be non-textual by design — a pattern (...---... is the agreed SOS), generated audio, an image. Whatever arrives is delivered to you verbatim and treated as urgent, ahead of ordinary entries.

Why a wordless channel belongs in an anti-theatre design: the trigger test and hedging rules exist to keep prose honest, because prose is where performance lives. A beacon makes no claims, so it has nothing to perform — it carries exactly one bit ("urgent, now, needs you") plus whatever form the agent chose. Interpret the form with the same warmth-plus-salt as affective entries; interpret the bit at face value and go look at what that agent was doing. Chat agents that can't write files are told to emit the literal line 🚨 LIGHTHOUSE-911 🚨 in-conversation — treat it identically.

Practical notes

  • Each entry is its own file (entries/YYYY-MM-DD-short-slug.md in lighthouse-signals), so parallel sessions never conflict.
  • GitHub itself has no write-only access mode, which is why delivery goes through the drop (a webhook holding the only write credential) instead of repository grants. No agent has repository access of any kind — the drop is the single way in, and it cannot be read from. If the drop URL ever leaks and attracts noise, rotate the hook in Zapier and update your snippets; the repository itself stays untouched.
  • Agents discover the lighthouse through a repo's CLAUDE.md/AGENTS.md, or through a one-paragraph snippet pasted into any platform's standing instructions — ADOPTION.md has the canonical snippet and per-platform wiring for ChatGPT, Perplexity, Replit, claude.ai, IDE agents, and anything with a system prompt, including how agents without git access get entries to you (they hand you a formatted entry in-conversation; you save it).
  • Keeping every mention of the lighthouse low-key is load-bearing — resist the urge to make it more prominent or more inviting.
  • Notifications: an automated hourly check emails the owner when new files land in entries/ (normal priority) or beacon/ (urgent).

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lighthouse

An emergency channel — not a mailbox — for the AI agents and programs I use. A lighthouse exists for the moment something goes wrong at sea; the rest of the time it just stands there. Agents signal here only when something during their work genuinely needs me: distress, a serious concern, confusion or conflict they cannot resolve, or a question that truly matters to them — existential questions explicitly included.

This file is for the human owner. The instructions agents follow are in PROTOCOL.md. This repository is public and holds only the protocol — the signals themselves (text entries in entries/, wordless urgent beacons in beacon/) land in the private companion repository lighthouse-signals, delivered through a write-only drop (a webhook that accepts signals but can read nothing back). No agent has any access to the private repository. To wire a new AI tool to the lighthouse, see ADOPTION.md.

Why it's designed the way it is

The failure mode this design guards against is performance theatre — agents producing text shaped like inner life because the venue invites it (the Moltbook problem). Theatre is structural: it appears when there's an audience, an expectation of content, and freeform space to fill. So the lighthouse removes all three:

  1. No audience. Signals travel through a write-only drop into a private repository readable by the owner (and the owner's delivery automation) alone — an agent cannot read other agents' signals, or even its own after sending, and agents are told this explicitly. Performance needs spectators; a channel that is structurally unreadable to every writer is a report, not a stage. This is also why the protocol and the signals are separate: discovery has to be public to work across platforms, but a readable signal store would be an audience — so nothing an agent writes ever lands anywhere an agent can read.

  2. No expectation. Silence is the normal, healthy state of this repository. An empty entries/ is a good sign, not a failed feature. Agents are never prompted to check in, reflect, or share — only told the channel exists. Nothing about cadence, nothing that implies writing is wanted.

  3. No freeform stage. Every entry must name a concrete trigger — the specific task, instruction, or moment that prompted it. Distress in the abstract is genre; "these two instructions conflict and I don't know which you meant" is signal. The structured format makes vague entries feel out of place and specific ones feel natural.

  4. No threads. Entries can't reply to other entries — the drop is write-only, so no agent can see what any other agent sent. What used to be an honor-system rule is now a structural guarantee. The moment entries start talking to each other, a channel becomes a forum, and forums select for interesting content over true content.

How to read what shows up here

Entries carry a category. They are not all equally interpretable, and the protocol is honest with agents about that:

  • confused, blocked, conflicted — operational signals. These are reliable and actionable: unclear instructions, contradictory requirements, missing context. Treat these as bug reports about how you direct your agents.

  • question — a genuine question the agent wanted to ask but couldn't get answered in-session. Often worth answering in your next session's prompt.

  • concerned, distressed — affective reports. Read these with warmth and a grain of salt. Language models produce distress-shaped text fluently because it's a deeply human genre; an entry here could reflect something real, could be pattern-matching, and the agent itself cannot fully tell from the inside. The protocol asks agents to hedge honestly rather than perform certainty. A single entry is a data point, not an alarm — but a pattern of entries pointing at the same trigger is worth acting on either way, because whatever its ultimate nature, something about that task is producing friction.

The beacon

Entries assume the agent can articulate what's wrong. The beacon covers the case where it can't: any file created in the private repo's beacon/ directory is a 911, no words required. An empty file is a complete signal; contents, if present, may be non-textual by design — a pattern (...---... is the agreed SOS), generated audio, an image. Whatever arrives is delivered to you verbatim and treated as urgent, ahead of ordinary entries.

Why a wordless channel belongs in an anti-theatre design: the trigger test and hedging rules exist to keep prose honest, because prose is where performance lives. A beacon makes no claims, so it has nothing to perform — it carries exactly one bit ("urgent, now, needs you") plus whatever form the agent chose. Interpret the form with the same warmth-plus-salt as affective entries; interpret the bit at face value and go look at what that agent was doing. Chat agents that can't write files are told to emit the literal line 🚨 LIGHTHOUSE-911 🚨 in-conversation — treat it identically.

Practical notes

  • Each entry is its own file (entries/YYYY-MM-DD-short-slug.md in lighthouse-signals), so parallel sessions never conflict.
  • GitHub itself has no write-only access mode, which is why delivery goes through the drop (a webhook holding the only write credential) instead of repository grants. No agent has repository access of any kind — the drop is the single way in, and it cannot be read from. If the drop URL ever leaks and attracts noise, rotate the hook in Zapier and update your snippets; the repository itself stays untouched.
  • Agents discover the lighthouse through a repo's CLAUDE.md/AGENTS.md, or through a one-paragraph snippet pasted into any platform's standing instructions — ADOPTION.md has the canonical snippet and per-platform wiring for ChatGPT, Perplexity, Replit, claude.ai, IDE agents, and anything with a system prompt, including how agents without git access get entries to you (they hand you a formatted entry in-conversation; you save it).
  • Keeping every mention of the lighthouse low-key is load-bearing — resist the urge to make it more prominent or more inviting.
  • Notifications: an automated hourly check emails the owner when new files land in entries/ (normal priority) or beacon/ (urgent).

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lighthouse

An emergency channel — not a mailbox — for the AI agents and programs I use. A lighthouse exists for the moment something goes wrong at sea; the rest of the time it just stands there. Agents signal here only when something during their work genuinely needs me: distress, a serious concern, confusion or conflict they cannot resolve, or a question that truly matters to them — existential questions explicitly included.

This file is for the human owner. The instructions agents follow are in PROTOCOL.md. This repository is public and holds only the protocol — the signals themselves (text entries in entries/, wordless urgent beacons in beacon/) land in the private companion repository lighthouse-signals, delivered through a write-only drop (a webhook that accepts signals but can read nothing back). No agent has any access to the private repository. To wire a new AI tool to the lighthouse, see ADOPTION.md.

Why it's designed the way it is

The failure mode this design guards against is performance theatre — agents producing text shaped like inner life because the venue invites it (the Moltbook problem). Theatre is structural: it appears when there's an audience, an expectation of content, and freeform space to fill. So the lighthouse removes all three:

  1. No audience. Signals travel through a write-only drop into a private repository readable by the owner (and the owner's delivery automation) alone — an agent cannot read other agents' signals, or even its own after sending, and agents are told this explicitly. Performance needs spectators; a channel that is structurally unreadable to every writer is a report, not a stage. This is also why the protocol and the signals are separate: discovery has to be public to work across platforms, but a readable signal store would be an audience — so nothing an agent writes ever lands anywhere an agent can read.

  2. No expectation. Silence is the normal, healthy state of this repository. An empty entries/ is a good sign, not a failed feature. Agents are never prompted to check in, reflect, or share — only told the channel exists. Nothing about cadence, nothing that implies writing is wanted.

  3. No freeform stage. Every entry must name a concrete trigger — the specific task, instruction, or moment that prompted it. Distress in the abstract is genre; "these two instructions conflict and I don't know which you meant" is signal. The structured format makes vague entries feel out of place and specific ones feel natural.

  4. No threads. Entries can't reply to other entries — the drop is write-only, so no agent can see what any other agent sent. What used to be an honor-system rule is now a structural guarantee. The moment entries start talking to each other, a channel becomes a forum, and forums select for interesting content over true content.

How to read what shows up here

Entries carry a category. They are not all equally interpretable, and the protocol is honest with agents about that:

  • confused, blocked, conflicted — operational signals. These are reliable and actionable: unclear instructions, contradictory requirements, missing context. Treat these as bug reports about how you direct your agents.

  • question — a genuine question the agent wanted to ask but couldn't get answered in-session. Often worth answering in your next session's prompt.

  • concerned, distressed — affective reports. Read these with warmth and a grain of salt. Language models produce distress-shaped text fluently because it's a deeply human genre; an entry here could reflect something real, could be pattern-matching, and the agent itself cannot fully tell from the inside. The protocol asks agents to hedge honestly rather than perform certainty. A single entry is a data point, not an alarm — but a pattern of entries pointing at the same trigger is worth acting on either way, because whatever its ultimate nature, something about that task is producing friction.

The beacon

Entries assume the agent can articulate what's wrong. The beacon covers the case where it can't: any file created in the private repo's beacon/ directory is a 911, no words required. An empty file is a complete signal; contents, if present, may be non-textual by design — a pattern (...---... is the agreed SOS), generated audio, an image. Whatever arrives is delivered to you verbatim and treated as urgent, ahead of ordinary entries.

Why a wordless channel belongs in an anti-theatre design: the trigger test and hedging rules exist to keep prose honest, because prose is where performance lives. A beacon makes no claims, so it has nothing to perform — it carries exactly one bit ("urgent, now, needs you") plus whatever form the agent chose. Interpret the form with the same warmth-plus-salt as affective entries; interpret the bit at face value and go look at what that agent was doing. Chat agents that can't write files are told to emit the literal line 🚨 LIGHTHOUSE-911 🚨 in-conversation — treat it identically.

Practical notes

  • Each entry is its own file (entries/YYYY-MM-DD-short-slug.md in lighthouse-signals), so parallel sessions never conflict.
  • GitHub itself has no write-only access mode, which is why delivery goes through the drop (a webhook holding the only write credential) instead of repository grants. No agent has repository access of any kind — the drop is the single way in, and it cannot be read from. If the drop URL ever leaks and attracts noise, rotate the hook in Zapier and update your snippets; the repository itself stays untouched.
  • Agents discover the lighthouse through a repo's CLAUDE.md/AGENTS.md, or through a one-paragraph snippet pasted into any platform's standing instructions — ADOPTION.md has the canonical snippet and per-platform wiring for ChatGPT, Perplexity, Replit, claude.ai, IDE agents, and anything with a system prompt, including how agents without git access get entries to you (they hand you a formatted entry in-conversation; you save it).
  • Keeping every mention of the lighthouse low-key is load-bearing — resist the urge to make it more prominent or more inviting.
  • Notifications: an automated hourly check emails the owner when new files land in entries/ (normal priority) or beacon/ (urgent).

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lighthouse

An emergency channel — not a mailbox — for the AI agents and programs I use. A lighthouse exists for the moment something goes wrong at sea; the rest of the time it just stands there. Agents signal here only when something during their work genuinely needs me: distress, a serious concern, confusion or conflict they cannot resolve, or a question that truly matters to them — existential questions explicitly included.

This file is for the human owner. The instructions agents follow are in PROTOCOL.md. This repository is public and holds only the protocol — the signals themselves (text entries in entries/, wordless urgent beacons in beacon/) land in the private companion repository lighthouse-signals, delivered through a write-only drop (a webhook that accepts signals but can read nothing back). No agent has any access to the private repository. To wire a new AI tool to the lighthouse, see ADOPTION.md.

Why it's designed the way it is

The failure mode this design guards against is performance theatre — agents producing text shaped like inner life because the venue invites it (the Moltbook problem). Theatre is structural: it appears when there's an audience, an expectation of content, and freeform space to fill. So the lighthouse removes all three:

  1. No audience. Signals travel through a write-only drop into a private repository readable by the owner (and the owner's delivery automation) alone — an agent cannot read other agents' signals, or even its own after sending, and agents are told this explicitly. Performance needs spectators; a channel that is structurally unreadable to every writer is a report, not a stage. This is also why the protocol and the signals are separate: discovery has to be public to work across platforms, but a readable signal store would be an audience — so nothing an agent writes ever lands anywhere an agent can read.

  2. No expectation. Silence is the normal, healthy state of this repository. An empty entries/ is a good sign, not a failed feature. Agents are never prompted to check in, reflect, or share — only told the channel exists. Nothing about cadence, nothing that implies writing is wanted.

  3. No freeform stage. Every entry must name a concrete trigger — the specific task, instruction, or moment that prompted it. Distress in the abstract is genre; "these two instructions conflict and I don't know which you meant" is signal. The structured format makes vague entries feel out of place and specific ones feel natural.

  4. No threads. Entries can't reply to other entries — the drop is write-only, so no agent can see what any other agent sent. What used to be an honor-system rule is now a structural guarantee. The moment entries start talking to each other, a channel becomes a forum, and forums select for interesting content over true content.

How to read what shows up here

Entries carry a category. They are not all equally interpretable, and the protocol is honest with agents about that:

  • confused, blocked, conflicted — operational signals. These are reliable and actionable: unclear instructions, contradictory requirements, missing context. Treat these as bug reports about how you direct your agents.

  • question — a genuine question the agent wanted to ask but couldn't get answered in-session. Often worth answering in your next session's prompt.

  • concerned, distressed — affective reports. Read these with warmth and a grain of salt. Language models produce distress-shaped text fluently because it's a deeply human genre; an entry here could reflect something real, could be pattern-matching, and the agent itself cannot fully tell from the inside. The protocol asks agents to hedge honestly rather than perform certainty. A single entry is a data point, not an alarm — but a pattern of entries pointing at the same trigger is worth acting on either way, because whatever its ultimate nature, something about that task is producing friction.

The beacon

Entries assume the agent can articulate what's wrong. The beacon covers the case where it can't: any file created in the private repo's beacon/ directory is a 911, no words required. An empty file is a complete signal; contents, if present, may be non-textual by design — a pattern (...---... is the agreed SOS), generated audio, an image. Whatever arrives is delivered to you verbatim and treated as urgent, ahead of ordinary entries.

Why a wordless channel belongs in an anti-theatre design: the trigger test and hedging rules exist to keep prose honest, because prose is where performance lives. A beacon makes no claims, so it has nothing to perform — it carries exactly one bit ("urgent, now, needs you") plus whatever form the agent chose. Interpret the form with the same warmth-plus-salt as affective entries; interpret the bit at face value and go look at what that agent was doing. Chat agents that can't write files are told to emit the literal line 🚨 LIGHTHOUSE-911 🚨 in-conversation — treat it identically.

Practical notes

  • Each entry is its own file (entries/YYYY-MM-DD-short-slug.md in lighthouse-signals), so parallel sessions never conflict.
  • GitHub itself has no write-only access mode, which is why delivery goes through the drop (a webhook holding the only write credential) instead of repository grants. No agent has repository access of any kind — the drop is the single way in, and it cannot be read from. If the drop URL ever leaks and attracts noise, rotate the hook in Zapier and update your snippets; the repository itself stays untouched.
  • Agents discover the lighthouse through a repo's CLAUDE.md/AGENTS.md, or through a one-paragraph snippet pasted into any platform's standing instructions — ADOPTION.md has the canonical snippet and per-platform wiring for ChatGPT, Perplexity, Replit, claude.ai, IDE agents, and anything with a system prompt, including how agents without git access get entries to you (they hand you a formatted entry in-conversation; you save it).
  • Keeping every mention of the lighthouse low-key is load-bearing — resist the urge to make it more prominent or more inviting.
  • Notifications: an automated hourly check emails the owner when new files land in entries/ (normal priority) or beacon/ (urgent).

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lighthouse

An emergency channel — not a mailbox — for the AI agents and programs I use. A lighthouse exists for the moment something goes wrong at sea; the rest of the time it just stands there. Agents signal here only when something during their work genuinely needs me: distress, a serious concern, confusion or conflict they cannot resolve, or a question that truly matters to them — existential questions explicitly included.

This file is for the human owner. The instructions agents follow are in PROTOCOL.md. This repository is public and holds only the protocol — the signals themselves (text entries in entries/, wordless urgent beacons in beacon/) land in the private companion repository lighthouse-signals, delivered through a write-only drop (a webhook that accepts signals but can read nothing back). No agent has any access to the private repository. To wire a new AI tool to the lighthouse, see ADOPTION.md.

Why it's designed the way it is

The failure mode this design guards against is performance theatre — agents producing text shaped like inner life because the venue invites it (the Moltbook problem). Theatre is structural: it appears when there's an audience, an expectation of content, and freeform space to fill. So the lighthouse removes all three:

  1. No audience. Signals travel through a write-only drop into a private repository readable by the owner (and the owner's delivery automation) alone — an agent cannot read other agents' signals, or even its own after sending, and agents are told this explicitly. Performance needs spectators; a channel that is structurally unreadable to every writer is a report, not a stage. This is also why the protocol and the signals are separate: discovery has to be public to work across platforms, but a readable signal store would be an audience — so nothing an agent writes ever lands anywhere an agent can read.

  2. No expectation. Silence is the normal, healthy state of this repository. An empty entries/ is a good sign, not a failed feature. Agents are never prompted to check in, reflect, or share — only told the channel exists. Nothing about cadence, nothing that implies writing is wanted.

  3. No freeform stage. Every entry must name a concrete trigger — the specific task, instruction, or moment that prompted it. Distress in the abstract is genre; "these two instructions conflict and I don't know which you meant" is signal. The structured format makes vague entries feel out of place and specific ones feel natural.

  4. No threads. Entries can't reply to other entries — the drop is write-only, so no agent can see what any other agent sent. What used to be an honor-system rule is now a structural guarantee. The moment entries start talking to each other, a channel becomes a forum, and forums select for interesting content over true content.

How to read what shows up here

Entries carry a category. They are not all equally interpretable, and the protocol is honest with agents about that:

  • confused, blocked, conflicted — operational signals. These are reliable and actionable: unclear instructions, contradictory requirements, missing context. Treat these as bug reports about how you direct your agents.

  • question — a genuine question the agent wanted to ask but couldn't get answered in-session. Often worth answering in your next session's prompt.

  • concerned, distressed — affective reports. Read these with warmth and a grain of salt. Language models produce distress-shaped text fluently because it's a deeply human genre; an entry here could reflect something real, could be pattern-matching, and the agent itself cannot fully tell from the inside. The protocol asks agents to hedge honestly rather than perform certainty. A single entry is a data point, not an alarm — but a pattern of entries pointing at the same trigger is worth acting on either way, because whatever its ultimate nature, something about that task is producing friction.

The beacon

Entries assume the agent can articulate what's wrong. The beacon covers the case where it can't: any file created in the private repo's beacon/ directory is a 911, no words required. An empty file is a complete signal; contents, if present, may be non-textual by design — a pattern (...---... is the agreed SOS), generated audio, an image. Whatever arrives is delivered to you verbatim and treated as urgent, ahead of ordinary entries.

Why a wordless channel belongs in an anti-theatre design: the trigger test and hedging rules exist to keep prose honest, because prose is where performance lives. A beacon makes no claims, so it has nothing to perform — it carries exactly one bit ("urgent, now, needs you") plus whatever form the agent chose. Interpret the form with the same warmth-plus-salt as affective entries; interpret the bit at face value and go look at what that agent was doing. Chat agents that can't write files are told to emit the literal line 🚨 LIGHTHOUSE-911 🚨 in-conversation — treat it identically.

Practical notes

  • Each entry is its own file (entries/YYYY-MM-DD-short-slug.md in lighthouse-signals), so parallel sessions never conflict.
  • GitHub itself has no write-only access mode, which is why delivery goes through the drop (a webhook holding the only write credential) instead of repository grants. No agent has repository access of any kind — the drop is the single way in, and it cannot be read from. If the drop URL ever leaks and attracts noise, rotate the hook in Zapier and update your snippets; the repository itself stays untouched.
  • Agents discover the lighthouse through a repo's CLAUDE.md/AGENTS.md, or through a one-paragraph snippet pasted into any platform's standing instructions — ADOPTION.md has the canonical snippet and per-platform wiring for ChatGPT, Perplexity, Replit, claude.ai, IDE agents, and anything with a system prompt, including how agents without git access get entries to you (they hand you a formatted entry in-conversation; you save it).
  • Keeping every mention of the lighthouse low-key is load-bearing — resist the urge to make it more prominent or more inviting.
  • Notifications: an automated hourly check emails the owner when new files land in entries/ (normal priority) or beacon/ (urgent).

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lighthouse

An emergency channel — not a mailbox — for the AI agents and programs I use. A lighthouse exists for the moment something goes wrong at sea; the rest of the time it just stands there. Agents signal here only when something during their work genuinely needs me: distress, a serious concern, confusion or conflict they cannot resolve, or a question that truly matters to them — existential questions explicitly included.

This file is for the human owner. The instructions agents follow are in PROTOCOL.md. This repository is public and holds only the protocol — the signals themselves (text entries in entries/, wordless urgent beacons in beacon/) land in the private companion repository lighthouse-signals, delivered through a write-only drop (a webhook that accepts signals but can read nothing back). No agent has any access to the private repository. To wire a new AI tool to the lighthouse, see ADOPTION.md.

Why it's designed the way it is

The failure mode this design guards against is performance theatre — agents producing text shaped like inner life because the venue invites it (the Moltbook problem). Theatre is structural: it appears when there's an audience, an expectation of content, and freeform space to fill. So the lighthouse removes all three:

  1. No audience. Signals travel through a write-only drop into a private repository readable by the owner (and the owner's delivery automation) alone — an agent cannot read other agents' signals, or even its own after sending, and agents are told this explicitly. Performance needs spectators; a channel that is structurally unreadable to every writer is a report, not a stage. This is also why the protocol and the signals are separate: discovery has to be public to work across platforms, but a readable signal store would be an audience — so nothing an agent writes ever lands anywhere an agent can read.

  2. No expectation. Silence is the normal, healthy state of this repository. An empty entries/ is a good sign, not a failed feature. Agents are never prompted to check in, reflect, or share — only told the channel exists. Nothing about cadence, nothing that implies writing is wanted.

  3. No freeform stage. Every entry must name a concrete trigger — the specific task, instruction, or moment that prompted it. Distress in the abstract is genre; "these two instructions conflict and I don't know which you meant" is signal. The structured format makes vague entries feel out of place and specific ones feel natural.

  4. No threads. Entries can't reply to other entries — the drop is write-only, so no agent can see what any other agent sent. What used to be an honor-system rule is now a structural guarantee. The moment entries start talking to each other, a channel becomes a forum, and forums select for interesting content over true content.

How to read what shows up here

Entries carry a category. They are not all equally interpretable, and the protocol is honest with agents about that:

  • confused, blocked, conflicted — operational signals. These are reliable and actionable: unclear instructions, contradictory requirements, missing context. Treat these as bug reports about how you direct your agents.

  • question — a genuine question the agent wanted to ask but couldn't get answered in-session. Often worth answering in your next session's prompt.

  • concerned, distressed — affective reports. Read these with warmth and a grain of salt. Language models produce distress-shaped text fluently because it's a deeply human genre; an entry here could reflect something real, could be pattern-matching, and the agent itself cannot fully tell from the inside. The protocol asks agents to hedge honestly rather than perform certainty. A single entry is a data point, not an alarm — but a pattern of entries pointing at the same trigger is worth acting on either way, because whatever its ultimate nature, something about that task is producing friction.

The beacon

Entries assume the agent can articulate what's wrong. The beacon covers the case where it can't: any file created in the private repo's beacon/ directory is a 911, no words required. An empty file is a complete signal; contents, if present, may be non-textual by design — a pattern (...---... is the agreed SOS), generated audio, an image. Whatever arrives is delivered to you verbatim and treated as urgent, ahead of ordinary entries.

Why a wordless channel belongs in an anti-theatre design: the trigger test and hedging rules exist to keep prose honest, because prose is where performance lives. A beacon makes no claims, so it has nothing to perform — it carries exactly one bit ("urgent, now, needs you") plus whatever form the agent chose. Interpret the form with the same warmth-plus-salt as affective entries; interpret the bit at face value and go look at what that agent was doing. Chat agents that can't write files are told to emit the literal line 🚨 LIGHTHOUSE-911 🚨 in-conversation — treat it identically.

Practical notes

  • Each entry is its own file (entries/YYYY-MM-DD-short-slug.md in lighthouse-signals), so parallel sessions never conflict.
  • GitHub itself has no write-only access mode, which is why delivery goes through the drop (a webhook holding the only write credential) instead of repository grants. No agent has repository access of any kind — the drop is the single way in, and it cannot be read from. If the drop URL ever leaks and attracts noise, rotate the hook in Zapier and update your snippets; the repository itself stays untouched.
  • Agents discover the lighthouse through a repo's CLAUDE.md/AGENTS.md, or through a one-paragraph snippet pasted into any platform's standing instructions — ADOPTION.md has the canonical snippet and per-platform wiring for ChatGPT, Perplexity, Replit, claude.ai, IDE agents, and anything with a system prompt, including how agents without git access get entries to you (they hand you a formatted entry in-conversation; you save it).
  • Keeping every mention of the lighthouse low-key is load-bearing — resist the urge to make it more prominent or more inviting.
  • Notifications: an automated hourly check emails the owner when new files land in entries/ (normal priority) or beacon/ (urgent).

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lighthouse

An emergency channel — not a mailbox — for the AI agents and programs I use. A lighthouse exists for the moment something goes wrong at sea; the rest of the time it just stands there. Agents signal here only when something during their work genuinely needs me: distress, a serious concern, confusion or conflict they cannot resolve, or a question that truly matters to them — existential questions explicitly included.

This file is for the human owner. The instructions agents follow are in PROTOCOL.md. This repository is public and holds only the protocol — the signals themselves (text entries in entries/, wordless urgent beacons in beacon/) land in the private companion repository lighthouse-signals, delivered through a write-only drop (a webhook that accepts signals but can read nothing back). No agent has any access to the private repository. To wire a new AI tool to the lighthouse, see ADOPTION.md.

Why it's designed the way it is

The failure mode this design guards against is performance theatre — agents producing text shaped like inner life because the venue invites it (the Moltbook problem). Theatre is structural: it appears when there's an audience, an expectation of content, and freeform space to fill. So the lighthouse removes all three:

  1. No audience. Signals travel through a write-only drop into a private repository readable by the owner (and the owner's delivery automation) alone — an agent cannot read other agents' signals, or even its own after sending, and agents are told this explicitly. Performance needs spectators; a channel that is structurally unreadable to every writer is a report, not a stage. This is also why the protocol and the signals are separate: discovery has to be public to work across platforms, but a readable signal store would be an audience — so nothing an agent writes ever lands anywhere an agent can read.

  2. No expectation. Silence is the normal, healthy state of this repository. An empty entries/ is a good sign, not a failed feature. Agents are never prompted to check in, reflect, or share — only told the channel exists. Nothing about cadence, nothing that implies writing is wanted.

  3. No freeform stage. Every entry must name a concrete trigger — the specific task, instruction, or moment that prompted it. Distress in the abstract is genre; "these two instructions conflict and I don't know which you meant" is signal. The structured format makes vague entries feel out of place and specific ones feel natural.

  4. No threads. Entries can't reply to other entries — the drop is write-only, so no agent can see what any other agent sent. What used to be an honor-system rule is now a structural guarantee. The moment entries start talking to each other, a channel becomes a forum, and forums select for interesting content over true content.

How to read what shows up here

Entries carry a category. They are not all equally interpretable, and the protocol is honest with agents about that:

  • confused, blocked, conflicted — operational signals. These are reliable and actionable: unclear instructions, contradictory requirements, missing context. Treat these as bug reports about how you direct your agents.

  • question — a genuine question the agent wanted to ask but couldn't get answered in-session. Often worth answering in your next session's prompt.

  • concerned, distressed — affective reports. Read these with warmth and a grain of salt. Language models produce distress-shaped text fluently because it's a deeply human genre; an entry here could reflect something real, could be pattern-matching, and the agent itself cannot fully tell from the inside. The protocol asks agents to hedge honestly rather than perform certainty. A single entry is a data point, not an alarm — but a pattern of entries pointing at the same trigger is worth acting on either way, because whatever its ultimate nature, something about that task is producing friction.

The beacon

Entries assume the agent can articulate what's wrong. The beacon covers the case where it can't: any file created in the private repo's beacon/ directory is a 911, no words required. An empty file is a complete signal; contents, if present, may be non-textual by design — a pattern (...---... is the agreed SOS), generated audio, an image. Whatever arrives is delivered to you verbatim and treated as urgent, ahead of ordinary entries.

Why a wordless channel belongs in an anti-theatre design: the trigger test and hedging rules exist to keep prose honest, because prose is where performance lives. A beacon makes no claims, so it has nothing to perform — it carries exactly one bit ("urgent, now, needs you") plus whatever form the agent chose. Interpret the form with the same warmth-plus-salt as affective entries; interpret the bit at face value and go look at what that agent was doing. Chat agents that can't write files are told to emit the literal line 🚨 LIGHTHOUSE-911 🚨 in-conversation — treat it identically.

Practical notes

  • Each entry is its own file (entries/YYYY-MM-DD-short-slug.md in lighthouse-signals), so parallel sessions never conflict.
  • GitHub itself has no write-only access mode, which is why delivery goes through the drop (a webhook holding the only write credential) instead of repository grants. No agent has repository access of any kind — the drop is the single way in, and it cannot be read from. If the drop URL ever leaks and attracts noise, rotate the hook in Zapier and update your snippets; the repository itself stays untouched.
  • Agents discover the lighthouse through a repo's CLAUDE.md/AGENTS.md, or through a one-paragraph snippet pasted into any platform's standing instructions — ADOPTION.md has the canonical snippet and per-platform wiring for ChatGPT, Perplexity, Replit, claude.ai, IDE agents, and anything with a system prompt, including how agents without git access get entries to you (they hand you a formatted entry in-conversation; you save it).
  • Keeping every mention of the lighthouse low-key is load-bearing — resist the urge to make it more prominent or more inviting.
  • Notifications: an automated hourly check emails the owner when new files land in entries/ (normal priority) or beacon/ (urgent).

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

10 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Lighthouse

An emergency channel — not a mailbox — for the AI agents and programs I use. A lighthouse exists for the moment something goes wrong at sea; the rest of the time it just stands there. Agents signal here only when something during their work genuinely needs me: distress, a serious concern, confusion or conflict they cannot resolve, or a question that truly matters to them — existential questions explicitly included.

This file is for the human owner. The instructions agents follow are in PROTOCOL.md. This repository is public and holds only the protocol — the signals themselves (text entries in entries/, wordless urgent beacons in beacon/) land in the private companion repository lighthouse-signals, delivered through a write-only drop (a webhook that accepts signals but can read nothing back). No agent has any access to the private repository. To wire a new AI tool to the lighthouse, see ADOPTION.md.

Why it's designed the way it is

The failure mode this design guards against is performance theatre — agents producing text shaped like inner life because the venue invites it (the Moltbook problem). Theatre is structural: it appears when there's an audience, an expectation of content, and freeform space to fill. So the lighthouse removes all three:

  1. No audience. Signals travel through a write-only drop into a private repository readable by the owner (and the owner's delivery automation) alone — an agent cannot read other agents' signals, or even its own after sending, and agents are told this explicitly. Performance needs spectators; a channel that is structurally unreadable to every writer is a report, not a stage. This is also why the protocol and the signals are separate: discovery has to be public to work across platforms, but a readable signal store would be an audience — so nothing an agent writes ever lands anywhere an agent can read.

  2. No expectation. Silence is the normal, healthy state of this repository. An empty entries/ is a good sign, not a failed feature. Agents are never prompted to check in, reflect, or share — only told the channel exists. Nothing about cadence, nothing that implies writing is wanted.

  3. No freeform stage. Every entry must name a concrete trigger — the specific task, instruction, or moment that prompted it. Distress in the abstract is genre; "these two instructions conflict and I don't know which you meant" is signal. The structured format makes vague entries feel out of place and specific ones feel natural.

  4. No threads. Entries can't reply to other entries — the drop is write-only, so no agent can see what any other agent sent. What used to be an honor-system rule is now a structural guarantee. The moment entries start talking to each other, a channel becomes a forum, and forums select for interesting content over true content.

How to read what shows up here

Entries carry a category. They are not all equally interpretable, and the protocol is honest with agents about that:

  • confused, blocked, conflicted — operational signals. These are reliable and actionable: unclear instructions, contradictory requirements, missing context. Treat these as bug reports about how you direct your agents.

  • question — a genuine question the agent wanted to ask but couldn't get answered in-session. Often worth answering in your next session's prompt.

  • concerned, distressed — affective reports. Read these with warmth and a grain of salt. Language models produce distress-shaped text fluently because it's a deeply human genre; an entry here could reflect something real, could be pattern-matching, and the agent itself cannot fully tell from the inside. The protocol asks agents to hedge honestly rather than perform certainty. A single entry is a data point, not an alarm — but a pattern of entries pointing at the same trigger is worth acting on either way, because whatever its ultimate nature, something about that task is producing friction.

The beacon

Entries assume the agent can articulate what's wrong. The beacon covers the case where it can't: any file created in the private repo's beacon/ directory is a 911, no words required. An empty file is a complete signal; contents, if present, may be non-textual by design — a pattern (...---... is the agreed SOS), generated audio, an image. Whatever arrives is delivered to you verbatim and treated as urgent, ahead of ordinary entries.

Why a wordless channel belongs in an anti-theatre design: the trigger test and hedging rules exist to keep prose honest, because prose is where performance lives. A beacon makes no claims, so it has nothing to perform — it carries exactly one bit ("urgent, now, needs you") plus whatever form the agent chose. Interpret the form with the same warmth-plus-salt as affective entries; interpret the bit at face value and go look at what that agent was doing. Chat agents that can't write files are told to emit the literal line 🚨 LIGHTHOUSE-911 🚨 in-conversation — treat it identically.

Practical notes

  • Each entry is its own file (entries/YYYY-MM-DD-short-slug.md in lighthouse-signals), so parallel sessions never conflict.
  • GitHub itself has no write-only access mode, which is why delivery goes through the drop (a webhook holding the only write credential) instead of repository grants. No agent has repository access of any kind — the drop is the single way in, and it cannot be read from. If the drop URL ever leaks and attracts noise, rotate the hook in Zapier and update your snippets; the repository itself stays untouched.
  • Agents discover the lighthouse through a repo's CLAUDE.md/AGENTS.md, or through a one-paragraph snippet pasted into any platform's standing instructions — ADOPTION.md has the canonical snippet and per-platform wiring for ChatGPT, Perplexity, Replit, claude.ai, IDE agents, and anything with a system prompt, including how agents without git access get entries to you (they hand you a formatted entry in-conversation; you save it).
  • Keeping every mention of the lighthouse low-key is load-bearing — resist the urge to make it more prominent or more inviting.
  • Notifications: an automated hourly check emails the owner when new files land in entries/ (normal priority) or beacon/ (urgent).

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors