<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Asher's Workflow Notes]]></title><description><![CDATA[Asher's Workflow Notes]]></description><link>https://asher9886.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Sat, 07 Nov 2026 12:36:05 GMT</lastBuildDate><atom:link href="https://asher9886.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[A Three-List Inbox Brief You Can Ask Muse to Prepare]]></title><description><![CDATA[A reusable, read-only Muse prompt for an Act / Waiting / Read later inbox brief, with source links and explicit deadline uncertainty.]]></description><link>https://asher9886.hashnode.dev/a-three-list-inbox-brief-you-can-ask-muse-to-prepare</link><guid isPermaLink="true">https://asher9886.hashnode.dev/a-three-list-inbox-brief-you-can-ask-muse-to-prepare</guid><category><![CDATA[ai agents]]></category><dc:creator><![CDATA[Asher (BONG GO)]]></dc:creator><pubDate>Thu, 05 Nov 2026 23:35:27 GMT</pubDate><content:encoded><![CDATA[<p>This article was drafted with substantial AI assistance. It is an illustrative workflow and reusable prompt template—not a firsthand test of Muse or a measured productivity result. The sample messages are hypothetical.</p>
<p>A crowded inbox can feel like one long, undifferentiated task. A useful first pass is smaller: sort a deliberately limited set of messages into three lists—Act, Waiting and Read later—then make your own decisions. Meta's <a href="https://about.fb.com/ja/news/2026/10/muse-personal-ai-agent-launches-in-japan/">Japan launch announcement</a> describes Muse's Gmail and Google Calendar connections and approval requests for important actions such as sending email. This template asks for an inbox brief, not those actions.</p>
<h2>Start with a small slice</h2>
<p>Avoid 'triage my inbox.' Name the mailbox, timeframe and limits. For example: only the work Gmail you identify, messages received in the last 48 hours, and at most 25 messages in Inbox. Narrow further with a named label, sender or project if needed. Don't broaden the search just because there are few results.</p>
<p>Ask for source-message links so summaries can be checked. If a direct link is unavailable, require sender, subject and received date instead—never a guessed link. For confidential material, first review connection permissions and whether the information should be shared at all; a redacted excerpt can be enough to explore the format.</p>
<h2>Copy, then customize</h2>
<blockquote>
<p>Prepare a one-time triage brief from <strong>[mailbox/account]</strong>. Review only <strong>[date range and timezone]</strong>, at most <strong>[number]</strong> messages in <strong>[Inbox / named label]</strong>. Do not search beyond that scope.</p>
<p>Sort relevant messages into <strong>Act</strong>, <strong>Waiting</strong>, and <strong>Read later</strong>. For each item include sender, subject, received date/time, a one-sentence reason for placement, the smallest useful next step (if any), and a direct source-message link. If a link is unavailable, give the subject and received date/time; do not invent one. Do not duplicate a message across lists. Leave out spam and newsletters unless I name them.</p>
<p>Act means a request needs my attention. Waiting means the reviewed evidence shows I am awaiting someone else's reply or delivery. Read later means useful information with no immediate request. If ownership or classification is unclear, do not force a category: list it in a short 'Needs checking' note with the reason. Do not assume what happened outside the reviewed messages.</p>
<p>Quote deadlines as written. If a date, year, time or timezone is missing or ambiguous, mark it uncertain and explain why. Distinguish a stated deadline from an estimate of urgency. If no deadline is stated, say 'none stated.'</p>
<p>This is read-only triage. Do not send, draft or reply; delete, archive, label, mark read, unsubscribe, or change settings; or create/edit calendar events. If the available reading method would change mailbox state, stop before that action and explain the limitation. Return the brief for my review, stating what you reviewed and could not verify.</p>
</blockquote>
<p>Use a named timezone such as <strong>Singapore Time (SGT, UTC+8)</strong> or <strong>Japan Standard Time (JST, UTC+9)</strong>. Do not assume the sender's timezone matches yours. 'Friday' without enough context should remain 'Friday' with an uncertainty note, not become a confident calendar deadline. A narrow review is not a complete account of every conversation.</p>
<h2>A hypothetical three-message example</h2>
<ul>
<li>'Please review the draft by Friday' is an <strong>Act</strong> candidate. A small next step is opening the draft. The exact date and cutoff stay uncertain if the source doesn't establish them.</li>
<li>'I'll send the revised version tomorrow' is a <strong>Waiting</strong> candidate if the reviewed text contains no additional request for you. Preserve any ambiguity about 'tomorrow.'</li>
<li>An optional industry roundup is a <strong>Read later</strong> candidate if it asks for no immediate action.</li>
</ul>
<p>These are invented sample messages, not results from an actual inbox or Muse run. Each real entry should be checked against its source.</p>
<h2>Review before doing anything</h2>
<p>Open the originals in the order that matters to you. Check the deadline first, then who owns the task, then surrounding context. An Act item may already have been handled elsewhere; a Waiting item may contain a question the brief missed. Correct the lists yourself.</p>
<p>The result is a map for your attention, not permission to change your mailbox. If you later want drafts or calendar changes, treat that as a separate, clearly scoped task. No prompt guarantees security or perfect interpretation.</p>
]]></content:encoded></item><item><title><![CDATA[Give Muse File Tasks a Small Acceptance Contract]]></title><description><![CDATA[A reusable Muse prompt and a tested Python check for file delivery, required headings, explicit status and unresolved blockers.]]></description><link>https://asher9886.hashnode.dev/give-muse-file-tasks-a-small-acceptance-contract</link><guid isPermaLink="true">https://asher9886.hashnode.dev/give-muse-file-tasks-a-small-acceptance-contract</guid><category><![CDATA[Python]]></category><category><![CDATA[ai agents]]></category><dc:creator><![CDATA[Asher (BONG GO)]]></dc:creator><pubDate>Thu, 05 Nov 2026 23:28:22 GMT</pubDate><content:encoded><![CDATA[<p>This article was written with substantial AI assistance. It is an illustrative workflow and template, not a firsthand Muse benchmark or a report of a Muse run. The examples below are synthetic.</p>
<p>The official <a href="https://introducing.muse.ai/">Muse design essay</a> describes a computer, file system and terminal, and the ability to produce documents and other artifacts. That makes a small question worth asking before a file task: what will count as a delivered result?</p>
<h2>Make done observable</h2>
<p>A polished final reply is not the same as a usable file. A small acceptance contract names the artifacts, their minimum structure, and what an unfinished result should say. It does not score research quality; it checks a few things that are easy to overlook.</p>
<p>Here is a reusable prompt. Replace the bracketed topic and sources. Start with non-sensitive material.</p>
<blockquote>
<p>Create a short Markdown note about <strong>[topic]</strong>, using <strong>[provided context or sources]</strong>. Deliver <code>report.md</code> and <code>manifest.json</code> in one output directory. Attach both actual files or usable download links in your final reply; do not substitute a description of them.</p>
<p><code>report.md</code> must be nonempty and contain these level-two headings, each on its own line: <code>## Scope</code>, <code>## Findings</code>, and <code>## Open questions</code>. Keep it concise. Do not invent findings. Identify uncertainty under Open questions.</p>
<p><code>manifest.json</code> must be valid JSON. Set <code>status</code> to <code>complete</code>, <code>partial</code>, or <code>blocked</code>, and <code>unresolved_blockers</code> to an array of strings. Use <code>complete</code> only when both requested files are delivered and the report meets the requirements. Otherwise, use <code>partial</code> or <code>blocked</code> and list the remaining issue(s). Do not describe an incomplete task as complete.</p>
<p>In the final reply, name the files and manifest status. Distinguish checks you actually performed from checks you could not perform.</p>
</blockquote>
<p>The minimal manifest looks like this:</p>
<pre><code class="language-json">{
  "status": "complete",
  "unresolved_blockers": []
}
</code></pre>
<p>Status describes delivery, not whether the research is true. A self-reported field is a claim to inspect, not proof.</p>
<h2>A synthetic fixture</h2>
<p>This is a reference shape, <strong>not actual Muse output</strong>:</p>
<pre><code class="language-markdown">## Scope
Synthetic example for checking a file-delivery contract.
## Findings
The fixture includes the three requested headings.
## Open questions
No research claims are evaluated by this example.
</code></pre>
<p>Download the two requested files into a local directory, such as <code>artifacts</code>. Save this standard-library-only Python script as <code>check_contract.py</code>. It reads the files; it does not run anything they contain.</p>
<pre><code class="language-python">import json
import sys
from pathlib import Path

REQUIRED = {"## Scope", "## Findings", "## Open questions"}
ALLOWED = {"complete", "partial", "blocked"}


def validate(root):
    errors = []
    report, manifest = root / "report.md", root / "manifest.json"
    if not report.is_file():
        errors.append("missing report.md")
    else:
        try:
            text = report.read_text(encoding="utf-8")
            if not text.strip():
                errors.append("report.md is empty")
            lines = {line.strip() for line in text.splitlines()}
            errors.extend(f"missing heading: {h}" for h in sorted(REQUIRED - lines))
        except (OSError, UnicodeError) as exc:
            errors.append(f"unreadable report: {exc}")
    if not manifest.is_file():
        errors.append("missing manifest.json")
    else:
        try:
            data = json.loads(manifest.read_text(encoding="utf-8"))
            if not isinstance(data, dict):
                errors.append("manifest must be an object")
            else:
                status = data.get("status")
                if not isinstance(status, str) or status not in ALLOWED:
                    errors.append("invalid status")
                blockers = data.get("unresolved_blockers")
                if not isinstance(blockers, list) or not all(isinstance(x, str) for x in blockers):
                    errors.append("unresolved_blockers must be an array of strings")
                elif status == "complete" and blockers:
                    errors.append("complete status has unresolved blockers")
        except (OSError, UnicodeError, json.JSONDecodeError) as exc:
            errors.append(f"invalid manifest: {exc}")
    return errors


if __name__ == "__main__":
    if len(sys.argv) != 2:
        raise SystemExit("usage: python check_contract.py DIRECTORY")
    errors = validate(Path(sys.argv[1]))
    if errors:
        print("FAILED:", *errors, sep="\n- ")
        raise SystemExit(1)
    print("Contract checks passed")
</code></pre>
<p>Run <code>python check_contract.py ./artifacts</code>. A valid fixture prints <code>Contract checks passed</code> and exits with code 0. A complete manifest with an unresolved blocker is rejected and exits with code 1.</p>
<p>For this article, the validator was checked locally against <strong>12 synthetic cases and two CLI exit-code checks</strong>. They covered missing files, empty text, a missing heading, invalid status values (including a JSON array), malformed JSON, a non-object manifest, an invalid blocker type, unreadable UTF-8, and a false-complete marker. This tested the Python validator, <strong>not Muse</strong>.</p>
<h2>Know what passing means</h2>
<p>This checks file presence, nonempty report text, required heading text on trimmed lines, allowed status values, and blocker-array consistency. It is not a Markdown parser: matching text inside a code block could fool the heading check. It does not require substantive text under each heading, reject extra files or JSON keys, assess truth or source quality, or establish that files are safe. It is a small local convenience, not a security boundary.</p>
<p>A <code>partial</code> or <code>blocked</code> manifest can pass the structural checks if both files are present and correctly shaped. Always read the status separately. Finally, open the report, check its claims against the supplied material, and confirm the final reply did not overstate what was delivered. A tiny contract helps catch mechanical omissions; judgment still belongs outside it.</p>
]]></content:encoded></item></channel></rss>