fenix-claude-plugin 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/skills/fenix-application/SKILL.md +3 -2
- package/skills/fenix-application/VERSION +1 -1
- package/skills/fenix-application/assets/claims_editor.html +1 -2
- package/skills/fenix-application/assets/figures_editor.html +1 -2
- package/skills/fenix-application/assets/spec_editor.html +1 -2
- package/skills/fenix-application/references/claim1-method-drafting.md +110 -0
- package/skills/fenix-application/references/claims.md +3 -1
- package/skills/fenix-application/references/editors.md +4 -3
- package/skills/fenix-application/references/figure-description.md +1 -1
- package/skills/fenix-application/references/figures-guidance.md +1 -1
- package/skills/fenix-application/references/figures.md +5 -3
- package/skills/fenix-application/references/patent-review.md +1 -1
- package/skills/fenix-application/references/patent-safe.md +1 -1
- package/skills/fenix-application/references/patent.md +7 -5
- package/skills/fenix-application/references/spec-guidance.md +1 -1
- package/skills/fenix-application/references/spec.md +5 -4
- package/skills/fenix-office-action/SKILL.md +24 -6
- package/skills/fenix-office-action/VERSION +1 -1
- package/skills/fenix-office-action/references/oa-analysis.md +103 -0
- package/skills/fenix-office-action/references/oa-drafting.md +104 -0
- package/skills/fenix-office-action/references/oa-response.md +54 -6
- package/skills/fenix-project/SKILL.md +4 -4
- package/skills/fenix-project/VERSION +1 -1
- package/skills/fenix-project/references/create-project.md +5 -6
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fenix",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Fenix patent automation for Claude — MCP connector plus patent drafting, office-action, and project skills. Provide one API key; the server infers your firm (client + database).",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Fenix AI",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fenix-claude-plugin",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Fenix patent automation plugin for Claude Code — MCP connector plus patent drafting, office-action, and project skills.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"homepage": "https://claude.fenix.ai",
|
|
@@ -6,7 +6,7 @@ description: >-
|
|
|
6
6
|
|
|
7
7
|
# Fenix Application
|
|
8
8
|
|
|
9
|
-
**Skill version:
|
|
9
|
+
**Skill version: 13** (authoritative version is in the top-level `VERSION` file; this line is for reference only).
|
|
10
10
|
|
|
11
11
|
## Triggers
|
|
12
12
|
|
|
@@ -42,6 +42,7 @@ Custom instructions may freely change tone, phrasing, default counts, section pr
|
|
|
42
42
|
## Contents
|
|
43
43
|
- `references/patent.md` -- 3-phase workflow
|
|
44
44
|
- `references/claims.md` -- claims drafting + verification
|
|
45
|
+
- `references/claim1-method-drafting.md` -- house style for an independent method claim 1 (skeleton, wherein rules, verb/lexicon, budgets, procedure)
|
|
45
46
|
- `references/figures.md` -- Phase 1+2 figure workflow
|
|
46
47
|
- `references/spec.md` -- spec section workflow
|
|
47
48
|
- `references/editors.md` -- exact INITIAL_CONTENT shapes + submit handling for the 3 HTML editors (read this instead of the editor HTML)
|
|
@@ -89,7 +90,7 @@ Trigger when the user asks to review, audit, red-line, or check a patent applica
|
|
|
89
90
|
## Draft a patent application
|
|
90
91
|
|
|
91
92
|
Read `references/patent.md` for the 3-phase workflow overview. Phase-specific references:
|
|
92
|
-
- **Claims**: `references/claims.md`, `references/patent-safe.md`
|
|
93
|
+
- **Claims**: `references/claims.md`, `references/claim1-method-drafting.md` (method claim 1 house style), `references/patent-safe.md`
|
|
93
94
|
- **Figures**: `references/figures.md`, `references/figures-guidance.md`
|
|
94
95
|
- **Spec**: `references/spec.md`, `references/spec-guidance.md`, `references/figure-description.md`
|
|
95
96
|
- **Disclosure interview**: `references/disclosure.md`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
13
|
|
@@ -59,7 +59,6 @@ function figBody(bd,prev,fig){
|
|
|
59
59
|
var c1=elt("div","field"); c1.appendChild(elt("label",null,"Figure Number")); var nn=document.createElement("input"); nn.className="f-num"; nn.value=fig.number||""; c1.appendChild(nn); r.appendChild(c1);
|
|
60
60
|
var c2=elt("div","field"); c2.appendChild(elt("label",null,"Type")); var sel=document.createElement("select"); sel.className="f-type"; ["Flowchart","Device","Placeholder"].forEach(function(o){ var op=document.createElement("option"); op.textContent=o; sel.appendChild(op); }); sel.value=fig.type||"Flowchart"; c2.appendChild(sel); r.appendChild(c2); bd.appendChild(r);
|
|
61
61
|
var fb=elt("div","field"); fb.appendChild(elt("label",null,"Brief Description")); var bi=document.createElement("input"); bi.className="f-brief"; bi.value=fig.briefDescription||""; bi.oninput=function(){ prev.textContent=(bi.value||"").slice(0,70); }; fb.appendChild(bi); bd.appendChild(fb);
|
|
62
|
-
var fi=elt("div","field"); fi.appendChild(elt("label",null,"Introductory Sentence")); var ii=document.createElement("input"); ii.className="f-intro"; ii.value=fig.introductory||""; fi.appendChild(ii); bd.appendChild(fi);
|
|
63
62
|
var lbl=elt("label",null,fig.type==="Device"?"Components":"Steps"); lbl.style.marginTop="6px"; bd.appendChild(lbl);
|
|
64
63
|
var tbl=document.createElement("table"); tbl.innerHTML="<thead><tr><th style='width:70px'>#</th><th style='width:170px'>Label</th><th>Description text</th><th style='width:34px'></th></tr></thead>"; var tbody=document.createElement("tbody"); tbl.appendChild(tbody); bd.appendChild(tbl);
|
|
65
64
|
var arr=(fig.type==="Device")?(fig.components||[]):(fig.steps||[]); arr.forEach(function(e){ figRow(tbody,e.number,e.label,e.text); });
|
|
@@ -78,7 +77,7 @@ window.onload=function(){ var items=toItems()||[]; if(EDITOR_TYPE==="claims"){ i
|
|
|
78
77
|
function collect(){
|
|
79
78
|
var accs=document.querySelectorAll("#acc .acc");
|
|
80
79
|
if(EDITOR_TYPE==="claims"){ var out=[]; accs.forEach(function(a){ var n=a.querySelector(".c-num").value.trim(); var t=a.querySelector(".c-txt").value; var orig=a.__claim||{}; if(n||t.trim()){ out.push({ claimNumber:n, claimStatus:orig.claimStatus||"original", claimType:orig.claimType||"", claimText:t.split(/\n/), parent:orig.parent||"", independentParent:orig.independentParent||"" }); } }); return "[EDITOR SUBMIT - claims]\n"+JSON.stringify(out,null,2); }
|
|
81
|
-
if(EDITOR_TYPE==="figures"){ var figs=[]; accs.forEach(function(a){ var type=a.querySelector(".f-type").value; var isDev=(type==="Device"); var rows=Array.from(a.querySelectorAll("tbody tr")).map(function(tr){ return {type:isDev?"component":"step",number:tr.querySelector(".r-num").value.trim(),label:tr.querySelector(".r-lab").value.trim(),text:tr.querySelector(".r-txt").value.trim(),name:tr.querySelector(".r-lab").value.trim()}; }); figs.push({number:a.querySelector(".f-num").value.trim(),type:type,briefDescription:a.querySelector(".f-brief").value.trim(),
|
|
80
|
+
if(EDITOR_TYPE==="figures"){ var figs=[]; accs.forEach(function(a){ var type=a.querySelector(".f-type").value; var isDev=(type==="Device"); var rows=Array.from(a.querySelectorAll("tbody tr")).map(function(tr){ return {type:isDev?"component":"step",number:tr.querySelector(".r-num").value.trim(),label:tr.querySelector(".r-lab").value.trim(),text:tr.querySelector(".r-txt").value.trim(),name:tr.querySelector(".r-lab").value.trim()}; }); figs.push({number:a.querySelector(".f-num").value.trim(),type:type,briefDescription:a.querySelector(".f-brief").value.trim(),steps:isDev?[]:rows,components:isDev?rows:[]}); }); return "[EDITOR SUBMIT - figures]\n"+JSON.stringify(figs,null,2); }
|
|
82
81
|
var secs={}; accs.forEach(function(a){ var nm=a.querySelector(".s-name").value.trim(); var tx=a.querySelector(".s-txt").value; if(nm){ var paras=tx.split(/\n\n+/).map(function(p){return p.trim();}).filter(Boolean).map(function(p){return "<p>"+p.replace(/\n/g," ")+"</p>";}); secs[nm]={paragraphs:paras}; } }); return "[EDITOR SUBMIT - sections]\n"+JSON.stringify(secs,null,2);
|
|
83
82
|
}
|
|
84
83
|
function go(){ var result=collect(); var done=function(){ document.getElementById("st").textContent="\u2713 Copied -- paste into chat."; }; if(navigator.clipboard){ navigator.clipboard.writeText(result).then(done).catch(fb); } else { fb(); } function fb(){ var el=document.createElement("textarea"); el.value=result; el.style.cssText="position:fixed;top:0;left:0;opacity:0;"; document.body.appendChild(el); el.select(); try{ document.execCommand("copy"); done(); }catch(e){ document.getElementById("st").textContent="Copy failed."; } document.body.removeChild(el); } }
|
|
@@ -59,7 +59,6 @@ function figBody(bd,prev,fig){
|
|
|
59
59
|
var c1=elt("div","field"); c1.appendChild(elt("label",null,"Figure Number")); var nn=document.createElement("input"); nn.className="f-num"; nn.value=fig.number||""; c1.appendChild(nn); r.appendChild(c1);
|
|
60
60
|
var c2=elt("div","field"); c2.appendChild(elt("label",null,"Type")); var sel=document.createElement("select"); sel.className="f-type"; ["Flowchart","Device","Placeholder"].forEach(function(o){ var op=document.createElement("option"); op.textContent=o; sel.appendChild(op); }); sel.value=fig.type||"Flowchart"; c2.appendChild(sel); r.appendChild(c2); bd.appendChild(r);
|
|
61
61
|
var fb=elt("div","field"); fb.appendChild(elt("label",null,"Brief Description")); var bi=document.createElement("input"); bi.className="f-brief"; bi.value=fig.briefDescription||""; bi.oninput=function(){ prev.textContent=(bi.value||"").slice(0,70); }; fb.appendChild(bi); bd.appendChild(fb);
|
|
62
|
-
var fi=elt("div","field"); fi.appendChild(elt("label",null,"Introductory Sentence")); var ii=document.createElement("input"); ii.className="f-intro"; ii.value=fig.introductory||""; fi.appendChild(ii); bd.appendChild(fi);
|
|
63
62
|
var lbl=elt("label",null,fig.type==="Device"?"Components":"Steps"); lbl.style.marginTop="6px"; bd.appendChild(lbl);
|
|
64
63
|
var tbl=document.createElement("table"); tbl.innerHTML="<thead><tr><th style='width:70px'>#</th><th style='width:170px'>Label</th><th>Description text</th><th style='width:34px'></th></tr></thead>"; var tbody=document.createElement("tbody"); tbl.appendChild(tbody); bd.appendChild(tbl);
|
|
65
64
|
var arr=(fig.type==="Device")?(fig.components||[]):(fig.steps||[]); arr.forEach(function(e){ figRow(tbody,e.number,e.label,e.text); });
|
|
@@ -78,7 +77,7 @@ window.onload=function(){ var items=toItems()||[]; if(EDITOR_TYPE==="claims"){ i
|
|
|
78
77
|
function collect(){
|
|
79
78
|
var accs=document.querySelectorAll("#acc .acc");
|
|
80
79
|
if(EDITOR_TYPE==="claims"){ var out=[]; accs.forEach(function(a){ var n=a.querySelector(".c-num").value.trim(); var t=a.querySelector(".c-txt").value; var orig=a.__claim||{}; if(n||t.trim()){ out.push({ claimNumber:n, claimStatus:orig.claimStatus||"original", claimType:orig.claimType||"", claimText:t.split(/\n/), parent:orig.parent||"", independentParent:orig.independentParent||"" }); } }); return "[EDITOR SUBMIT - claims]\n"+JSON.stringify(out,null,2); }
|
|
81
|
-
if(EDITOR_TYPE==="figures"){ var figs=[]; accs.forEach(function(a){ var type=a.querySelector(".f-type").value; var isDev=(type==="Device"); var rows=Array.from(a.querySelectorAll("tbody tr")).map(function(tr){ return {type:isDev?"component":"step",number:tr.querySelector(".r-num").value.trim(),label:tr.querySelector(".r-lab").value.trim(),text:tr.querySelector(".r-txt").value.trim(),name:tr.querySelector(".r-lab").value.trim()}; }); figs.push({number:a.querySelector(".f-num").value.trim(),type:type,briefDescription:a.querySelector(".f-brief").value.trim(),
|
|
80
|
+
if(EDITOR_TYPE==="figures"){ var figs=[]; accs.forEach(function(a){ var type=a.querySelector(".f-type").value; var isDev=(type==="Device"); var rows=Array.from(a.querySelectorAll("tbody tr")).map(function(tr){ return {type:isDev?"component":"step",number:tr.querySelector(".r-num").value.trim(),label:tr.querySelector(".r-lab").value.trim(),text:tr.querySelector(".r-txt").value.trim(),name:tr.querySelector(".r-lab").value.trim()}; }); figs.push({number:a.querySelector(".f-num").value.trim(),type:type,briefDescription:a.querySelector(".f-brief").value.trim(),steps:isDev?[]:rows,components:isDev?rows:[]}); }); return "[EDITOR SUBMIT - figures]\n"+JSON.stringify(figs,null,2); }
|
|
82
81
|
var secs={}; accs.forEach(function(a){ var nm=a.querySelector(".s-name").value.trim(); var tx=a.querySelector(".s-txt").value; if(nm){ var paras=tx.split(/\n\n+/).map(function(p){return p.trim();}).filter(Boolean).map(function(p){return "<p>"+p.replace(/\n/g," ")+"</p>";}); secs[nm]={paragraphs:paras}; } }); return "[EDITOR SUBMIT - sections]\n"+JSON.stringify(secs,null,2);
|
|
83
82
|
}
|
|
84
83
|
function go(){ var result=collect(); var done=function(){ document.getElementById("st").textContent="\u2713 Copied -- paste into chat."; }; if(navigator.clipboard){ navigator.clipboard.writeText(result).then(done).catch(fb); } else { fb(); } function fb(){ var el=document.createElement("textarea"); el.value=result; el.style.cssText="position:fixed;top:0;left:0;opacity:0;"; document.body.appendChild(el); el.select(); try{ document.execCommand("copy"); done(); }catch(e){ document.getElementById("st").textContent="Copy failed."; } document.body.removeChild(el); } }
|
|
@@ -59,7 +59,6 @@ function figBody(bd,prev,fig){
|
|
|
59
59
|
var c1=elt("div","field"); c1.appendChild(elt("label",null,"Figure Number")); var nn=document.createElement("input"); nn.className="f-num"; nn.value=fig.number||""; c1.appendChild(nn); r.appendChild(c1);
|
|
60
60
|
var c2=elt("div","field"); c2.appendChild(elt("label",null,"Type")); var sel=document.createElement("select"); sel.className="f-type"; ["Flowchart","Device","Placeholder"].forEach(function(o){ var op=document.createElement("option"); op.textContent=o; sel.appendChild(op); }); sel.value=fig.type||"Flowchart"; c2.appendChild(sel); r.appendChild(c2); bd.appendChild(r);
|
|
61
61
|
var fb=elt("div","field"); fb.appendChild(elt("label",null,"Brief Description")); var bi=document.createElement("input"); bi.className="f-brief"; bi.value=fig.briefDescription||""; bi.oninput=function(){ prev.textContent=(bi.value||"").slice(0,70); }; fb.appendChild(bi); bd.appendChild(fb);
|
|
62
|
-
var fi=elt("div","field"); fi.appendChild(elt("label",null,"Introductory Sentence")); var ii=document.createElement("input"); ii.className="f-intro"; ii.value=fig.introductory||""; fi.appendChild(ii); bd.appendChild(fi);
|
|
63
62
|
var lbl=elt("label",null,fig.type==="Device"?"Components":"Steps"); lbl.style.marginTop="6px"; bd.appendChild(lbl);
|
|
64
63
|
var tbl=document.createElement("table"); tbl.innerHTML="<thead><tr><th style='width:70px'>#</th><th style='width:170px'>Label</th><th>Description text</th><th style='width:34px'></th></tr></thead>"; var tbody=document.createElement("tbody"); tbl.appendChild(tbody); bd.appendChild(tbl);
|
|
65
64
|
var arr=(fig.type==="Device")?(fig.components||[]):(fig.steps||[]); arr.forEach(function(e){ figRow(tbody,e.number,e.label,e.text); });
|
|
@@ -78,7 +77,7 @@ window.onload=function(){ var items=toItems()||[]; if(EDITOR_TYPE==="claims"){ i
|
|
|
78
77
|
function collect(){
|
|
79
78
|
var accs=document.querySelectorAll("#acc .acc");
|
|
80
79
|
if(EDITOR_TYPE==="claims"){ var out=[]; accs.forEach(function(a){ var n=a.querySelector(".c-num").value.trim(); var t=a.querySelector(".c-txt").value; var orig=a.__claim||{}; if(n||t.trim()){ out.push({ claimNumber:n, claimStatus:orig.claimStatus||"original", claimType:orig.claimType||"", claimText:t.split(/\n/), parent:orig.parent||"", independentParent:orig.independentParent||"" }); } }); return "[EDITOR SUBMIT - claims]\n"+JSON.stringify(out,null,2); }
|
|
81
|
-
if(EDITOR_TYPE==="figures"){ var figs=[]; accs.forEach(function(a){ var type=a.querySelector(".f-type").value; var isDev=(type==="Device"); var rows=Array.from(a.querySelectorAll("tbody tr")).map(function(tr){ return {type:isDev?"component":"step",number:tr.querySelector(".r-num").value.trim(),label:tr.querySelector(".r-lab").value.trim(),text:tr.querySelector(".r-txt").value.trim(),name:tr.querySelector(".r-lab").value.trim()}; }); figs.push({number:a.querySelector(".f-num").value.trim(),type:type,briefDescription:a.querySelector(".f-brief").value.trim(),
|
|
80
|
+
if(EDITOR_TYPE==="figures"){ var figs=[]; accs.forEach(function(a){ var type=a.querySelector(".f-type").value; var isDev=(type==="Device"); var rows=Array.from(a.querySelectorAll("tbody tr")).map(function(tr){ return {type:isDev?"component":"step",number:tr.querySelector(".r-num").value.trim(),label:tr.querySelector(".r-lab").value.trim(),text:tr.querySelector(".r-txt").value.trim(),name:tr.querySelector(".r-lab").value.trim()}; }); figs.push({number:a.querySelector(".f-num").value.trim(),type:type,briefDescription:a.querySelector(".f-brief").value.trim(),steps:isDev?[]:rows,components:isDev?rows:[]}); }); return "[EDITOR SUBMIT - figures]\n"+JSON.stringify(figs,null,2); }
|
|
82
81
|
var secs={}; accs.forEach(function(a){ var nm=a.querySelector(".s-name").value.trim(); var tx=a.querySelector(".s-txt").value; if(nm){ var paras=tx.split(/\n\n+/).map(function(p){return p.trim();}).filter(Boolean).map(function(p){return "<p>"+p.replace(/\n/g," ")+"</p>";}); secs[nm]={paragraphs:paras}; } }); return "[EDITOR SUBMIT - sections]\n"+JSON.stringify(secs,null,2);
|
|
83
82
|
}
|
|
84
83
|
function go(){ var result=collect(); var done=function(){ document.getElementById("st").textContent="\u2713 Copied -- paste into chat."; }; if(navigator.clipboard){ navigator.clipboard.writeText(result).then(done).catch(fb); } else { fb(); } function fb(){ var el=document.createElement("textarea"); el.value=result; el.style.cssText="position:fixed;top:0;left:0;opacity:0;"; document.body.appendChild(el); el.select(); try{ document.execCommand("copy"); done(); }catch(e){ document.getElementById("st").textContent="Copy failed."; } document.body.removeChild(el); } }
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Method Claim 1 Drafting Guide
|
|
2
|
+
|
|
3
|
+
**Version: 13**
|
|
4
|
+
|
|
5
|
+
House style for drafting an **independent method claim 1**, especially for AI/ML
|
|
6
|
+
inventions. Use this whenever you draft a method independent claim. (Apparatus/CRM/
|
|
7
|
+
system independents mirror this claim, moving hardware into those claims only.)
|
|
8
|
+
|
|
9
|
+
## The canonical skeleton
|
|
10
|
+
Every claim 1 is **one sentence**, three steps:
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
1. A method for [broad field], comprising:
|
|
14
|
+
obtaining [input artifact(s)], wherein [definitional clause establishing antecedents];
|
|
15
|
+
generating, using a [named model], [novel intermediate artifact] based on [input(s)],
|
|
16
|
+
wherein [clause that carries the inventive distinction]; and
|
|
17
|
+
generating, using a [named model], a synthetic [output] based on [intermediate artifact],
|
|
18
|
+
wherein the synthetic [output] [nexus clause tying output to the target/input].
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Worked exemplar (the cleanest instance):
|
|
22
|
+
```
|
|
23
|
+
1. A method for media generation, comprising:
|
|
24
|
+
obtaining an input video depicting an object and a target three-dimensional (3D) point
|
|
25
|
+
track indicating a target motion of the object;
|
|
26
|
+
generating, using a 3D conditioning model, a two-dimensional (2D) motion guidance based
|
|
27
|
+
on the target 3D point track; and
|
|
28
|
+
generating, using a media generation model, a synthetic video based on the input video
|
|
29
|
+
and the 2D motion guidance, wherein the synthetic video depicts the object with the
|
|
30
|
+
target motion.
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Preamble
|
|
34
|
+
- Minimal, generic field-of-use: `A method for [two-word field], comprising:` — or the barest `A method comprising:` when a field label adds nothing. Training claims: `A method for training a machine learning model, comprising:`.
|
|
35
|
+
- **Never** put purpose, advantage, problem, or intended-result language in the preamble (it gives the examiner a claim-construction hook and does no limiting work).
|
|
36
|
+
- Do not repeat "the method" before "comprising."
|
|
37
|
+
|
|
38
|
+
## Step architecture (the job of each limitation)
|
|
39
|
+
- **Step 1 -- obtaining (context, never novelty).** Always first, always the gerund "obtaining," always conventional. Introduces every input artifact/parameter the later steps need, with a `wherein` defining them and locking relationships (e.g. "wherein the first image and the second image depict a same scene from different perspectives"). It must create an antecedent for everything later steps reference -- and nothing more. **If a step-1 element is never used again, delete it.**
|
|
40
|
+
- **Step 2 (optionally 3) -- transformation (all of the novelty).** Creates the **one novel intermediate artifact** that distinguishes the invention. Keep the verb phrase generic ("generating, using a [model],"); the inventive content rides in the **object of the verb + its `wherein` clause**. Coin a name for the artifact, define it in the `wherein`, and make the spec use the same name verbatim. *If you cannot state the novelty as a single intermediate artifact + one `wherein`, the invention is not yet distilled -- keep working before drafting.*
|
|
41
|
+
- **Final step -- tangible result (detectability, never novelty).** Produces a concrete, observable output (synthetic video/image/media item, 3D model, trained model) and closes with a **nexus `wherein`** tying the output back to the target parameter from step 1 (e.g. "wherein the synthetic video depicts the object with the target motion"). The nexus clause does three jobs: makes infringement detectable from the output alone, supplies the §101 technical-result anchor, and stitches the claim into one story. **Do not omit it.**
|
|
42
|
+
- **Step-count discipline.** Three steps is the default. Four only when there are genuinely two transformations or a required UI act. More steps = more non-infringement arguments; six steps is a known failure mode.
|
|
43
|
+
|
|
44
|
+
## Wherein clauses (the workhorse of the style)
|
|
45
|
+
The style works through `wherein` clauses on steps, not extra steps. Exactly three sanctioned uses:
|
|
46
|
+
- **(a) Definitional** -- defines a coined term at first use ("wherein the modification plan comprises structured editing text including a plurality of steps..."). Substitutes for a glossary; blocks a narrower spec import.
|
|
47
|
+
- **(b) Inventive-distinction** -- carries the point of novelty inside an otherwise generic step ("wherein each of the first attention output and the second attention output is based on both the first prompt and the second prompt"). Keeps the verb broad while making the distinction explicit for §102/§103.
|
|
48
|
+
- **(c) Nexus/result** -- the closing clause above. States what the output *is* ("depicts," "has"), never what the method *achieves* (no "thereby improving...").
|
|
49
|
+
|
|
50
|
+
Stacking is bounded: **≤3 `wherein` clauses total** across the claim. More reads like a spec paragraph -- push the rest to dependents. **Never smuggle a step into a `wherein`** ("wherein the system then transmits...") -- steps are steps.
|
|
51
|
+
|
|
52
|
+
## Verb set (deliberately tiny)
|
|
53
|
+
`obtaining` (always step 1) · `generating` (every transformation and output step) · `training` (training claims) · `encoding` (only where the encoding itself is inventive) · and sparingly `identifying`, `selecting`, `creating`, `causing display of`. That is the whole set.
|
|
54
|
+
Every verb must be: a present participle; performable by a **single software actor**; free of implied hardware, sequence, or location. **Resist domain verbs** in claim 1 -- no "synthesizing," "inferring," "denoising," "rendering," "transmitting," "segmenting," "concatenating." If a specific operation matters, it goes in a **dependent**.
|
|
55
|
+
|
|
56
|
+
## Lexicon (use / instead of / why)
|
|
57
|
+
- `obtaining` not `receiving`/`getting` -- actor- and source-neutral (covers receive, retrieve, or generate internally; "receiving" invites divided-infringement arguments).
|
|
58
|
+
- `generating` not `creating`/`computing`/`calculating` -- reads on any way of bringing the artifact into existence.
|
|
59
|
+
- `based on` not `in response to`/`as a function of`/`using only` -- boilerplate makes it "based at least in part on," so the causal link stays open; "in response to" adds an unwanted timing limitation.
|
|
60
|
+
- `using a [name] model` (participial, comma-set-off) not `by a processor`/`via` -- attributes the step to a model without adding a hardware actor. **No "by a processor" in method claims** -- hardware lives in the system claim.
|
|
61
|
+
- `synthetic [image/video/media item]` not `output`/`result`/`modified X` -- a concrete, detectable thing distinct from the input.
|
|
62
|
+
- `input [video/prompt/media item]` not `received X`/`original X` -- standard term for step-1 artifacts.
|
|
63
|
+
- `target [style/motion/shape/camera path]` not `desired`/`intended`/`specified` -- "desired/intended" is subjective-intent profanity; "target" is objective and pairs with the nexus clause.
|
|
64
|
+
- `first / second` not `a plurality of` (in claim 1) -- enumerate when two artifacts need separate downstream handling; save "a plurality of" for dependents.
|
|
65
|
+
- `indicating` / `representing` / `depicting` not `containing`/`encoding`/`describing` -- an input *indicates* a parameter, a token/embedding *represents* content, an image/video *depicts* subject matter.
|
|
66
|
+
- `causing display of` not `displaying` -- keeps the claim infringeable by a server that never renders pixels.
|
|
67
|
+
|
|
68
|
+
Spell out then abbreviate dimensional terms on first use ("three-dimensional (3D) point track"), then use the abbreviation. Per the firm's patent-safe rules, claim 1 contains **no absolutes** (always, only, must), **no subjective intent** (designed to, intended to), and **no novelty talk**. Always cross-check `references/patent-safe.md`.
|
|
69
|
+
|
|
70
|
+
## Length, breadth, element budget
|
|
71
|
+
- **Length: 60-120 words.** Below ~60 it usually fails to recite the distinction; above ~120 you are paying scope for words that belong in dependents.
|
|
72
|
+
- **Element budget: 4-8 coined noun phrases** (inputs, parameters, models, intermediates, outputs). Introduce a noun only if a later limitation uses it. **Name at most two models** (one conditioning/auxiliary, one generation).
|
|
73
|
+
- **Breadth is achieved by what is absent:** no hardware, no numeric thresholds, no data formats, no ordering language ("then," "after"), no user, no network, no second actor. **Single-actor test:** if any step could be performed by a customer while another is performed by the vendor, redraft until one party running software does everything.
|
|
74
|
+
|
|
75
|
+
## Naming & antecedent discipline
|
|
76
|
+
- Introduce every artifact with "a/an" exactly once, thereafter always "the."
|
|
77
|
+
- Enumerate parallel artifacts as "a first X and a second X" in the **same obtaining step** so both antecedents exist before either is used.
|
|
78
|
+
- Keep coined names **rigidly identical** -- "the combined sequence of tokens" never becomes "the token sequence."
|
|
79
|
+
- After any edit, **re-trace every "the" back to its "a."** Most defects are antecedent failures introduced by editing without re-checking the chain.
|
|
80
|
+
|
|
81
|
+
## Anti-patterns (do not)
|
|
82
|
+
1. Put hardware in the method claim ("by a processor-based system" on every step).
|
|
83
|
+
2. Recite numeric limits in claim 1 (a published design-around invitation).
|
|
84
|
+
3. Let the preamble promise a benefit.
|
|
85
|
+
4. Let the preamble outrun the body (e.g. a "media generation" preamble over an all-audio body -- pick "audio generation" or generalize the body).
|
|
86
|
+
5. Hard-code an embodiment choice in an independent that a dependent then varies.
|
|
87
|
+
6. Duplicate dependents across the set.
|
|
88
|
+
7. Leave step-1 elements unused by later steps.
|
|
89
|
+
|
|
90
|
+
## Drafting procedure
|
|
91
|
+
1. **Name the novel intermediate artifact first.** State it as "the insight is [artifact] built from [inputs] that lets [model] produce [output]." If you can't, return to the disclosure.
|
|
92
|
+
2. **Draft the middle step** around that artifact: "generating, using a [model], [artifact] based on [input], wherein [the distinction]." Coin the name here; this `wherein` is where novelty lives.
|
|
93
|
+
3. **Draft the final step:** "generating, using a [generation model], a synthetic [output] based on [artifact]," + the nexus `wherein` tying the output to the target parameter.
|
|
94
|
+
4. **Draft the obtaining step last:** collect every input/parameter the other steps referenced, introduce each with "a/an," add one definitional `wherein`. Delete anything not used downstream.
|
|
95
|
+
5. **Choose the preamble:** "A method for [two-word field], comprising:" -- or "A method comprising:" if a field label limits nothing.
|
|
96
|
+
6. **Audit against the budgets:** ≤4 steps, ≤120 words, ≤8 coined nouns, ≤3 `wherein` clauses, 0 hardware, 0 numbers, 0 second actors, verbs from the set above. Anything over budget moves to a dependent.
|
|
97
|
+
7. **Re-trace antecedents end to end,** then draft dependents by re-opening the step verbs ("wherein obtaining the [X] comprises:" / "further comprising:"), one concept per dependent.
|
|
98
|
+
8. **Sweep against `references/patent-safe.md`** (no absolutes, intent, or novelty talk) and confirm the spec uses the claim's coined terms verbatim.
|
|
99
|
+
|
|
100
|
+
## Fill-in template
|
|
101
|
+
```
|
|
102
|
+
1. A method for [field], comprising:
|
|
103
|
+
obtaining [a first input] and [a second input / a parameter], wherein [the input(s)]
|
|
104
|
+
[depict(s)/indicate(s)] [relationship or target];
|
|
105
|
+
generating, using a [conditioning/auxiliary model], [the novel intermediate artifact]
|
|
106
|
+
based on [the input(s)], wherein [the artifact] [the inventive distinction]; and
|
|
107
|
+
generating, using a [generation model], a synthetic [output] based on [the first input]
|
|
108
|
+
and [the intermediate artifact], wherein the synthetic [output] [depicts/has] [the
|
|
109
|
+
target] [indicated by the parameter].
|
|
110
|
+
```
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
# Claims Workflow
|
|
2
2
|
|
|
3
|
-
**Version:
|
|
3
|
+
**Version: 13**
|
|
4
4
|
|
|
5
5
|
## Before drafting
|
|
6
6
|
Read `references/patent-safe.md` for language guidelines.
|
|
7
|
+
**For an independent METHOD claim 1 (especially AI/ML inventions), read `references/claim1-method-drafting.md`** -- the house style: the 3-step canonical skeleton (obtaining -> transformation -> tangible result), the `wherein`-clause rules, the verb set + lexicon, the word/element/length budgets, antecedent discipline, anti-patterns, and a step-by-step drafting procedure + fill-in template. Apply it when drafting any method independent claim.
|
|
7
8
|
|
|
8
9
|
## One claim at a time
|
|
9
10
|
(a) Draft -> (b) show -> ask "Does Claim N look right?" -- **END TURN** -> (c) after reply: revise or move to next
|
|
11
|
+
**Do NOT save after each claim** -- it is slow. Accumulate the confirmed claims and **save the whole set once** at the end of the pass (see Save below).
|
|
10
12
|
|
|
11
13
|
## Order
|
|
12
14
|
First independent -> its dependents -> next independent -> its dependents
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Editors — how to drive them
|
|
2
2
|
|
|
3
|
-
**Version:
|
|
3
|
+
**Version: 13**
|
|
4
4
|
|
|
5
5
|
This skill ships three accordion HTML editors in `assets/`. **You never need to open or read the editor HTML** — everything you need to pre-fill and read them back is below.
|
|
6
6
|
|
|
@@ -30,14 +30,15 @@ Output: `[EDITOR SUBMIT - claims]` then a JSON array of the same schema. Strip t
|
|
|
30
30
|
INITIAL_CONTENT = array of figure objects:
|
|
31
31
|
```
|
|
32
32
|
[
|
|
33
|
-
{ "number": "1", "type": "Flowchart", "briefDescription": "...",
|
|
33
|
+
{ "number": "1", "type": "Flowchart", "briefDescription": "...",
|
|
34
34
|
"steps": [ { "number": "100", "label": "receive", "text": "receiving a request" } ], "components": [] },
|
|
35
|
-
{ "number": "2", "type": "Device", "briefDescription": "...",
|
|
35
|
+
{ "number": "2", "type": "Device", "briefDescription": "...",
|
|
36
36
|
"steps": [], "components": [ { "number": "200", "label": "processor", "text": "a processor" } ] }
|
|
37
37
|
]
|
|
38
38
|
```
|
|
39
39
|
- `type` is "Flowchart" | "Device" | "Placeholder".
|
|
40
40
|
- Flowchart figures use `steps`; Device figures use `components`. Each row is `{ number, label, text }`.
|
|
41
|
+
- There is no per-figure introductory-sentence field. The figure's introductory/opening sentence is generated from its `briefDescription` during spec drafting — do not collect or pass it.
|
|
41
42
|
Output: `[EDITOR SUBMIT - figures]` then a JSON array of figure objects. Strip the prefix; call `save_project({ type: "figures", figures: [...] })`.
|
|
42
43
|
|
|
43
44
|
## spec_editor.html
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Figures Workflow
|
|
2
2
|
|
|
3
|
-
**Version:
|
|
3
|
+
**Version: 13**
|
|
4
4
|
|
|
5
5
|
## Phase 1 -- List
|
|
6
6
|
1. `get_project({ projectId, include: ["figures"] })` -- note ALL figures including Placeholders
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
|
|
12
12
|
## Phase 2 -- Content (one figure at a time)
|
|
13
13
|
Skip Placeholders (type="Placeholder" or empty steps/components).
|
|
14
|
-
For each: read `references/figures-guidance.md` -> generate -> show -- **END TURN** -> confirm
|
|
14
|
+
For each: read `references/figures-guidance.md` -> generate -> show -- **END TURN** -> confirm, then move to the next figure.
|
|
15
|
+
**Do NOT save after each figure** -- it is slow. Accumulate the confirmed figures and **save the whole set once** at the end of the pass with `save_project({ type: "figures", figures: allFigures })` (include every figure, existing + new).
|
|
15
16
|
|
|
16
17
|
## Numbering
|
|
17
18
|
- Flowchart steps: 100, 105, 110...
|
|
@@ -22,7 +23,8 @@ For each: read `references/figures-guidance.md` -> generate -> show -- **END T
|
|
|
22
23
|
`{ type, label, number, text, name, action, angle, flipX, flipY }`
|
|
23
24
|
|
|
24
25
|
## Editor (accordion)
|
|
25
|
-
**Always ask the user whether they want to open the figures editor to review/edit all figures at once** -- e.g. "Want me to open the figures editor so you can review them all together?" Only open it if they say yes. To open it, open `assets/figures_editor.html` with `INITIAL_CONTENT` set to the full figures JSON array. Each figure is a collapsible accordion item; opening one reveals its number, type, brief
|
|
26
|
+
**Always ask the user whether they want to open the figures editor to review/edit all figures at once** -- e.g. "Want me to open the figures editor so you can review them all together?" Only open it if they say yes. To open it, open `assets/figures_editor.html` with `INITIAL_CONTENT` set to the full figures JSON array. Each figure is a collapsible accordion item; opening one reveals its number, type, brief description, and a steps/components table with add/remove rows. There is no introductory-sentence field -- the figure's introductory/opening sentence is generated from its brief description during spec drafting. The user can also add/remove whole figures. On `[EDITOR SUBMIT - figures]`, strip the prefix and call `save_project({ type: "figures", figures: [...] })` with the returned array.
|
|
26
27
|
|
|
27
28
|
## After all figures
|
|
28
29
|
Run `scripts/calculate_figure_layout.py` with the figures JSON -> check `warnings` array and `readyToPrint` flag. **Do NOT print automatically.** Only call `print_patent(type=drawings)` if the user explicitly asks for the drawings file. After figures are saved and the layout is clean, simply tell the user the figures are ready and ask whether they want the drawings file generated.
|
|
30
|
+
**When you do run `print_patent(type=drawings)`, always show the user the returned download URL/link in your reply** -- do not run the print silently. Surface the link (e.g. "Drawings ready: <url>") so they can open it.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Patent Language Guidelines
|
|
2
2
|
|
|
3
|
-
**Version:
|
|
3
|
+
**Version: 13**
|
|
4
4
|
|
|
5
5
|
This file is the single source of truth for Fenix patent language and profanity rules.
|
|
6
6
|
Both the patent drafting workflow (references/claims.md) and the patent review workflow (references/patent-review.md) reference this file for profanity guidance.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# Patent Drafting Workflow
|
|
2
2
|
|
|
3
|
-
**Version:
|
|
3
|
+
**Version: 13**
|
|
4
4
|
|
|
5
5
|
## Phase overview
|
|
6
|
-
- **Phase 1 -- Claims**: Read `references/claims.md`
|
|
7
|
-
- **Phase 2 -- Figures**: `save_project(type=figures)`
|
|
8
|
-
- **Spec**: `get_project({ projectId, include: ["claims","figures","sections"] })` -> generate each section (see `references/spec.md`) -> `save_project(type=section)` per section
|
|
6
|
+
- **Phase 1 -- Claims**: Read `references/claims.md` -> draft one-by-one (confirm each) -> save the whole set **once** at the end with `save_project(type=claims)`. Do not save after each claim.
|
|
7
|
+
- **Phase 2 -- Figures**: agree the figure list (`save_project(type=figures)`), then draft each figure's content one-by-one (confirm each) and save the whole set **once** at the end with `save_project(type=figures)`. Do not save per figure. Then run `scripts/calculate_figure_layout.py` (pipe figure JSON) -> check warnings.
|
|
8
|
+
- **Spec**: `get_project({ projectId, include: ["claims","figures","sections"] })` -> generate each section (see `references/spec.md`) -> `save_project(type=section)` per section as the user confirms it.
|
|
9
9
|
|
|
10
|
-
**Do not print (generate a document/file) automatically.** Printing is a separate, explicit step -- only call `print_patent` when the user asks for the drawings, the spec document, or an export.
|
|
10
|
+
**Do not print (generate a document/file) automatically.** Printing is a separate, explicit step -- only call `print_patent` when the user asks for the drawings, the spec document, or an export. **After any `print_patent` call, always show the returned download URL/link in your reply** -- never run a print and leave the result unshown.
|
|
11
11
|
|
|
12
12
|
## Intake
|
|
13
13
|
1. Matter -- `get_project({ identifier })` (exact) or `get_project({ query })` (keyword search)
|
|
@@ -15,4 +15,6 @@
|
|
|
15
15
|
3. Disclosure -- user describes or run `references/disclosure.md` interview
|
|
16
16
|
4. Phase -- ask which to start
|
|
17
17
|
|
|
18
|
+
**Use the imported data as-is -- do NOT drop or stub any of it.** When a template/source is imported, the response carries real figure data (brief descriptions, components, stencils/placeholders, steps, numbering) and sections. Carry every field through to `save_project` exactly as imported; only fill in genuinely missing pieces. Never replace an imported brief description, component list, stencil/placeholder, or section with a placeholder, an old stub, or invented content. If a field looks empty, confirm with the user rather than substituting a stub.
|
|
19
|
+
|
|
18
20
|
Call `save_project(name, disclosure, templateId|sourceProjectId)` after intake.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Spec Drafting Workflow
|
|
2
2
|
|
|
3
|
-
**Version:
|
|
3
|
+
**Version: 13**
|
|
4
4
|
|
|
5
5
|
## Start
|
|
6
6
|
`get_project({ projectId, include: ["claims","figures","sections"] })` -- loads claims, figure list, and any previously saved sections.
|
|
@@ -31,8 +31,9 @@ Summarize claim 1: what it does, the key technical mechanism, and the tangible o
|
|
|
31
31
|
### Per-figure Detailed Description (Figure N sections)
|
|
32
32
|
Read `references/figure-description.md` for the full protocol. Key rules:
|
|
33
33
|
- At least two paragraphs per figure.
|
|
34
|
-
-
|
|
35
|
-
-
|
|
34
|
+
- **The opening/introductory paragraph is generated from the figure's `briefDescription`** (there is no separate per-figure introductory field). e.g. "FIG. [N] [shows/illustrates] [briefDescription]. ..."
|
|
35
|
+
- Flowchart: opening paragraph (from brief description) -> one paragraph per step ("In block [number], the process includes [step text].").
|
|
36
|
+
- Device: opening paragraph (from brief description) introducing components -> one paragraph per component ("The [label] [number] [action/description].").
|
|
36
37
|
- Reference each component by number on first mention.
|
|
37
38
|
- Skip Placeholder/stencil figures (type="Placeholder" or empty steps/components).
|
|
38
39
|
|
|
@@ -45,4 +46,4 @@ Read `references/spec-guidance.md` for the drafting prompt for each section.
|
|
|
45
46
|
## Notes
|
|
46
47
|
- Claims are already saved -- do not include them as a section here.
|
|
47
48
|
- For the one-at-a-time flow, use `save_project(type=section)` directly after the user confirms each section. For a full review pass, use the accordion editor above and save all at once with `save_project(type=sections)`.
|
|
48
|
-
- **Do NOT print automatically.** After all sections are saved, tell the user the specification is complete and ask whether they want the Word document generated. Only call `print_patent(type=spec)` when the user explicitly asks for it.
|
|
49
|
+
- **Do NOT print automatically.** After all sections are saved, tell the user the specification is complete and ask whether they want the Word document generated. Only call `print_patent(type=spec)` when the user explicitly asks for it. **When you do, show the returned download URL/link in your reply** (e.g. "Specification ready: <url>") -- never run the print and leave the result unshown.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fenix-office-action
|
|
3
3
|
description: >-
|
|
4
|
-
Office action response workflow: identify matter,
|
|
4
|
+
Office action response workflow: identify matter, populate the OA from USPTO, pull the cited references, analyze the rejections, and draft amendments and remarks (attorney-approved), then generate the OA response shell.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Fenix Office Action
|
|
8
8
|
|
|
9
|
-
**Skill version:
|
|
9
|
+
**Skill version: 4** (authoritative version is in the top-level `VERSION` file; this line is for reference only).
|
|
10
10
|
|
|
11
11
|
## Triggers
|
|
12
12
|
|
|
@@ -27,14 +27,32 @@ Apply the custom overrides **only as long as the result still satisfies every st
|
|
|
27
27
|
Custom instructions may freely change tone, phrasing, default counts, section preferences, review emphasis, and similar. If a custom instruction would break a required format, follow the default format and tell the user which customization could not be applied and why.
|
|
28
28
|
|
|
29
29
|
## Contents
|
|
30
|
-
- `references/oa-response.md` --
|
|
30
|
+
- `references/oa-response.md` -- the end-to-end 7-phase OA response workflow (read this first)
|
|
31
|
+
- `references/oa-analysis.md` -- rejection analysis: classify each rejection, choose amend vs. argue, map claim elements against the cited art
|
|
32
|
+
- `references/oa-drafting.md` -- how to draft and save amendments and remarks (claim-status conventions + exact save contracts)
|
|
31
33
|
|
|
32
34
|
## When to use this skill
|
|
33
35
|
|
|
34
|
-
Trigger whenever the
|
|
36
|
+
Trigger whenever the attorney wants to respond to an Office Action:
|
|
35
37
|
- "office action response" / "OA response" / "respond to office action"
|
|
36
|
-
- "
|
|
38
|
+
- "we got an office action" / "set up a new OA project" / "generate the OA shell"
|
|
37
39
|
|
|
38
40
|
## How to use
|
|
39
41
|
|
|
40
|
-
Read `references/oa-response.md`
|
|
42
|
+
Read `references/oa-response.md` first -- it is the spine of the workflow. The phases are:
|
|
43
|
+
1. Identify the matter and find/create the OA-response project.
|
|
44
|
+
2. `populate_project_from_uspto` -- import the OA rejections, dispositions, references, and claims.
|
|
45
|
+
3. `import_oa_references` -- download the cited references and capture their text (needed for §102/§103 arguments).
|
|
46
|
+
4. Analyze the rejections (`references/oa-analysis.md`) -- classify, choose strategy, map elements. **Stop for attorney approval.**
|
|
47
|
+
5. Draft + save amendments (`references/oa-drafting.md`). **Attorney approval before saving.**
|
|
48
|
+
6. Draft + save remarks (`references/oa-drafting.md`). **Attorney approval before saving.**
|
|
49
|
+
7. Assemble the response document: `get_oa_shell_doc` returns the formatted shell as base64; fill it with your docx skill (see `references/oa-drafting.md`). `print_patent({ type: "oa_shell" })` still returns just the blank shell link if that is all that is wanted.
|
|
50
|
+
|
|
51
|
+
## Invariants
|
|
52
|
+
|
|
53
|
+
- **Never pass `clientDb`** -- it is inferred from the API key.
|
|
54
|
+
- **Pass assignee initials directly** -- the backend resolves initials to the user; do not call get_user_by_initials first.
|
|
55
|
+
- **Generate the response document only at Phase 7**, after the amendments and arguments are approved -- do not assemble or print documents earlier or out of order.
|
|
56
|
+
- **Batch your saves** -- use one `save_project` call with an `operations` array (oa_data + claims + sections) instead of many separate calls.
|
|
57
|
+
- **Approve before saving** -- amendments and arguments are legal work product; the attorney approves each before you save it.
|
|
58
|
+
- **Never fabricate prior-art content** -- only distinguish a reference whose disclosure text you actually have (see `import_oa_references`).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
4
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Office Action Rejection Analysis
|
|
2
|
+
|
|
3
|
+
**Version: 4**
|
|
4
|
+
|
|
5
|
+
This file is how you turn the imported `oa_data` into a response strategy. The method is **classify → select → fill**:
|
|
6
|
+
|
|
7
|
+
1. **Classify** each rejection into a sub-type (not just the statute, but *which kind* of §101/§103/§112 rejection).
|
|
8
|
+
2. **Select** the response approach and, where applicable, the matching argument scaffold below.
|
|
9
|
+
3. **Fill** the scaffold from the project's `oa_data`, `claims`, and the cited references' disclosure text.
|
|
10
|
+
|
|
11
|
+
Then present the per-rejection strategy to the attorney and **stop for approval before drafting** (Phase 5). Defaults below are recommendations — the attorney decides amend vs. argue.
|
|
12
|
+
|
|
13
|
+
## Reading the data
|
|
14
|
+
|
|
15
|
+
Each entry in `oa_data.oa_rejections` has:
|
|
16
|
+
- `status_type` / `status_type_extended` — the rejection basis (e.g. contains "101", "102", "103", "112").
|
|
17
|
+
- `status_claims` — the claim numbers under this rejection.
|
|
18
|
+
- `reject_refs` / `status_refs` — the references applied (resolve to citations; their disclosure text is on the citation's `plainText` after `import_oa_references`).
|
|
19
|
+
- `match`, `page` — the verbatim rejection text and page in the OA.
|
|
20
|
+
|
|
21
|
+
`oa_data.claim_dispositions` tells you the big picture: `allowed_claims`, `rejected_claims`, `objected_claims`, `withdrawn_claims`, `restriction_or_election`.
|
|
22
|
+
|
|
23
|
+
Always ground citations in the live MPEP (https://www.uspto.gov/web/offices/pac/mpep/index.html) — pull the current section text rather than relying on memory, since guidance changes.
|
|
24
|
+
|
|
25
|
+
## Start every analysis with an overview and a claim-1 map
|
|
26
|
+
|
|
27
|
+
Before working rejection-by-rejection, orient the attorney with two things:
|
|
28
|
+
|
|
29
|
+
1. **Invention overview (1 paragraph).** A single tight paragraph: what the invention is and the problem it solves, drawn from the claims and the specification.
|
|
30
|
+
|
|
31
|
+
2. **Claim 1 limitation table.** Map each limitation of independent claim 1 to the art the examiner applied and your validity read:
|
|
32
|
+
|
|
33
|
+
| Claim 1 limitation | Examiner's cited reference + location | Does the cited part actually disclose the limitation? (valid / questionable / no — why) |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| _e.g. "a processor configured to…"_ | _e.g. Smith ¶[0042], Fig. 3_ | _e.g. Questionable — Smith discloses X but not the claimed Y_ |
|
|
36
|
+
|
|
37
|
+
Fill the middle column from the rejection's `match`/`page` and the cited reference's disclosure text — call `get_reference_text({ citationId })` for the references the examiner applied (the `citationId` comes from the `import_oa_references` list). Fill the right column with your element-by-element read: is the examiner's mapping correct, a stretch, or wrong, and why. This table is the backbone of the §102/§103 analysis — the strongest distinctions surface here.
|
|
38
|
+
|
|
39
|
+
Present the overview + table to the attorney, then proceed to the per-rejection analysis below.
|
|
40
|
+
|
|
41
|
+
## §101 — Subject-matter eligibility (MPEP 2106)
|
|
42
|
+
|
|
43
|
+
**Classify** the rejection into the Alice/Mayo step it turns on, and the abstract-idea grouping it asserts:
|
|
44
|
+
- **Mental process** — steps that could be performed in the human mind (MPEP 2106.04(a)(2)(III)).
|
|
45
|
+
- **Mathematical concept** — a formula/calculation (MPEP 2106.04(a)(2)(I)).
|
|
46
|
+
- **Organizing human activity** — commercial/legal interactions, managing behavior (MPEP 2106.04(a)(2)(II)).
|
|
47
|
+
|
|
48
|
+
**Default strategy:** argue eligibility first (Step 2A prong 1 — not directed to the exception; prong 2 — integrated into a practical application), and optionally amend to recite the technical improvement concretely. Argument scaffolds:
|
|
49
|
+
|
|
50
|
+
- **Step 2A prong 2 — practical application / technical improvement:** identify the concrete improvement the claim provides and tie it to the specification. Frame the improvement at the system level (e.g. reduced latency, memory utilization, power, processing cycles, accuracy). *Enfish* (improvement to computer functionality itself) and *Core Wireless* (specific improved interface) are anchor cases for "improvement," not "abstract idea."
|
|
51
|
+
- **Step 2B — not well-understood, routine, conventional:** under *Berkheimer*, the examiner must support a WURC finding with a record citation (spec statement, court decision, publication, or official notice — MPEP 2106.05(d)). If they did not, say so.
|
|
52
|
+
|
|
53
|
+
**AI-specific (see the AI Patenting Handbook):** For AI inventions, push the practical-application argument by (1) showing the claim is not merely a mental process automated by a computer, (2) connecting the AI output to a system-level technical improvement, and (3) avoiding framing limitations with mental-process verbs (predict/identify/evaluate) where a more technical framing is accurate. Training-claim limitations can help eligibility but watch enforceability. Consult the handbook's §101 prosecution section (mental-process, organizing-human-behavior, mathematical-concept rejections) for the current USPTO study insights.
|
|
54
|
+
|
|
55
|
+
## §102 — Anticipation (MPEP 2131)
|
|
56
|
+
|
|
57
|
+
**Default strategy:** distinguish the single reference, or amend to add a distinguishing element with spec support.
|
|
58
|
+
|
|
59
|
+
**Element-by-element mapping (required):** A §102 rejection fails if the single reference does not disclose **every** element of the claim, arranged as claimed. Using the reference's `plainText`:
|
|
60
|
+
1. List each element/limitation of the rejected independent claim.
|
|
61
|
+
2. For each, find where (if anywhere) the reference discloses it; quote the passage.
|
|
62
|
+
3. Identify at least one element that is **absent** from the reference (or not arranged as claimed). That gap is the anticipation argument.
|
|
63
|
+
|
|
64
|
+
To get a reference's text, call `get_reference_text({ citationId })` (the `citationId` comes from the `import_oa_references` list). It returns clean EPO text, or the PDF as base64 to read, or a Google Patents link, or captured OCR text, and only asks the attorney as a last resort. Never guess a reference's contents.
|
|
65
|
+
|
|
66
|
+
## §103 — Obviousness (MPEP 2141–2145)
|
|
67
|
+
|
|
68
|
+
**Classify** the weakest point of the combination and **select** the matching scaffold:
|
|
69
|
+
- **No articulated reasoning / no motivation to combine (MPEP 2142–2144, KSR):** a rejection needs "articulated reasoning with rational underpinning" (*In re Kahn*, *KSR*). If the OA gives only a conclusory motivation, argue it is insufficient.
|
|
70
|
+
- **References teach away / contradict each other:** if combining the references defeats a reference's stated purpose, the combination is improper.
|
|
71
|
+
- **Missing element:** if no cited reference (alone or combined) teaches a particular limitation, there is no prima facie case (*In re Royka* — all limitations must be taught/suggested).
|
|
72
|
+
- **Improper hindsight (MPEP 2145(X)(A)):** if the only place the motivation appears is the applicant's own specification, the combination is impermissible hindsight.
|
|
73
|
+
- **Apparatus — structure vs. function (MPEP 2114):** for apparatus claims, argue the prior-art structure does not inherently possess the functionally-defined limitations (*In re Schreiber*).
|
|
74
|
+
- **Official notice (MPEP 2144.03):** if the examiner took official notice of a fact not "capable of instant and unquestionable demonstration," traverse it.
|
|
75
|
+
|
|
76
|
+
**Default strategy:** attack the combination on its weakest point above; or amend around it. Do the same element-by-element mapping as §102 across the combination, citing each reference's `plainText`.
|
|
77
|
+
|
|
78
|
+
## §112 — Disclosure and definiteness
|
|
79
|
+
|
|
80
|
+
- **§112(a) written description / enablement (MPEP 2161–2164):** default amend toward what the spec supports; argue with citation to the supporting paragraphs. Flag any amendment that risks **new matter**.
|
|
81
|
+
- **§112(b) indefiniteness / antecedent basis (MPEP 2171–2174):** default amend to cure (add antecedent basis, clarify the term). Argue only where the term is definite in context, citing the spec.
|
|
82
|
+
- **§112(f) means-plus-function (MPEP 2181–2186):**
|
|
83
|
+
- If the OA *interprets* a non-"means" term under §112(f) and you disagree, argue the term is not a generic placeholder (it connotes structure) — compare to terms courts found not to invoke §112(f) ("circuit," "detent mechanism," etc., MPEP 2181.I.A).
|
|
84
|
+
- If §112(f) applies and the OA says the spec lacks corresponding structure/algorithm, point to the specification's algorithm(s)/paragraphs that perform the function (*Net MoneyIN*).
|
|
85
|
+
|
|
86
|
+
## Restriction / election (MPEP ch. 800)
|
|
87
|
+
|
|
88
|
+
If `claim_dispositions.restriction_or_election` is populated: elect a group (with or without traverse). If traversing, argue the groups are not independent/distinct or that examining them together is not an undue search burden (MPEP 803, 806, 818).
|
|
89
|
+
|
|
90
|
+
## Double patenting (MPEP 804)
|
|
91
|
+
|
|
92
|
+
Require the examiner to make the claim-by-claim showing 804 demands (identify the specific pair of claims, the differences, and the obviousness/anticipation showing). A bulk or conclusory double-patenting statement is not a proper rejection. Consider a terminal disclaimer only on the attorney's instruction.
|
|
93
|
+
|
|
94
|
+
## Objections and procedural items
|
|
95
|
+
|
|
96
|
+
- **Claim objections / objected claims:** address formally; if a claim is "allowable but for its dependency," note it will be rewritten in independent form.
|
|
97
|
+
- **Title objection:** propose an amended, descriptive title.
|
|
98
|
+
- **Improper final rejection:** if the final action does not address the claims as previously amended, request withdrawal of finality.
|
|
99
|
+
- **Allowed claims:** confirm them in the remarks; do not amend.
|
|
100
|
+
|
|
101
|
+
## Output of this phase
|
|
102
|
+
|
|
103
|
+
For each rejection, produce: the sub-type, the recommended approach (amend / argue / both), the affected claims, the references involved, and the gist of the argument (with the element gap for §102/§103). Record nothing yet — present to the attorney for approval first.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Office Action Response Drafting & Save Contracts
|
|
2
|
+
|
|
3
|
+
**Version: 4**
|
|
4
|
+
|
|
5
|
+
This file defines how drafted amendments and arguments are written back to Fenix. Everything here happens **after** the attorney approves the strategy (Phase 4) and the draft (Phases 5–6).
|
|
6
|
+
|
|
7
|
+
## Where each artifact is saved
|
|
8
|
+
|
|
9
|
+
| Artifact | Saved to | How |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| Amended claim text | `Project.claims` | `save_project({ type: "claims" })` |
|
|
12
|
+
| Which claims were amended / cancelled / added | `oa_data.amendmentsStatus` | `save_project({ fields: { oa_data } })` (read-merge-write) |
|
|
13
|
+
| Per-rejection drafted argument | `oa_data.oa_rejections[i].argument` / `.response_strategy` | `save_project({ fields: { oa_data } })` (read-merge-write) |
|
|
14
|
+
| Final remarks prose | `Project.sections` | `save_project({ type: "sections" })` |
|
|
15
|
+
|
|
16
|
+
## Save efficiently — batch in ONE call
|
|
17
|
+
|
|
18
|
+
At the end of drafting you typically save several things: the updated `oa_data` (amendmentsStatus + per-rejection arguments), the amended `claims`, and the remarks `sections`. **Do them in a single `save_project` call using the `operations` array** — do not make a separate call for each:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
save_project({
|
|
22
|
+
projectId,
|
|
23
|
+
operations: [
|
|
24
|
+
{ fields: { oa_data: <full merged oa_data> } }, // amendmentsStatus + oa_rejections[].argument (read-merge-write)
|
|
25
|
+
{ type: "claims", claims: [ ... ] }, // amended claims
|
|
26
|
+
{ type: "sections", sections: { ... } } // remarks
|
|
27
|
+
]
|
|
28
|
+
})
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The operations run in order; the response returns a `steps` array — check each `ok`, and the claims step's `parseVerification.ok`. The single-operation params still work for one-off saves.
|
|
32
|
+
|
|
33
|
+
## CRITICAL: read-merge-write for `oa_data`
|
|
34
|
+
|
|
35
|
+
`save_project({ fields: { oa_data } })` **replaces the entire `oa_data` object** (it is a `$set`). To avoid wiping the imported rejections, dispositions, and references, you must:
|
|
36
|
+
|
|
37
|
+
1. Load the current full object: `get_project({ projectId, include: ["oa_data"] })`.
|
|
38
|
+
2. Modify the in-memory object (add `amendmentsStatus`, set `oa_rejections[i].argument`, etc.) **without dropping any existing keys**.
|
|
39
|
+
3. Save the complete merged object back: `save_project({ projectId, fields: { oa_data: <full merged object> } })`.
|
|
40
|
+
|
|
41
|
+
Never send a partial `oa_data`.
|
|
42
|
+
|
|
43
|
+
## Amendment status conventions (37 CFR 1.121)
|
|
44
|
+
|
|
45
|
+
Every claim presented in an amendment carries a status identifier. Use these exact `claimStatus` values:
|
|
46
|
+
- **(Original)** — unchanged since filing.
|
|
47
|
+
- **(Currently Amended)** — being changed in this response (show changes with underline/strikethrough in the remarks/document, not in the stored `claimText`).
|
|
48
|
+
- **(Previously Presented)** — added/amended in an earlier response, unchanged now.
|
|
49
|
+
- **(Canceled)** — removed; no claim text.
|
|
50
|
+
- **(New)** — newly added in this response.
|
|
51
|
+
- **(Withdrawn)** — non-elected; not under examination.
|
|
52
|
+
|
|
53
|
+
## Saving amended claims
|
|
54
|
+
|
|
55
|
+
`save_project({ type: "claims", claims: [ ... ] })` where each claim is:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
{ claimNumber: "1", claimStatus: "Currently Amended", claimType: "independent",
|
|
59
|
+
claimText: ["...limitation...", "...limitation..."], parent: "", independentParent: "" }
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
- Dependent claims set `claimType: "dependent"`, `parent` to the claim they depend from, and `independentParent` to the root independent claim.
|
|
63
|
+
- You may instead pass `rawClaims` (text); the server parses it and returns `parseVerification`.
|
|
64
|
+
|
|
65
|
+
**You MUST evaluate `parseVerification.ok` in the response.** If it is `false` (gaps in numbering, suspected merged claims, or count mismatch vs. `sourceClaimMarkers`), the auto-parse failed: parse the claims yourself into the structured array above and re-call `save_project({ type: "claims", claims: [...] })` with your corrected JSON. Do not just resend raw text.
|
|
66
|
+
|
|
67
|
+
## Saving the amendment bookkeeping
|
|
68
|
+
|
|
69
|
+
Populate `oa_data.amendmentsStatus` (read-merge-write the full `oa_data`):
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
amendmentsStatus: {
|
|
73
|
+
amend: [<claim numbers currently amended>],
|
|
74
|
+
canx: [<claim numbers canceled>],
|
|
75
|
+
added: [<new claim numbers>],
|
|
76
|
+
pending_claims: [<all claim numbers pending after this response>],
|
|
77
|
+
pending_claims_ind: [<the independent claim numbers among those>]
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Saving the per-rejection arguments
|
|
82
|
+
|
|
83
|
+
For each rejection you responded to, set two keys on that entry in `oa_data.oa_rejections` (read-merge-write):
|
|
84
|
+
- `response_strategy`: `"amend"` | `"argue"` | `"both"`.
|
|
85
|
+
- `argument`: the drafted argument prose for that rejection.
|
|
86
|
+
|
|
87
|
+
This keeps each argument co-located with the rejection it answers. Do not remove or reorder the existing keys (`status_type`, `status_claims`, `status_refs`, etc.).
|
|
88
|
+
|
|
89
|
+
## Saving the remarks
|
|
90
|
+
|
|
91
|
+
Write the Remarks as project `sections`: a claim-status summary section, then one section per rejection (in OA order) containing the approved argument. Save with `save_project({ type: "sections", sections: { ... } })` (bulk) or `save_project({ type: "section", sectionName, paragraphs: [<HTML strings>] })` per section. Keep the section names stable — the OA shell print consumes them.
|
|
92
|
+
|
|
93
|
+
## Remarks structure (recommended)
|
|
94
|
+
|
|
95
|
+
1. **Status of the claims** — what is pending, amended, canceled, new; which are allowed/objected.
|
|
96
|
+
2. **Claim amendments** — the marked-up claims (handled by the claims save + the document).
|
|
97
|
+
3. **Arguments**, one heading per rejection, in OA order — for each: restate the rejection briefly, then the approved argument (the element gap for §102/§103, the eligibility/practical-application argument for §101, the spec citations for §112, etc.).
|
|
98
|
+
4. **Conclusion** — request allowance / reconsideration; offer an interview if appropriate.
|
|
99
|
+
|
|
100
|
+
Always confirm the full remarks with the attorney before saving.
|
|
101
|
+
|
|
102
|
+
## Assembling the response document
|
|
103
|
+
|
|
104
|
+
After the amendments and arguments are saved, assemble the Word response document per **Phase 7** of `oa-response.md`: `get_oa_shell_doc({ projectId })` returns a direct `downloadUrl` to the formatted Fenix shell; download it to an authorized folder (or use `delivery: "base64"` if you can't download a URL), use your docx skill to insert the saved arguments and amended-claim text into the blanks, and present the filled document to the attorney. The attorney does not need to download or upload anything.
|
|
@@ -1,10 +1,58 @@
|
|
|
1
1
|
# Office Action Response Workflow
|
|
2
2
|
|
|
3
|
-
**Version:
|
|
3
|
+
**Version: 4**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
This is the end-to-end workflow for responding to a USPTO Office Action. Work through the phases in order. **Each drafting phase ends with attorney approval before anything is saved** — you draft, the attorney approves, then you save. This is legal work product; never save amendments or arguments the attorney has not approved.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
## Invariants (always)
|
|
8
|
+
|
|
9
|
+
- **Never pass `clientDb`.** It is inferred from the connector's API key. Passing it is an error.
|
|
10
|
+
- **Never auto-generate a document.** Only call `print_patent({ type: "oa_shell" })` when the attorney explicitly asks for the Word document.
|
|
11
|
+
- **Approval gate before every save.** Show the draft, ask for changes, save only after the attorney confirms.
|
|
12
|
+
- **Never fabricate prior-art content.** Only distinguish a reference whose disclosure text you actually have (see Phase 3).
|
|
13
|
+
|
|
14
|
+
## Phase 1 — Identify the matter and the OA project
|
|
15
|
+
|
|
16
|
+
1. Identify the matter: `get_project({ identifier })` (exact app/matter number) or `get_project({ query })` (keyword). Confirm the matter with the attorney.
|
|
17
|
+
2. The response includes a `projects` array. Look for an existing Office-Action-response project. If one exists, use its `projectId`.
|
|
18
|
+
3. If none exists, create one: `list_project_types` → `create_project` (matter/app number, notification date, due date, type, and the assignee's **initials** — pass the initials directly; the backend resolves them to the user, so you do **not** need to look the user up first) → `assign_project` only if WA1/WA2 need changing. (The `fenix-project` skill covers the intake flow.)
|
|
19
|
+
|
|
20
|
+
## Phase 2 — Pull the Office Action facts from USPTO
|
|
21
|
+
|
|
22
|
+
1. `populate_project_from_uspto({ projectId })`. If `matter.applicationNum` is missing it will tell you — ask the attorney for the application number and pass it as `applicationNum`.
|
|
23
|
+
2. Load the full state: `get_project({ projectId, include: ["matter", "claims", "oa_data"] })`.
|
|
24
|
+
3. **Report to the attorney and stop:** OA date and type (Non-Final / Final / Restriction), examiner, the rejections grouped by statute, which claims are rejected/objected/allowed, the cited references, and whether claims/spec/figures amendments are flagged. Let the attorney confirm the picture before you analyze.
|
|
25
|
+
|
|
26
|
+
## Phase 3 — Pull the cited-reference text
|
|
27
|
+
|
|
28
|
+
1. `import_oa_references({ projectId })` — downloads the cited references and returns a **compact list** (`references[]` with `citationId`, `label`, `number`, `pubType`, `fileUrl`, `ocrTextChars`). It does **not** return the full text (that would flood the context). The response also includes the project `dashboardUrl` (→ Citations tab) you can share.
|
|
29
|
+
2. For each reference you actually need to read — usually the ones the examiner applied against the claims you are arguing — call `get_reference_text({ citationId })`. It walks a fallback chain and returns whichever source worked (`source` tells you which):
|
|
30
|
+
- **`epo`** — clean structured claims + description in `text`; use it directly.
|
|
31
|
+
- **`google_patents_url`** — read the `url` with your web tools.
|
|
32
|
+
- **`pdf_url`** — download the `downloadUrl` to a local `.pdf` and read it with your pdf/Read tools (don't WebFetch it). (`source: "pdf_base64"` returns the bytes inline only if you can't download a URL.)
|
|
33
|
+
- **`ocr_text`** — captured OCR `text`; use as-is.
|
|
34
|
+
- **`none`** — ask the attorney for the passages (last resort; see `note`).
|
|
35
|
+
3. Pull text only for the references you need — not all of them. Never draft a §102/§103 distinction that relies on a reference whose text you could not obtain. Do not fabricate reference contents.
|
|
36
|
+
|
|
37
|
+
## Phase 4 — Analyze the rejections
|
|
38
|
+
|
|
39
|
+
Read `references/oa-analysis.md`. For each rejection, classify it into a sub-type, propose a default strategy (amend / argue / both), and — for §102/§103 — map each claim element against the cited reference's disclosure text. **Present the per-rejection strategy to the attorney and stop for approval before drafting.**
|
|
40
|
+
|
|
41
|
+
## Phase 5 — Draft and save the amendments
|
|
42
|
+
|
|
43
|
+
Read `references/oa-drafting.md`. Draft amended claim text with the correct claim status. Confirm with the attorney, then save: amended claims via `save_project({ type: "claims" })` (and you **must** check `parseVerification.ok`), and the amendment bookkeeping into `oa_data.amendmentsStatus`.
|
|
44
|
+
|
|
45
|
+
## Phase 6 — Draft and save the remarks
|
|
46
|
+
|
|
47
|
+
Read `references/oa-drafting.md`. Write the Remarks: a claim-status summary followed by one argument section per rejection, using the analysis from Phase 4. Confirm with the attorney, then save the per-rejection argument text into `oa_data.oa_rejections[i]` and the final prose as project `sections`.
|
|
48
|
+
|
|
49
|
+
## Phase 7 — Assemble the response document
|
|
50
|
+
|
|
51
|
+
Once the amendments and arguments are drafted, saved, and approved, assemble the actual response document. The Fenix shell is the firm's formatted template, but it leaves the arguments and amended-claim text **blank** — you fill those in (the attorney does not need to download or upload anything):
|
|
52
|
+
|
|
53
|
+
1. `get_oa_shell_doc({ projectId })` → returns a direct `downloadUrl` (presigned, ~1 hour) to the shell.
|
|
54
|
+
2. **Download** `downloadUrl` into a folder you are authorized to write to — it is a direct, public file URL, so save it to disk; do **not** WebFetch it (WebFetch returns text and cannot handle a binary `.docx`). If your environment cannot download a URL to a file, call `get_oa_shell_doc({ projectId, delivery: "base64" })` and write the returned `base64` to a local `.docx` instead.
|
|
55
|
+
3. Use your **docx skill** to insert the drafted arguments and amended claims into the blanks. You already have this content from Phases 4–6 and from the saved project data (`oa_data.oa_rejections[].argument`, `oa_data.amendmentsStatus`, `claims`, `sections`).
|
|
56
|
+
4. Present the filled `.docx` to the attorney for review. Share the `dashboardUrl` so they can open the case in Fenix.
|
|
57
|
+
|
|
58
|
+
(If the attorney only wants the blank shell, `print_patent({ type: "oa_shell" })` still returns just the download link.)
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: fenix-project
|
|
3
3
|
description: >-
|
|
4
|
-
Project creation and management: form-based intake
|
|
4
|
+
Project creation and management: form-based intake (pass assignee initials directly; the backend resolves them) and confirmation flow.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Fenix Project
|
|
8
8
|
|
|
9
|
-
**Skill version:
|
|
9
|
+
**Skill version: 2** (authoritative version is in the top-level `VERSION` file; this line is for reference only).
|
|
10
10
|
|
|
11
11
|
## Triggers
|
|
12
12
|
|
|
@@ -27,7 +27,7 @@ Apply the custom overrides **only as long as the result still satisfies every st
|
|
|
27
27
|
Custom instructions may freely change tone, phrasing, default counts, section preferences, review emphasis, and similar. If a custom instruction would break a required format, follow the default format and tell the user which customization could not be applied and why.
|
|
28
28
|
|
|
29
29
|
## Contents
|
|
30
|
-
- `references/create-project.md` -- project creation intake workflow (
|
|
30
|
+
- `references/create-project.md` -- project creation intake workflow (field collection, confirmation, create; assignee resolved from initials by the backend)
|
|
31
31
|
|
|
32
32
|
## When to use this skill
|
|
33
33
|
|
|
@@ -38,4 +38,4 @@ Trigger whenever the user wants to create a new project in Fenix:
|
|
|
38
38
|
|
|
39
39
|
## How to use
|
|
40
40
|
|
|
41
|
-
Read `references/create-project.md` for the
|
|
41
|
+
Read `references/create-project.md` for the intake flow: collect the five fields (matter/app number, notification date, project type, due date, assignee initials) -> confirm with user -> call 'create_project'. Pass the assignee initials directly; the backend resolves them to the user (no get_user_by_initials step).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
2
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
# Create Project
|
|
2
2
|
|
|
3
|
-
**Version:
|
|
3
|
+
**Version: 2**
|
|
4
4
|
|
|
5
|
-
1. **
|
|
6
|
-
2. **
|
|
7
|
-
3. **
|
|
8
|
-
4. **Create** -- 'create_project' once confirmed
|
|
5
|
+
1. **Collect** -- matter/app number, notification date, project type ('list_project_types'), due date, assignee initials
|
|
6
|
+
2. **Confirm** -- show all values. Ask 'Ready to create -- any changes?' **END TURN**
|
|
7
|
+
3. **Create** -- 'create_project' once confirmed. Pass the assignee **initials** directly -- the backend resolves initials to the user automatically (no need to call 'get_user_by_initials'). If the initials are not recognised, create_project returns an error so you can ask for the correct initials.
|
|
9
8
|
|
|
10
|
-
If any field is missing: render a React form with all
|
|
9
|
+
If any field is missing: render a React form with all fields. On submit show confirmation block, then 'create_project'.
|