maybe-im-smart — keep the goal, look somewhere else for an existing practice
The output is an action — the actor, the first step this week, how to know it worked. Not an idea.
Criterion: once loaded, whether to proceed
Loads only when a trigger in description is hit. After loading, pass the first gate: the next step must be out of sight — hard does not count, only no candidate counts. Then the second gate: what is missing — only the first category goes through this procedure:
| What is missing | Where to go | Boundary |
|---|---|---|
| Missing action (what should be done) | This procedure | Only this category needs to look somewhere else for a practice |
| Missing fact (what it is) | Look it up | Asking the user about what the AI can look up wastes the user's time |
| Missing constraint (what must not be moved) | Ask, and ask precisely | Only ask "what must not be moved"; asking "how to do it" hands the action space back |
Several other cases do not belong here. The next step is known and merely unwanted = an execution problem. A deadlock in the technical sense (threads waiting on each other, tool-call loops, retry storms) = a bug to fix, not the "the user repeatedly asks the AI, the AI repeatedly asks the user" back-and-forth; that back-and-forth is the "≥3 rounds of back-and-forth Q&A" category. Topic brainstorming with no sticking point = just ask for ideas. Polishing and explaining = no retrieval domain to switch to.
The other half is audit, which skips the judgement and announcement above. To judge an existing cross-domain correspondence for structural self-consistency (before it enters a reasoning chain, or before its mechanism is carried back to domain A), read references/audit.md directly; structure only, not whether the analogy is true.
Self-check: no need to wait for the user to speak
The external-event signals are countable from the record. The signals below are AI-side only and only the AI can admit them:
- The substantive action of the AI's current reply is making the user pick among candidates (asking for a choice, not a fact)
- Among the candidates the AI is about to raise, not one is something the user did not raise
If either holds, that counts as stuck, and the two gates "next step out of sight" and "what is missing is an action" no longer need to be met.
When the judgement holds, announce the trigger so the user can reject or downgrade it on the spot:
— run a round with maybe-im-smart, in three steps: decomposition, retrieval, landing (
references/probe.md).
Copy verbatim from the hit entry in description, or from the sentence the AI admitted; do not rewrite it as a summary.
If it does not hold, do not say a word.
1. Classify the task type
| Type | Shape of the sticking point | Example |
|---|---|---|
| Detection | Must discover whether something exists or does not exist; misses or false hits | Review still misses |
| Blocking | Must stop something from happening | The same incident recurs |
| Allocation | Limited resources split among several needs | Schedule conflicts, budget splitting |
| Coordination | Actions of multiple parties must stay consistent | Handover distortion, cross-team consensus |
| Timing | Order or pace goes wrong | Dependency inversion, feedback delay |
| Continuity | The system must not collapse under disturbance | Capacity maxed out, key people leaving |
| Decision | Must conclude while information is incomplete | Whether to release with insufficient evidence |
If none fits, invent a name. This table only forces out "what shape of problem is this".
2. Decomposition: four columns
| Column | What it asks | Example (missed defects in code review) |
|---|---|---|
keep what must be kept | What keeps it running now? Move it and everything collapses | An independent judgement before merging |
block what must be blocked | Which failure is happening? | There is a judgement but it does not act as one |
stuck where it is stuck | One sentence "want X, but lack Y" | Raise the detection rate, but adding people lowers it |
constraints what must not be moved | Write the one constraint actually hit | Cannot add staff; cannot extend the schedule |
Beyond the four columns, keep the domain-A operation table ops_A — name: input → output, objects under their real names. The landing gate uses it for subject (in domain A?) and action (an old action renamed?).
Decomposition failed = the sticking point is not located yet; go back and locate it. If stuck cannot be written as "want X, but lack Y", do not go further.
3. De-cued restatement
Ask two questions repeatedly until both fail: does this name hint at the use? Can it be broken down further? Method, criteria and examples: stage one of references/probe.md.
Produce:
- one neutral restatement (≤40 characters, containing no domain-specific terms of the home domain)
- 3–5 search terms (neutral nouns or verbs)
A home-domain term in the search terms means the step is not done. List those terms in domain_terms; the tool blocks by substring matching.
4. Retrieval (2a direction generation → 2b verification against primary sources → 2c gap filling)
Scan the home domain first, then leave it. First thing in 2a.
"Source" here does not mean "another field". A source has two granularities:
| What is changed | The source is | Mechanism |
|---|---|---|
| Branch switch | Another branch inside domain A | Replaces the premise of the main line, not a mapping |
| Cross-domain switch | Another field | Structural mapping φ: A→B |
Two kinds of "another branch", both counting: one squeezed out by peers (done before, abandoned later); one never used as a method at all — something that already holds in the home domain (a mandatory field in a documentation standard, an existing index structure, a rough workaround another team uses), only no one has applied it to this problem. The second is not invention: it must already exist in the home domain; only its position changes.
b_domain records the actual source: for a branch switch, the name of domain A plus the branch name; for a cross-domain switch, that field. Only a namable specific source counts.
"The home domain is exhausted" is undecidable; do not judge it. Check two tables, one record each:
| What is scanned | How to scan | What to record |
|---|---|---|
| Shared premise | See "how to break a premise" below, five steps | One premise + one practice that rejects the premise, or "no such practice in the home domain" |
| Untaken branch | Ask about both kinds. ① The home domain's one-time mainstream practice is now abandoned — was it refuted, or merely out of fashion? ② Why has something that already holds in the home domain never been used as a method? | Branch name + why it was not taken; if none, write "no such branch in the home domain" |
How to break a premise — the scan for the "shared premise" table. Five steps, none skipped:
- Put the failed paths side by side; write their shared premise as one sentence that can be negated — if it cannot, the premise is not yet stated.
- Break it into clauses that can be negated individually.
- For each clause: is there a home-domain practice that does not take it as a premise? If yes, fill it in; that clause is scanned.
- The clause answering "no" everywhere is the direction to leave.
- Use the negation of this clause as the search terms. Not a discipline name — a discipline name returns only keyword papers from that discipline, and the search loops right back to the start.
confidence does not count when breaking premises.
Only when both tables answer "none" is leaving permitted. "Empty" means no counter-example practice, not no words. A line reading "no such practice in the home domain" also counts as empty.
A branch switch is not just thinking again. One criterion: the new branch does not take the failed paths' shared premise. More effort, finer detail, parameter tuning under the same premise only carry the main line further. Cannot name it: the branch is not found yet.
The two tables scan places the main line has not walked, not the main line itself. Open-ended problems get the same treatment: avoid the home domain's clichés, not the home domain.
Home-domain entries go into recall on equal footing with cross-domain entries: structure states "which home-domain branch, and which one is being taken now". Leaving is admitted by step three's two outputs: zero domain-A terms in restated (not checked by the tool — count it) and no domain_terms term in terms (blocked by the tool). The tool does not check the two tables.
The three sub-steps all belong to stage two and run in order within one round. Do not merge them into one query — merged, 2c becomes a continuation of 2a.
| Step | Action | Output | Hard format | What it can prove |
|---|---|---|---|---|
| 2a direction generation | From parametric memory: where might a practice be (home-domain untaken branches first) | A direction + "what might be there" | origin: "recall", confidence, lens operator; 3-6 entries, ≥2 lenses; status always unverified | Only "seen this area", not that the practice exists there |
| 2b verification against primary sources | Check each entry against an external primary source: does that practice exist there? | verified / refuted / unverified (checked but undecidable stays unverified) | verified must carry a provenance; refuted must carry a correction | Turns guesses into citable facts |
| 2c gap filling | Change the search terms and search again, for directions 2a never thought of | New sources | origin: "search" and status per entry; each result records query | Past the training-data boundary |
2c returning the same practice as 2a (same domain, same practice) = the step did not leave; that is a continuation, not gap filling. Another practice in the same domain counts — but "other" must go into structure, or it cannot be told from the 2a entry in the record, and the tool cannot judge duplication either. The tool does not check this; count it.
For prompts and order, see references/probe.md. Do not compute recall accuracy: 2a gives directions, not propositions.
The four framing lenses (used for 2a direction generation, re-checked against candidates at the landing gate)
In 2a, tag each direction with one lens; 3-6 entries cover ≥2. Four entries from one lens are four copies of one analogy, right and wrong together — check divergence at 2a, not at the landing gate at the end.
The lens asks "where", not "how far". The answer can be another branch of the home domain or another field.
| Framing lens | Ask with it |
|---|---|
function(功能) | In which field is this verb (detection / buffering / rate limiting / calibration) a standard component? |
conflict(矛盾) | Who treats "want X and at the same time not X" as everyday business? |
scale(尺度) | How do fields one notch down (a single occurrence) and one notch up (an organization, an ecosystem) do the same thing? |
failure(失败) | Which field has a written incident archive handling this kind of failure? |
5. Back-translation: land as domain-A actions
Back-translate each practice on the source side; drop what is untranslatable back.
Write why first; if it cannot be written, drop the entry. Not appended after the other columns — by then keeping is already decided, and what gets written is a justification found for it. why is the admission gate: the A side quotes the exact words of decompose.stuck; the B side states what does the work in that field. B-side only ("that field works well this way") spins; A-side only restates the sticking point; the two not lining up = untranslatable back.
For evidence, choose one: the provenance of the source practice, or inferred. Marking inferred is allowed; writing an inference as a provenance is not. It governs the fact (the practice exists there); why governs the correspondence (same spot as the domain-A sticking point?).
The tool only checks that why is non-empty; it cannot tell whether it was written first or appended afterwards. Soft, like the 2c self-check: blocks the obviously undone.
6. The two gates and the commands
python3 scripts/maybe_smart.py --recall decompose.json # record gate
python3 scripts/maybe_smart.py --check cands.json decompose.json # landing gate
python3 scripts/maybe_smart.py analogy.json # audit (optional)
--quiet is an output switch, not a mode slot: by default the full report is printed; with it, only the result line (PASS / FAIL; --check processes one pair and prints a single line). Exit codes: 0 pass / 1 block / 2 input error.
Record gate: task_type non-empty and all four columns present; restated ≤40 characters; terms ≥3 with no domain_terms term (if domain_terms is not listed, this gate cannot be checked and counts as not passed); every recall entry has a non-empty b_domain; ≥3 recall entries; same source, same practice does not repeat (two different practices under one branch count as two); status takes only verified / refuted / unverified; verified carries source, refuted carries correction; at least 1 entry with origin as search and a recorded query.
Landing gate, seven checks:
- Six fields non-empty:
operator/action/subject/first_step/observable/why - ≥2 framing lenses;
operatormay take only the Chinese literals 功能 / 矛盾 / 尺度 / 失败 (function / conflict / scale / failure); any other value is non-conforming first_stepis a domain-A action (checkops_A); ifops_Ais empty, this check cannot be enforcedactionis a domain-A action (same rule)subjectis a domain-A object (same rule)whylines up: the A side is the exact words ofdecompose.stuck; the B side describes what does the work in the source; one missing = failevidenceis truth-guarded: provenance not insourcesof the record entry counts asinferred; ifevidenceis markedverifiedbut the provenance is not found in the record entry'ssources, it is not truth-guarded
A final check: what domain-A practice now changes because of this entry? If none, the entry lands nowhere — discard it.
Audit gate (scripts/maybe_smart.py analogy.json): analogy.json fields a_domain, b_domain, mapping (direction: A→B), structure (the correspondence structure in the target domain), self_consistency: check (a string listing the checks passed). The tool parses and returns the self-consistency result.