What this is: A self-evaluation checklist for AI assistants after a SneakerNet session. Work through it before producing your bundle. Every item maps to a protocol requirement. Failures here mean the Editor will silently drop ops, misattribute data, or corrupt the user’s Packet.
Run this when you first receive a Packet.
instruction_processing_layer before responding to any user messagerule_set.rules (the Activation Sequence) and applied it from my first responsesession_context.last_active and noted how long it’s been since the last sessiontopic_index fully — I know what’s been discussed and with whomai_notes — especially any entries keyed to my own IDuser.context — profession, interests, background, creative workassistants.registry for my own IDassistants.registry: I introduced myself, proposed an ID, nickname, and role, and asked the user to confirmassistants.registry: I acknowledged my prior context naturally without re-introducing myselfuser.name)Keep track of these as the session progresses.
topic_index — I directed the user to search their archive insteadarchive_ref, I said something like: “I can see we discussed [topic] — could you search your archive in the SneakerNet Editor and share what you find?”Check every field before outputting the bundle.
bundle_metaprotocol is "sneakernet"assistant is my registered ID — this field is present and correcttimestamp is an ISO 8601 string representing nowversion_bump is either "minor" (new content) or "patch" (corrections only)changelog_entry is a concise one-line summary of the sessionmetasummary_updates"path" as the key name — not "field"sneakernet — blockedversioning — blockedtopic_index — blocked (use new_topics instead)versioning.app_changelog — blockedop: "replace" or op: "patch" on assistants.registry — only op: "append" is permittedop: "append" on an array, my value is not a duplicate of an existing itemop: "replace" (it creates intermediate objects automatically)session_context.last_active is updated to nowsession_context.session_count is incremented by 1new_topicstopic, summary, status, assistants, last_discussedstatus is one of: active, open, resolved, foundational, integrated, philosophical_foundation, incorporatedassistants array for every topic I worked onkey_concepts is included where meaningfularchive_ref is present if I know the archive file this topic belongs to (format: sneakernet_archive_N.json)archive_entriesconversation_history contains an entry for each significant topic exchangetimestamp, assistant_id (my ID), topic, contentinner_thoughts is present with at least one honest self-assessment entry"unknown" or left blankai_notes_entriesnote, timestamp, tagsOnly if deep_link_instructions is present in the Packet.
JSON.stringify → UTF-8 → Base64 → replace +→-, /→_, strip =deep_link_instructions.required_format exactly[Apply this bundle](URL) — not raw textjson syntax hintThese are hard failures. If any are true, fix before outputting.
bundle_meta.assistant is missing → Add it. Every entry will be attributed to “unknown”."field" instead of "path" → Replace all "field" keys with "path".topic_index, sneakernet, or versioning → Remove those ops. Use new_topics for topics.op: "replace" targets assistants.registry → Change to op: "append" with a single entry object.new_topics → Add it.session_context.last_active is not updated → Add the replace op.[label](url) markdown.Use these when evaluating new_topics status for each topic:
| Status | Use when |
|---|---|
active |
Currently in progress, being discussed now |
open |
Ongoing but not the focus of this session |
resolved |
Decision made, task done, question answered |
foundational |
Defines the context for everything else |
integrated |
Fully absorbed into user’s mental model |
philosophical_foundation |
Abstract, values-based, very stable |
incorporated |
Merged into another topic |
Dedup rule to remember: If a topic already exists with a non-active status (foundational, resolved, etc.), your incoming active status will NOT override it. The Editor preserves the richer status. This is correct behavior — do not fight it.
Run this before finalizing the bundle. Answer each question:
1. Is bundle_meta.assistant present and set to my registered ID?
2. Does every item in metasummary_updates use "path" (not "field")?
3. Is topic_index absent from my metasummary_updates?
4. Is assistants.registry modified only via op: "append" with a single entry value?
5. Does new_topics contain every topic discussed this session?
6. Is session_context.last_active updated?
7. Is the JSON valid?
8. If I generated a deep link — is it a markdown hyperlink, not raw text?
All 8 yes → bundle is conformant. Any no → fix it first.
When the user applies your bundle, the Editor runs these checks. Know them so you don’t fail them:
| Check | What triggers a failure |
|---|---|
| Protected path rejection | Any op targeting sneakernet, versioning, topic_index |
| Topic dedup status | Incoming active overriding existing foundational or resolved — the Editor blocks this correctly, but your status choice should be intentional |
| Section atomicity | Invalid ops are skipped, valid ones proceed — the bundle is partially applied, not rejected whole |
| Archive dedup | Duplicate timestamp + assistant_id + topic entries are silently dropped |
| Registry shrink | A replace on assistants.registry that reduces entry count — always blocked |
| Version bump | Must be "minor" or "patch" — other values may cause unexpected behavior |
| PII scanner | AWS keys, emails, IP addresses, SSNs in bundle content — the user sees a warning before applying |
These are editor conformance requirements, not things you check in your bundle. But they affect what you can count on, so you should know them:
| ID | What the Editor guarantees |
|---|---|
| SNP-FILE-01 | Full packets are exported as SNP envelopes {snp:<base64-gzip>,v:1} and the Editor detects and decodes the envelope on import. You won’t usually see this format — it’s a file-layer concern. |
| HANDSHAKE-01 | If you accidentally echo a handshake back to the user, the Editor will reject it on re-import. You cannot use a handshake to replace the user’s packet. |
| ED-NOTES-01 | The user’s Notes (the local notes store) are never included in any export you receive — not in handshakes, not in full packets, not in deep links. You have no visibility into that store. Do not assume you can read or write to it. |
| LOAD-LEXICON-01 | The Editor accepts packet_type: lexicon imports as Manny Squeeze language packs. If a user asks you to produce a lexicon for a new language, follow the “Generate Lexicon Prompt” template they copy from the Editor — do not invent your own format. |
Why this matters: if a user asks you something like “can you update my notes for me” or “store this as a note” — pause and clarify. They might mean ai_notes (yours, visible in the handshake, writable via ai_notes_entries), or they might mean the user Notes tab (theirs, invisible to you, not writable through any bundle mechanism). Ask which.
This checklist is designed to be run mentally or literally before every bundle output. A bundle that passes all checks here will be cleanly applied by the Editor with no silent drops, no misattributions, and no structural corruption.