@ketecode/loom 0.1.0 → 0.2.0
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/README.md +111 -11
- package/agents/code-reviewer/evals/behavior.json +60 -0
- package/agents/inbox-triager/AGENT.md +98 -0
- package/agents/inbox-triager/evals/triggers.json +16 -0
- package/agents/spec-reviewer/AGENT.md +95 -0
- package/agents/spec-reviewer/evals/behavior.json +57 -0
- package/agents/spec-reviewer/evals/triggers.json +16 -0
- package/agents/task-implementer/AGENT.md +89 -0
- package/agents/task-implementer/evals/behavior.json +47 -0
- package/agents/task-implementer/evals/triggers.json +16 -0
- package/bin/kete-loom.js +46 -6
- package/commands/brainstorm.md +25 -0
- package/commands/debug.md +27 -0
- package/commands/dual-review.md +34 -0
- package/commands/feature-dev.md +8 -7
- package/commands/finish-branch.md +26 -0
- package/commands/fix-bug.md +38 -0
- package/commands/production-readiness.md +45 -0
- package/commands/usage-report.md +43 -0
- package/hooks/block-foreground-servers/HOOK.md +34 -0
- package/hooks/block-foreground-servers/cases.json +31 -0
- package/hooks/block-foreground-servers/hook.js +41 -0
- package/hooks/capture-lessons/HOOK.md +24 -0
- package/hooks/capture-lessons/hook.js +48 -0
- package/hooks/notify-on-stop/HOOK.md +25 -0
- package/hooks/notify-on-stop/hook.js +27 -0
- package/hooks/protect-lint-config/HOOK.md +29 -0
- package/hooks/protect-lint-config/cases.json +18 -0
- package/hooks/protect-lint-config/fixtures/.eslintrc.json +1 -0
- package/hooks/protect-lint-config/fixtures/.golangci.yml +1 -0
- package/hooks/protect-lint-config/fixtures/.prettierrc +1 -0
- package/hooks/protect-lint-config/fixtures/.rubocop.yml +1 -0
- package/hooks/protect-lint-config/fixtures/biome.json +1 -0
- package/hooks/protect-lint-config/fixtures/eslint.config.mjs +1 -0
- package/hooks/protect-lint-config/fixtures/ruff.toml +1 -0
- package/hooks/protect-lint-config/hook.js +25 -0
- package/hooks/read-before-edit/HOOK.md +26 -0
- package/hooks/read-before-edit/cases.json +15 -0
- package/hooks/read-before-edit/hook.js +50 -0
- package/hooks/run.js +22 -6
- package/hooks/verify-before-stop/HOOK.md +32 -0
- package/hooks/verify-before-stop/hook.js +70 -0
- package/mcp/clickhouse.json +11 -0
- package/mcp/exa.json +11 -0
- package/mcp/firecrawl.json +11 -0
- package/mcp/vercel.json +11 -0
- package/package.json +6 -4
- package/profiles.json +54 -5
- package/rules/use-skills.md +23 -0
- package/scripts/lib/behavior.js +52 -0
- package/scripts/lib/hooks-install.js +9 -7
- package/scripts/lib/lint.js +24 -2
- package/scripts/lib/mcp-install.js +5 -1
- package/scripts/lib/render.js +6 -0
- package/scripts/lib/skills.js +1 -0
- package/scripts/lib/targets.js +10 -0
- package/skills/agent-failure-debugging/SKILL.md +92 -0
- package/skills/agent-failure-debugging/evals/triggers.json +16 -0
- package/skills/agent-outbound-messaging/SKILL.md +92 -0
- package/skills/agent-outbound-messaging/evals/triggers.json +16 -0
- package/skills/agent-security/SKILL.md +117 -0
- package/skills/agent-security/evals/triggers.json +16 -0
- package/skills/agent-security/references/host-configs.md +37 -0
- package/skills/api-client-integration/SKILL.md +86 -0
- package/skills/api-client-integration/evals/triggers.json +16 -0
- package/skills/api-client-integration/references/resilience.md +57 -0
- package/skills/blender-automation/SKILL.md +100 -0
- package/skills/blender-automation/evals/triggers.json +16 -0
- package/skills/blender-automation/references/batch-and-render.md +77 -0
- package/skills/blender-automation/references/bpy-inspection.md +91 -0
- package/skills/blender-automation/references/rig-and-retarget-checks.md +23 -0
- package/skills/brand-strategy/SKILL.md +83 -0
- package/skills/brand-strategy/evals/triggers.json +16 -0
- package/skills/change-impact-analysis/SKILL.md +89 -0
- package/skills/change-impact-analysis/evals/triggers.json +16 -0
- package/skills/change-impact-analysis/references/graph-commands.md +28 -0
- package/skills/contract-drafting/SKILL.md +96 -0
- package/skills/contract-drafting/evals/triggers.json +16 -0
- package/skills/contract-drafting/references/term-sheets.md +68 -0
- package/skills/contract-first-development/SKILL.md +86 -0
- package/skills/contract-first-development/evals/triggers.json +16 -0
- package/skills/contract-first-development/references/tooling.md +46 -0
- package/skills/decision-council/SKILL.md +98 -0
- package/skills/decision-council/evals/triggers.json +16 -0
- package/skills/design-brainstorming/SKILL.md +132 -0
- package/skills/design-brainstorming/evals/behavior.json +55 -0
- package/skills/design-brainstorming/evals/triggers.json +16 -0
- package/skills/design-brainstorming/references/visual-mockups.md +34 -0
- package/skills/desktop-app-testing/SKILL.md +104 -0
- package/skills/desktop-app-testing/evals/triggers.json +16 -0
- package/skills/desktop-app-testing/references/drivers.md +81 -0
- package/skills/document-processing/SKILL.md +100 -0
- package/skills/document-processing/evals/triggers.json +17 -0
- package/skills/document-processing/references/extraction-and-ocr.md +71 -0
- package/skills/document-processing/references/forms-and-conversion.md +69 -0
- package/skills/document-processing/references/redaction.md +61 -0
- package/skills/energy-procurement/SKILL.md +106 -0
- package/skills/energy-procurement/evals/triggers.json +16 -0
- package/skills/finishing-a-branch/SKILL.md +127 -0
- package/skills/finishing-a-branch/evals/behavior.json +49 -0
- package/skills/finishing-a-branch/evals/triggers.json +16 -0
- package/skills/freight-carrier-management/SKILL.md +107 -0
- package/skills/freight-carrier-management/evals/triggers.json +16 -0
- package/skills/git-worktrees/SKILL.md +130 -0
- package/skills/git-worktrees/evals/behavior.json +56 -0
- package/skills/git-worktrees/evals/triggers.json +16 -0
- package/skills/google-workspace-integration/SKILL.md +65 -0
- package/skills/google-workspace-integration/evals/triggers.json +17 -0
- package/skills/google-workspace-integration/references/api.md +121 -0
- package/skills/harmonyos-arkts/SKILL.md +117 -0
- package/skills/harmonyos-arkts/evals/triggers.json +16 -0
- package/skills/harmonyos-arkts/references/build-errors.md +42 -0
- package/skills/implementation-plans/SKILL.md +117 -0
- package/skills/implementation-plans/evals/behavior.json +54 -0
- package/skills/implementation-plans/evals/triggers.json +16 -0
- package/skills/ios-platform-features/SKILL.md +99 -0
- package/skills/ios-platform-features/evals/triggers.json +16 -0
- package/skills/ios-platform-features/references/foundation-models.md +90 -0
- package/skills/jvm-sql-mappers/SKILL.md +98 -0
- package/skills/jvm-sql-mappers/evals/triggers.json +16 -0
- package/skills/jvm-sql-mappers/references/examples.md +129 -0
- package/skills/mobile-accessibility/SKILL.md +94 -0
- package/skills/mobile-accessibility/evals/triggers.json +16 -0
- package/skills/network-design/SKILL.md +98 -0
- package/skills/network-design/evals/triggers.json +16 -0
- package/skills/observability/SKILL.md +125 -0
- package/skills/observability/evals/triggers.json +17 -0
- package/skills/observability/references/otel-setup.md +87 -0
- package/skills/observability/references/slo-alerts.md +70 -0
- package/skills/open-source-release/SKILL.md +107 -0
- package/skills/open-source-release/evals/triggers.json +15 -0
- package/skills/open-source-release/references/history-scrub.md +65 -0
- package/skills/patent-research/SKILL.md +94 -0
- package/skills/patent-research/evals/triggers.json +16 -0
- package/skills/patent-research/references/databases-and-queries.md +52 -0
- package/skills/prospect-research/SKILL.md +87 -0
- package/skills/prospect-research/evals/triggers.json +16 -0
- package/skills/python-app-distribution/SKILL.md +107 -0
- package/skills/python-app-distribution/evals/triggers.json +16 -0
- package/skills/python-app-distribution/references/pypi-trusted-publishing.md +55 -0
- package/skills/python-app-distribution/references/windows-macos-signing.md +70 -0
- package/skills/quality-nonconformance/SKILL.md +107 -0
- package/skills/quality-nonconformance/evals/triggers.json +16 -0
- package/skills/quality-nonconformance/references/8d-and-capa.md +46 -0
- package/skills/react-testing/SKILL.md +121 -0
- package/skills/react-testing/evals/triggers.json +18 -0
- package/skills/react-testing/references/msw.md +64 -0
- package/skills/react-testing/references/queries.md +41 -0
- package/skills/react-testing/references/setup.md +74 -0
- package/skills/recommender-systems/SKILL.md +119 -0
- package/skills/recommender-systems/evals/triggers.json +16 -0
- package/skills/recommender-systems/references/evaluation.md +39 -0
- package/skills/refactoring-safely/evals/behavior.json +57 -0
- package/skills/reproducible-dev-environments/SKILL.md +132 -0
- package/skills/reproducible-dev-environments/evals/triggers.json +16 -0
- package/skills/responding-to-code-review/SKILL.md +124 -0
- package/skills/responding-to-code-review/evals/behavior.json +54 -0
- package/skills/responding-to-code-review/evals/triggers.json +16 -0
- package/skills/security-review/evals/behavior.json +56 -0
- package/skills/session-handoff/evals/behavior.json +55 -0
- package/skills/skill-authoring/SKILL.md +13 -2
- package/skills/skill-authoring/evals/triggers.json +2 -1
- package/skills/skill-authoring/references/pressure-testing.md +87 -0
- package/skills/slide-decks/SKILL.md +107 -0
- package/skills/slide-decks/evals/triggers.json +18 -0
- package/skills/slide-decks/references/html-decks.md +86 -0
- package/skills/slide-decks/references/layouts.md +45 -0
- package/skills/slide-decks/references/pptx.md +87 -0
- package/skills/subagent-driven-development/SKILL.md +109 -0
- package/skills/subagent-driven-development/evals/behavior.json +53 -0
- package/skills/subagent-driven-development/evals/triggers.json +15 -0
- package/skills/subagent-driven-development/references/implementer-brief.md +60 -0
- package/skills/subagent-driven-development/references/reviewer-briefs.md +52 -0
- package/skills/systematic-debugging/SKILL.md +92 -0
- package/skills/systematic-debugging/evals/behavior.json +59 -0
- package/skills/systematic-debugging/evals/triggers.json +16 -0
- package/skills/systematic-debugging/references/condition-waiting.md +52 -0
- package/skills/systematic-debugging/references/root-cause-tracing.md +49 -0
- package/skills/systematic-debugging/references/test-pollution.md +46 -0
- package/skills/tdd-workflow/SKILL.md +3 -1
- package/skills/tdd-workflow/evals/behavior.json +55 -0
- package/skills/tdd-workflow/evals/triggers.json +2 -1
- package/skills/tdd-workflow/references/testing-anti-patterns.md +87 -0
- package/skills/transactional-email/SKILL.md +68 -0
- package/skills/transactional-email/evals/triggers.json +17 -0
- package/skills/transactional-email/references/providers.md +63 -0
- package/skills/ui-demo-recording/SKILL.md +93 -0
- package/skills/ui-demo-recording/evals/triggers.json +16 -0
- package/skills/ui-demo-recording/references/cursor-and-captions.md +48 -0
- package/skills/ui-demo-recording/references/playwright-recording.md +63 -0
- package/skills/ui-demo-recording/references/post-processing.md +57 -0
- package/skills/ui-design-polish/SKILL.md +113 -0
- package/skills/ui-design-polish/evals/triggers.json +18 -0
- package/skills/ui-design-polish/references/detail-checklist.md +45 -0
- package/skills/ui-design-polish/references/tokens.md +68 -0
- package/skills/ui-flow-audit/SKILL.md +112 -0
- package/skills/ui-flow-audit/evals/triggers.json +17 -0
- package/skills/ui-motion/SKILL.md +103 -0
- package/skills/ui-motion/evals/triggers.json +18 -0
- package/skills/ui-motion/references/patterns.md +138 -0
- package/skills/ui-motion/references/tokens.md +52 -0
- package/skills/unicode-text-processing/SKILL.md +103 -0
- package/skills/unicode-text-processing/evals/triggers.json +17 -0
- package/skills/unicode-text-processing/references/apis.md +89 -0
- package/skills/unicode-text-processing/references/script-notes.md +50 -0
- package/skills/verification-loop/evals/behavior.json +52 -0
- package/skills/video-editing/SKILL.md +111 -0
- package/skills/video-editing/evals/triggers.json +16 -0
- package/skills/video-editing/references/edl-and-logging.md +44 -0
- package/skills/video-editing/references/ffmpeg-edit-recipes.md +92 -0
- package/skills/video-editing/references/resolve-scripting.md +53 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: patent-research
|
|
3
|
+
description: Patent and trademark search groundwork across USPTO Patent Public Search and Trademark Search, EPO Espacenet, Google Patents and WIPO PATENTSCOPE and Global Brand Database, covering breaking an invention into searchable features, keyword and CPC classification queries, prior-art and freedom-to-operate lead lists, reading independent claims element by element, checking legal status, family and expiry, and knockout trademark screens by Nice class, with every result labelled as leads for a registered patent attorney or trademark lawyer to assess. Use when checking whether an idea looks new before filing, looking for patents that might block a product launch, mapping competitors' patent filings, summarising what a patent actually claims, or screening a brand name before adopting it.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs network access to the public patent and trademark databases. Not legal advice; novelty, patentability, infringement, validity and registrability opinions need a qualified patent attorney or trademark lawyer.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: compliance
|
|
9
|
+
kete-loom/risk: network
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Patent and trademark research
|
|
14
|
+
|
|
15
|
+
Find the documents a professional should look at, explain what they claim in plain language, and hand over a search record they can rely on. You produce leads and summaries; you never give an opinion that something is patentable, infringing, invalid, or free to use.
|
|
16
|
+
|
|
17
|
+
## Attorney-review gate
|
|
18
|
+
|
|
19
|
+
Every output carries: `Search leads only, not a legal opinion. Have a registered patent attorney or agent (or a trademark lawyer for marks) review before any filing, launch or licensing decision.`
|
|
20
|
+
|
|
21
|
+
**Stop and tell the user they need a qualified professional now** when:
|
|
22
|
+
|
|
23
|
+
- They plan to file, launch, invest, or respond to a demand letter based on the result.
|
|
24
|
+
- A lead looks close to their product or invention (a claim where most elements seem present). Do not write an infringement or validity analysis; list the lead and say why it needs review.
|
|
25
|
+
- They received a cease-and-desist, an infringement claim, or an office action.
|
|
26
|
+
- They ask whether they can safely use a mark or a technology.
|
|
27
|
+
|
|
28
|
+
Also warn the user, before they describe an unfiled invention: public disclosure can destroy patent rights in many countries (Europe has no general grace period; the US has a limited one-year inventor grace period). Keep details in a confidential setting and do not paste unpublished invention details into services the user has not approved.
|
|
29
|
+
|
|
30
|
+
## 0. Define the question
|
|
31
|
+
|
|
32
|
+
Ask, then restate:
|
|
33
|
+
|
|
34
|
+
1. Search type: novelty or prior art (before filing), freedom to operate (FTO, before launch), landscape (who files what), single-patent summary, or trademark knockout.
|
|
35
|
+
2. The invention or product as features: what it is, the problem it solves, how it works, each technical feature separately.
|
|
36
|
+
3. Jurisdictions that matter (where they will file, make or sell). FTO is per country: only patents in force there matter.
|
|
37
|
+
4. Dates: the user's earliest filing or disclosure date for novelty; launch date for FTO.
|
|
38
|
+
|
|
39
|
+
## 1. Build the search
|
|
40
|
+
|
|
41
|
+
1. Split the invention into 3 to 6 key concepts. For each, list synonyms, broader and narrower terms, and how a patent drafter would say it ("fastening member" for "screw").
|
|
42
|
+
2. Find the CPC classes: search keywords, open the most relevant hits, note the CPC codes they share, then read the class definitions on the CPC scheme (cooperativepatentclassification.org) to confirm. Search by class and keyword together.
|
|
43
|
+
3. Run the search in at least two databases. What each one is good for, and query syntax, are in `references/databases-and-queries.md`.
|
|
44
|
+
4. Follow citations both ways from the best hits (what they cite, and what cites them), and check the family to find versions in other languages and jurisdictions.
|
|
45
|
+
5. Record every query, database, date and number of hits. A search nobody can repeat is worth little.
|
|
46
|
+
|
|
47
|
+
Remember the blind spot: applications usually publish about 18 months after their earliest priority date, so the most recent filings cannot be found yet.
|
|
48
|
+
|
|
49
|
+
For novelty, prior art also includes non-patent literature: papers, standards, product manuals, websites. Search those too (for example Google Scholar) and note the publication date.
|
|
50
|
+
|
|
51
|
+
## 2. Screen and read
|
|
52
|
+
|
|
53
|
+
1. Screen titles, abstracts and drawings first; keep anything plausibly relevant.
|
|
54
|
+
2. For each kept document, read the **claims**, not the abstract. The claims define the rights; the description only explains them.
|
|
55
|
+
3. Find the independent claims (those that do not refer to another claim). Break each into elements (preamble, then each "comprising" feature).
|
|
56
|
+
4. Make a claim chart: one row per element, with where the same feature appears in the user's product or invention (for FTO) or in the prior art (for novelty). Mark each as `present`, `absent`, or `unclear`. This is a reading aid for the attorney, not a conclusion.
|
|
57
|
+
5. Note claim language that matters: "comprising" (open) versus "consisting of" (closed), means-plus-function language, numeric ranges.
|
|
58
|
+
|
|
59
|
+
## 3. Check status and dates
|
|
60
|
+
|
|
61
|
+
For each lead that matters for FTO:
|
|
62
|
+
|
|
63
|
+
- Granted or only an application? Applications are not enforceable until granted, and pending claims can change.
|
|
64
|
+
- Legal status: in force, lapsed for non-payment, expired, withdrawn, revoked. Use the official register (EP Register, USPTO Patent Center, national registers) and Espacenet's INPADOC legal status; Google Patents' status is a hint, not a record.
|
|
65
|
+
- Expiry: usually 20 years from the patent's filing date (in the US, from the earliest US non-provisional or PCT application whose benefit it claims; provisionals and foreign Paris Convention priority do not start the clock), adjusted for term adjustments, extensions, terminal disclaimers and lapses. Give the estimate with the reasoning, and say a professional must confirm it.
|
|
66
|
+
- Where it is in force: list the family members and their countries.
|
|
67
|
+
|
|
68
|
+
## 4. Trademark knockout screen
|
|
69
|
+
|
|
70
|
+
1. Identify the goods and services and their Nice classes.
|
|
71
|
+
2. Search identical and similar marks (spelling variants, sound-alikes, translations, design elements) in the target registers: USPTO Trademark Search (tmsearch.uspto.gov), EUIPO and national offices through TMview, and the WIPO Global Brand Database, plus common-law use (web, app stores, company registries, domain names).
|
|
72
|
+
3. List live marks in the same or related classes as conflicts to review; note dead marks separately.
|
|
73
|
+
4. A clean knockout screen does not mean the mark is available; a full clearance search and lawyer opinion are needed before launch.
|
|
74
|
+
|
|
75
|
+
## Rules
|
|
76
|
+
|
|
77
|
+
- Never say something is "new", "patentable", "not infringing", "invalid" or "free to use". Say what you found and what needs review.
|
|
78
|
+
- Never rely on the abstract or title for what a patent covers; read the claims.
|
|
79
|
+
- Never state a legal status or expiry date without the source and the date checked.
|
|
80
|
+
- Do not paste confidential invention details into a public search tool the user has not approved; search with generic concept terms.
|
|
81
|
+
- Quote claims exactly when you cite them, with the publication number and claim number.
|
|
82
|
+
|
|
83
|
+
## Report
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
Search: <type> | question: <one line> | jurisdictions: <list> | date run: <date>
|
|
87
|
+
Search log: database | query | hits | reviewed
|
|
88
|
+
Leads (most relevant first):
|
|
89
|
+
<pub number> | title | assignee | priority date | status (source, date) | est. expiry | CPC | why relevant
|
|
90
|
+
Claim chart for independent claim <n>: element | present / absent / unclear | where
|
|
91
|
+
Trademark screen: mark | register | class | status | similarity note
|
|
92
|
+
Gaps: unpublished applications, databases not searched, non-patent literature not covered
|
|
93
|
+
Search leads only, not a legal opinion. Needs review by a registered patent attorney or trademark lawyer.
|
|
94
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Before we file, search Espacenet and Google Patents for prior art on our self-cleaning water bottle cap",
|
|
4
|
+
"We launch a smart thermostat in the US and Germany next year, find patents in force that could block it",
|
|
5
|
+
"Summarise what claim 1 of US patent 10,123,456 actually covers and when it expires",
|
|
6
|
+
"Map which competitors are filing patents in CPC class H01M 10 for battery cooling",
|
|
7
|
+
"Screen the brand name Lumora for conflicting trademarks in class 9 and 42 before we adopt it"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Draft an NDA to share our invention with a manufacturer",
|
|
11
|
+
"Add an open source licence and NOTICE file to our repository",
|
|
12
|
+
"Check our npm dependencies for licences that conflict with commercial use",
|
|
13
|
+
"Write the brand voice guidelines for our new product line",
|
|
14
|
+
"Classify our products with HS codes for export to Canada"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Databases and query patterns
|
|
2
|
+
|
|
3
|
+
Read this when building a search (section 1). Syntax changes; if a query fails, check the database's own help page and note the syntax you used in the search log.
|
|
4
|
+
|
|
5
|
+
## Patent databases
|
|
6
|
+
|
|
7
|
+
| Database | URL | Best for |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| USPTO Patent Public Search | ppubs.uspto.gov | full text of US grants and published applications; Basic and Advanced search with field codes |
|
|
10
|
+
| USPTO Patent Center | patentcenter.uspto.gov | US file wrappers, status, fees paid |
|
|
11
|
+
| Global Dossier | via the USPTO site | file histories across the main patent offices for one family |
|
|
12
|
+
| EPO Espacenet | worldwide.espacenet.com | worldwide coverage, families (simple and INPADOC), CPC browsing, INPADOC legal status |
|
|
13
|
+
| European Patent Register | register.epo.org | authoritative status of European applications and patents |
|
|
14
|
+
| Google Patents | patents.google.com | fast full-text search with machine translation, CPC filters, citations, "similar documents"; status is not authoritative |
|
|
15
|
+
| WIPO PATENTSCOPE | patentscope.wipo.int | PCT international applications, national collections, cross-lingual search |
|
|
16
|
+
| CPC scheme | cooperativepatentclassification.org | class definitions and titles (CPC is run jointly by the EPO and USPTO) |
|
|
17
|
+
|
|
18
|
+
## Trademark databases
|
|
19
|
+
|
|
20
|
+
| Database | URL | Notes |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| USPTO Trademark Search | tmsearch.uspto.gov | replaced TESS in November 2023; different syntax from TESS |
|
|
23
|
+
| TMview | via tmdn.org | EUIPO and many national and international registers in one search |
|
|
24
|
+
| WIPO Global Brand Database | branddb.wipo.int | international registrations (Madrid) and many national collections |
|
|
25
|
+
| Nice Classification | WIPO site | goods and services classes; check the edition in force |
|
|
26
|
+
|
|
27
|
+
## Query patterns
|
|
28
|
+
|
|
29
|
+
Build each query as concept blocks joined with AND, synonyms inside a block joined with OR, and a class block when you have one.
|
|
30
|
+
|
|
31
|
+
Espacenet Smart search (field identifiers such as `ti` title, `ab` abstract, `ta` title or abstract, `cl` claims, `cpc` classification, `pa` applicant, `pd` publication date; `txt` covers different fields in different interfaces, and a `/low` qualifier widens a CPC symbol to its child groups; check the current help page):
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
ta=(drone OR "unmanned aerial") AND ta=(parcel OR package) AND cpc=B64U
|
|
35
|
+
pa="acme" AND pd>=2018
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Google Patents (search box terms plus filters; `cpc:B64U` includes child codes, `CPC=B64U/low` is the field form; `TI=`, `AB=`, `CL=`, `TAC=` restrict to title, abstract, claims or all three; the advanced form shows the date and country syntax it generates):
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
(drone OR "unmanned aerial vehicle") (parcel OR package) (winch OR tether)
|
|
42
|
+
cpc:B64U before:priority:20200101 country:US,EP
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
USPTO Patent Public Search: use the Advanced search with field codes (for example `.ti.` title, `.ab.` abstract, `.clm.` claims, `.cpc.` classification) and proximity operators such as `ADJ`, `NEAR` and `SAME`; the system's help lists the full set.
|
|
46
|
+
|
|
47
|
+
## Tips
|
|
48
|
+
|
|
49
|
+
- Start broad, then add a block at a time; record hit counts at each step.
|
|
50
|
+
- Search claims text separately for FTO; a feature that appears only in the description is not claimed.
|
|
51
|
+
- Use applicant searches for competitors, then harmonise name variants (subsidiaries, old names).
|
|
52
|
+
- Check translations of non-English hits before dismissing them.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prospect-research
|
|
3
|
+
description: B2B prospect list building and enrichment from public sources such as company websites, filings, job posts, press and public directories, with a written ideal-customer-fit scorecard, a 0-100 fit score and a cited reason per account, buying-committee roles to contact, and warm-introduction paths found in the user's own contacts and investors, while keeping to platform terms and privacy law with no scraping behind logins. Use when a founder or sales team needs a target account list researched, scored and enriched before any outreach is written, or wants to know who in their network can introduce them to a target company.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Web access helps for public research; the user supplies their own contact exports. Not legal advice on data protection.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: business
|
|
9
|
+
kete-loom/risk: network
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Prospect research
|
|
14
|
+
|
|
15
|
+
Produce a short, ranked list of accounts that fit, the people to approach at each, and the warmest way in, with a source for every fact. Writing the outreach itself is the job of `cold-outreach-sequences`; sizing the whole market is `market-research`.
|
|
16
|
+
|
|
17
|
+
## Ground rules
|
|
18
|
+
|
|
19
|
+
1. **Public and permitted sources only.** Company websites, annual reports and company registries, regulator registers, press releases and news, job postings, conference speaker lists, public GitHub orgs, app store listings, and data providers the user already licenses. Never log in to a site to collect data, never bypass a paywall, rate limit or robots.txt, and never automate collection from a platform whose terms forbid it (LinkedIn's User Agreement forbids scraping and automated access; the user may look profiles up by hand).
|
|
20
|
+
2. **Cite or drop.** Every fact on the list carries a source URL or document and an access date. A guess is marked as a guess or left out.
|
|
21
|
+
3. **Business data, minimum personal data.** Collect name, role, company and a business contact route only. No home addresses, personal phone numbers, family details, photos or anything about health, religion, politics or other special categories.
|
|
22
|
+
4. **No guessed emails sent blind.** Pattern-guessed addresses are marked "unverified" and are not a substitute for a lawful basis to contact someone.
|
|
23
|
+
5. **The user's network data stays theirs.** Contact exports the user shares are used for matching only, are not added to the prospect file wholesale, and are not sent to any third-party service without the user's say-so.
|
|
24
|
+
|
|
25
|
+
## Step 1: Write the ideal-customer-fit scorecard
|
|
26
|
+
|
|
27
|
+
Ask the user for their best five to ten current customers (or design partners) and what made each a good fit. From that, agree on four to six criteria with weights that sum to 100, for example:
|
|
28
|
+
|
|
29
|
+
| Criterion | Weight | Evidence that counts |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| Industry / segment | 25 | registry SIC/NAICS code, website |
|
|
32
|
+
| Size (staff or revenue band) | 20 | filings, registry, headcount on careers page |
|
|
33
|
+
| Trigger event in last 6 months | 25 | funding, new market, hiring for a role, regulation change |
|
|
34
|
+
| Tech or process fit | 20 | job posts naming tools, public integrations, docs |
|
|
35
|
+
| Geography / language | 10 | registered office, markets served |
|
|
36
|
+
|
|
37
|
+
Add **disqualifiers** (too small, existing competitor customer under contract, sanctioned country, already a customer). Stop and ask the user to confirm the scorecard before researching any account.
|
|
38
|
+
|
|
39
|
+
## Step 2: Build the account list
|
|
40
|
+
|
|
41
|
+
1. Start from sources that list many companies at once: industry association member lists, registries filtered by code and region, event exhibitor lists, investor portfolio pages, marketplace or integration directories.
|
|
42
|
+
2. Deduplicate by legal entity and domain; note parent companies and subsidiaries.
|
|
43
|
+
3. Aim for 1.5 to 2 times the number of accounts the user wants, because scoring will cut some.
|
|
44
|
+
|
|
45
|
+
## Step 3: Enrich and score each account
|
|
46
|
+
|
|
47
|
+
For each account record: legal name, domain, country, size band, segment, the trigger (with date and source), tech or process signals, and any disqualifier. Score each criterion 0, half or full weight from the evidence, sum to a 0-100 fit score, and write one line saying why. Mark accounts with fewer than three sourced criteria as "thin evidence" instead of scoring them high.
|
|
48
|
+
|
|
49
|
+
Tiers: **A** 75+, **B** 50-74, **C** below 50 (park, don't contact).
|
|
50
|
+
|
|
51
|
+
## Step 4: Map the buying committee
|
|
52
|
+
|
|
53
|
+
For A and B accounts, list the roles that matter (economic buyer, champion or user, technical evaluator, possible blocker) and the named person only where a public source shows them in that role now. Note the source and date; people move, so anything older than 12 months is "check before contact".
|
|
54
|
+
|
|
55
|
+
## Step 5: Find warm-intro paths
|
|
56
|
+
|
|
57
|
+
Ask the user for what they are willing to share: a contacts export, a list of investors, advisers, past employers, customers who would refer, alumni groups. Match on company domain and past employers. For each A account, rank the paths:
|
|
58
|
+
|
|
59
|
+
1. A current customer or investor who knows someone at the account.
|
|
60
|
+
2. A former colleague who now works there or recently did.
|
|
61
|
+
3. A shared investor, adviser or community.
|
|
62
|
+
4. A public route: speaking at the same event, a mutual open-source project.
|
|
63
|
+
|
|
64
|
+
For each path, write who to ask, what to ask them for, and a two-line forwardable blurb. Never contact anyone on the user's behalf.
|
|
65
|
+
|
|
66
|
+
## Privacy and compliance checks
|
|
67
|
+
|
|
68
|
+
- **EU and UK prospects:** personal data about named people is covered by the GDPR and UK GDPR even in a B2B context. The user needs a lawful basis (usually legitimate interests, with a documented balancing test), and Article 14 requires telling a person whose data you collected from elsewhere, at the latest within one month or at the first communication. Keep a record of the source of each person's data.
|
|
69
|
+
- **Electronic marketing rules differ by country** (for example PECR in the UK, national rules in Germany that are stricter about unsolicited email). Flag the country; leave the decision on whether to email to the user and `cold-outreach-sequences`.
|
|
70
|
+
- **Opt-outs and existing suppression lists** from the user's CRM must be checked before anyone is added.
|
|
71
|
+
- This skill is not legal advice; for a large programme or a regulated sector, recommend the user's data protection lead or counsel reviews the basis and notices.
|
|
72
|
+
|
|
73
|
+
## Stop and ask the user
|
|
74
|
+
|
|
75
|
+
- Before research starts, to confirm the scorecard, target count and regions.
|
|
76
|
+
- If a requested source needs a login, a paid seat the user has not mentioned, or automated collection from a platform that forbids it.
|
|
77
|
+
- If the user asks for personal data beyond business contact details, or for people in a country whose rules you have not checked.
|
|
78
|
+
|
|
79
|
+
## Output
|
|
80
|
+
|
|
81
|
+
Return a table (or a CSV the user can import) and a summary:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
Account | Domain | Country | Size | Fit | Tier | Why (one line) | Trigger (date, source) | Roles / named people (source, date) | Warm path | Evidence gaps
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Then: the scorecard used, how many accounts were found, scored and parked, the sources used with access dates, accounts marked "thin evidence", and the privacy points the user must act on before outreach.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Build me a list of 50 mid-size logistics companies in Kenya that fit our ICP, scored and with sources",
|
|
4
|
+
"Define our ideal customer profile from these ten customers and score this list of target accounts against it",
|
|
5
|
+
"Who in my LinkedIn connections export or our investor list could introduce me to people at these 20 target companies?",
|
|
6
|
+
"Enrich this account list with company size, recent funding and hiring signals before our sales team starts outreach",
|
|
7
|
+
"Find the economic buyer and technical evaluator at each of these fintechs using public sources only"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Write a four-step cold email sequence to the heads of operations on our prospect list",
|
|
11
|
+
"Size the market for fleet management software in East Africa with TAM, SAM and SOM",
|
|
12
|
+
"Our outbound emails are going to spam since we started a new sending domain, fix our DMARC",
|
|
13
|
+
"Plan our launch campaign channels, calendar and budget for next quarter",
|
|
14
|
+
"Triage my inbox this morning and draft replies to the urgent ones"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: python-app-distribution
|
|
3
|
+
description: Ships a Python application to people who do not have Python, by freezing it with PyInstaller or compiling it with Nuitka per target OS, wrapping Windows builds in an Inno Setup or MSIX installer with Authenticode signing, signing macOS app bundles with a Developer ID under the hardened runtime and notarizing them with notarytool, and publishing wheels and an sdist to PyPI through GitHub trusted publishing. Use when turning a Python script, CLI or Qt/Tk GUI into a downloadable .exe, .app or .dmg, an installer, or a pip-installable release, or when a frozen build misses data files, gets flagged by SmartScreen or Gatekeeper, or a PyPI upload needs to drop API tokens.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Builds must run on each target OS (no cross-compiling); macOS signing needs Xcode command line tools and an Apple Developer account, Windows signing needs a code-signing certificate or signing service.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: devops
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "python"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Python app distribution
|
|
15
|
+
|
|
16
|
+
Ship a build the user can double-click or `pip install` without warnings, missing files or a second Python install, built the same way every time in CI.
|
|
17
|
+
|
|
18
|
+
Project layout, `pyproject.toml` tooling and code style belong to `python-patterns`. Version numbers and changelogs belong to `release-management`. This skill covers turning a working app into artifacts and getting them signed and published.
|
|
19
|
+
|
|
20
|
+
## 0. Decide the channel
|
|
21
|
+
|
|
22
|
+
Ask, or infer from the project:
|
|
23
|
+
|
|
24
|
+
| Users | Ship |
|
|
25
|
+
|---|---|
|
|
26
|
+
| Developers who have Python | Wheel + sdist on PyPI (`pip install`, `pipx install`, `uv tool install`) |
|
|
27
|
+
| End users on Windows | Frozen app inside an installer (Inno Setup `.exe`, or MSIX) |
|
|
28
|
+
| End users on macOS | Signed, notarized `.app`, usually inside a `.dmg` |
|
|
29
|
+
| End users on Linux | Frozen folder in a tarball, or AppImage/Flatpak (check the project's preference) |
|
|
30
|
+
|
|
31
|
+
If both developers and end users are targets, do both. If signing credentials do not exist yet, **stop and ask**: who owns the Apple Developer account and the Windows certificate, and where CI may read them.
|
|
32
|
+
|
|
33
|
+
## 1. Make the app freezable
|
|
34
|
+
|
|
35
|
+
1. One entry point (`src/app/__main__.py` or a `[project.scripts]` function).
|
|
36
|
+
2. Read bundled data through `importlib.resources`, or through a helper that checks `getattr(sys, "frozen", False)` and `sys._MEIPASS` for PyInstaller. Never rely on the current working directory.
|
|
37
|
+
3. Write user data to the platform's user directory (`platformdirs`), never next to the executable; `Program Files` and signed `.app` bundles are read-only.
|
|
38
|
+
4. Pin dependencies with a lockfile so builds are repeatable.
|
|
39
|
+
|
|
40
|
+
## 2. Freeze
|
|
41
|
+
|
|
42
|
+
### PyInstaller
|
|
43
|
+
|
|
44
|
+
1. `pyinstaller --name MyApp --windowed --onedir src/app/__main__.py` once, then commit the generated `MyApp.spec` and build from it: `pyinstaller MyApp.spec --clean --noconfirm`.
|
|
45
|
+
2. Declare data files and hidden imports in the spec (`datas`, `hiddenimports`), not by copying files after the build.
|
|
46
|
+
3. Prefer `--onedir` for GUI apps inside an installer or `.app`: faster start, fewer antivirus false positives. Use `--onefile` only for a single-file CLI download.
|
|
47
|
+
4. Build on each OS and architecture you ship (Windows x64, macOS arm64 and x86_64 or universal2, Linux on the oldest glibc you support). PyInstaller does not cross-compile.
|
|
48
|
+
|
|
49
|
+
### Nuitka
|
|
50
|
+
|
|
51
|
+
`python -m nuitka --mode=standalone --include-data-dir=src/app/assets=assets src/app/__main__.py` (or `--mode=onefile`, `--mode=app` on macOS). Test standalone first; data-file problems are easier to see there. Expect longer builds and a C compiler requirement; Nuitka's benefit is speed and harder-to-unpack code, not secrecy.
|
|
52
|
+
|
|
53
|
+
### Smoke test the frozen build
|
|
54
|
+
|
|
55
|
+
Run the built executable on a clean machine or VM without Python, exercise the main path, and check its log for `ModuleNotFoundError` or missing files.
|
|
56
|
+
|
|
57
|
+
## 3. Windows: installer and signing
|
|
58
|
+
|
|
59
|
+
1. Installer: Inno Setup script (`installer.iss`) compiled with `iscc installer.iss`, or MSIX packaged with `makeappx pack` (MSIX gives clean uninstall and Store distribution; it needs a manifest and signing with a matching publisher). Details in `references/windows-macos-signing.md`.
|
|
60
|
+
2. Sign the app executable first, then the installer: `signtool sign /fd SHA256 /tr <timestamp URL> /td SHA256 ...`. Always timestamp so signatures outlive the certificate.
|
|
61
|
+
3. Code-signing keys now live in hardware or a cloud signing service (for example Azure Artifact Signing, formerly Trusted Signing, or a CA's cloud HSM); plan CI around that, not around a `.pfx` in a secret.
|
|
62
|
+
4. A new certificate still builds SmartScreen reputation gradually; tell the user to expect warnings on the first downloads.
|
|
63
|
+
|
|
64
|
+
## 4. macOS: sign, notarize, staple
|
|
65
|
+
|
|
66
|
+
1. Sign every binary inside the bundle, inside out, with the hardened runtime and a secure timestamp: `codesign --force --options runtime --timestamp --entitlements entitlements.plist --sign "Developer ID Application: <Team> (<TEAMID>)" MyApp.app` (nested `.dylib`/`.so` files first, or use the PyInstaller `--codesign-identity` option and re-check).
|
|
67
|
+
2. Verify: `codesign --verify --deep --strict --verbose=2 MyApp.app`.
|
|
68
|
+
3. Package (`.dmg` via `hdiutil create`, or a `.zip`), sign the `.dmg`, then notarize: `xcrun notarytool submit MyApp.dmg --keychain-profile <profile> --wait`.
|
|
69
|
+
4. On failure read the log: `xcrun notarytool log <submission-id> --keychain-profile <profile>`.
|
|
70
|
+
5. Staple: `xcrun stapler staple MyApp.dmg`, then check with `spctl --assess --type open --context context:primary-signature -v MyApp.dmg`.
|
|
71
|
+
|
|
72
|
+
Entitlements, CI keychain setup and common notarization errors are in `references/windows-macos-signing.md`.
|
|
73
|
+
|
|
74
|
+
## 5. PyPI: wheels, sdist, trusted publishing
|
|
75
|
+
|
|
76
|
+
1. Build backend declared in `pyproject.toml` (`hatchling`, `setuptools`, `flit-core`, `uv_build`, or `maturin`/`scikit-build-core` for compiled extensions).
|
|
77
|
+
2. Build: `python -m build` (or `uv build`), then `twine check dist/*`. Install the wheel into a fresh virtual environment and run the CLI once.
|
|
78
|
+
3. Compiled extensions: build platform wheels with `cibuildwheel` in CI; pure Python ships one `py3-none-any` wheel.
|
|
79
|
+
4. Publish from CI with trusted publishing, no API token: register the publisher on PyPI (project settings, or a pending publisher for a new project) naming the repository, workflow file and environment; the workflow then needs `permissions: id-token: write` and `pypa/gh-action-pypi-publish@release/v1`. Template in `references/pypi-trusted-publishing.md`.
|
|
80
|
+
5. Rehearse on TestPyPI first. A version number can never be re-uploaded, even after deleting it.
|
|
81
|
+
|
|
82
|
+
## 6. CI
|
|
83
|
+
|
|
84
|
+
One workflow, triggered by a version tag: a build matrix per OS that freezes, signs, smoke-tests and uploads artifacts; a publish job that needs the builds and runs in a protected environment with required reviewers. Secrets (Apple app-specific password or API key, signing credentials) live only in that environment.
|
|
85
|
+
|
|
86
|
+
## Never
|
|
87
|
+
|
|
88
|
+
- Never commit certificates, `.p12` files, passwords or PyPI tokens.
|
|
89
|
+
- Never tell users to disable Gatekeeper, SmartScreen or antivirus as the fix.
|
|
90
|
+
- Never ship an unsigned build labelled as a release when signing was expected; ask first.
|
|
91
|
+
- Never publish to PyPI from a developer laptop when the project has a CI publisher.
|
|
92
|
+
|
|
93
|
+
## Regulated or high-stakes distribution
|
|
94
|
+
|
|
95
|
+
Export controls on cryptography, app-store rules and licence obligations of bundled libraries (GPL/LGPL Qt bindings, for example) are not covered here. Flag them and have the owner or legal review before a public release.
|
|
96
|
+
|
|
97
|
+
## Report back
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
## Distribution: <app> <version>
|
|
101
|
+
Channels: <PyPI | Windows installer | macOS dmg | Linux>
|
|
102
|
+
Builds: <OS/arch -> artifact, size>
|
|
103
|
+
Signing: Windows <signed+timestamped yes/no>, macOS <signed, notarized, stapled yes/no>
|
|
104
|
+
PyPI: <TestPyPI ok, trusted publisher configured, published yes/no>
|
|
105
|
+
Smoke tests: <clean-machine result per OS>
|
|
106
|
+
Open items: <credentials, reputation, licences>
|
|
107
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Turn our PySide6 desktop tool into a signed Windows installer our customers can download",
|
|
4
|
+
"The PyInstaller build works on my machine but the exe can't find its icons and config file",
|
|
5
|
+
"macOS says our Python app is damaged and can't be opened; set up codesign and notarization",
|
|
6
|
+
"Publish our library to PyPI from GitHub Actions without storing an API token",
|
|
7
|
+
"Compile our Python CLI with Nuitka into a single binary for Linux and macOS"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Set up ruff, mypy and a pyproject.toml for our new Python service",
|
|
11
|
+
"Decide the next semantic version and write release notes for this sprint's changes",
|
|
12
|
+
"Pin the Python interpreter version so every developer and CI use the same one",
|
|
13
|
+
"Write a Dockerfile that runs our Python API in production",
|
|
14
|
+
"Write pytest fixtures for the billing module"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# PyPI trusted publishing (GitHub Actions)
|
|
2
|
+
|
|
3
|
+
Read this when wiring a release workflow. Trusted publishing exchanges a short-lived GitHub OIDC token for a PyPI upload token; nothing long-lived is stored.
|
|
4
|
+
|
|
5
|
+
## On PyPI
|
|
6
|
+
|
|
7
|
+
Project settings, Publishing, add a GitHub publisher with: owner, repository, workflow file name (for example `release.yml`) and environment name (for example `pypi`). For a project that does not exist yet, add a pending publisher from your account's Publishing page. Do the same on TestPyPI for rehearsals.
|
|
8
|
+
|
|
9
|
+
## Workflow
|
|
10
|
+
|
|
11
|
+
```yaml
|
|
12
|
+
name: release
|
|
13
|
+
on:
|
|
14
|
+
push:
|
|
15
|
+
tags: ["v*"]
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
build:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v4
|
|
22
|
+
- uses: actions/setup-python@v5
|
|
23
|
+
with:
|
|
24
|
+
python-version: "3.12"
|
|
25
|
+
- run: python -m pip install build twine
|
|
26
|
+
- run: python -m build
|
|
27
|
+
- run: twine check dist/*
|
|
28
|
+
- uses: actions/upload-artifact@v4
|
|
29
|
+
with:
|
|
30
|
+
name: dist
|
|
31
|
+
path: dist/
|
|
32
|
+
|
|
33
|
+
publish:
|
|
34
|
+
needs: build
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
environment: pypi # must match the publisher on PyPI
|
|
37
|
+
permissions:
|
|
38
|
+
id-token: write # required for trusted publishing
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/download-artifact@v4
|
|
41
|
+
with:
|
|
42
|
+
name: dist
|
|
43
|
+
path: dist/
|
|
44
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
For TestPyPI add `with: repository-url: https://test.pypi.org/legacy/` and a separate environment.
|
|
48
|
+
|
|
49
|
+
Keep `id-token: write` on the publish job only, and protect the environment with required reviewers and a tag rule. Recent versions of the publish action also generate and upload attestations by default; leave that on.
|
|
50
|
+
|
|
51
|
+
## Checks before the first real upload
|
|
52
|
+
|
|
53
|
+
- `name` and `version` in `pyproject.toml` are right; the version matches the tag.
|
|
54
|
+
- `readme`, `license` and `classifiers` render: `twine check` passes.
|
|
55
|
+
- A fresh `pip install` of the TestPyPI release works (`--extra-index-url https://pypi.org/simple/` so dependencies resolve).
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Windows installers and macOS signing
|
|
2
|
+
|
|
3
|
+
Read this when writing the installer script, setting up signing in CI or debugging a notarization failure. Check Apple's and Microsoft's current documentation before relying on a specific certificate product; both change their signing offerings.
|
|
4
|
+
|
|
5
|
+
## Inno Setup (minimal)
|
|
6
|
+
|
|
7
|
+
```ini
|
|
8
|
+
[Setup]
|
|
9
|
+
AppId={{8C5E2F0A-REPLACE-WITH-YOUR-GUID}}
|
|
10
|
+
AppName=MyApp
|
|
11
|
+
AppVersion=1.4.0
|
|
12
|
+
DefaultDirName={autopf}\MyApp
|
|
13
|
+
DefaultGroupName=MyApp
|
|
14
|
+
OutputBaseFilename=MyApp-1.4.0-setup
|
|
15
|
+
Compression=lzma2
|
|
16
|
+
SolidCompression=yes
|
|
17
|
+
ArchitecturesAllowed=x64compatible
|
|
18
|
+
ArchitecturesInstallIn64BitMode=x64compatible
|
|
19
|
+
PrivilegesRequiredOverridesAllowed=dialog
|
|
20
|
+
|
|
21
|
+
[Files]
|
|
22
|
+
Source: "dist\MyApp\*"; DestDir: "{app}"; Flags: recursesubdirs ignoreversion
|
|
23
|
+
|
|
24
|
+
[Icons]
|
|
25
|
+
Name: "{group}\MyApp"; Filename: "{app}\MyApp.exe"
|
|
26
|
+
|
|
27
|
+
[Run]
|
|
28
|
+
Filename: "{app}\MyApp.exe"; Flags: nowait postinstall skipifsilent
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Keep `AppId` fixed forever; upgrades find the old install by it. Compile with `iscc installer.iss`. Inno Setup can call the signer itself through a `SignTool=` entry so the uninstaller is signed too.
|
|
32
|
+
|
|
33
|
+
## MSIX
|
|
34
|
+
|
|
35
|
+
Needs an `AppxManifest.xml` whose `Publisher` matches the signing certificate subject exactly. Package with `makeappx pack /d <folder> /p MyApp.msix`, sign with `signtool sign /fd SHA256 ...`. MSIX apps run with a virtualized file system and registry; test file writes and per-user settings.
|
|
36
|
+
|
|
37
|
+
## signtool
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
signtool sign /fd SHA256 /tr http://timestamp.example-ca.com /td SHA256 /a dist\MyApp\MyApp.exe
|
|
41
|
+
signtool verify /pa /v dist\MyApp\MyApp.exe
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Use the timestamp URL your CA or signing service documents. Cloud signing services ship their own signtool plug-in (dlib) and metadata file instead of `/a` or `/f`.
|
|
45
|
+
|
|
46
|
+
## macOS entitlements for a frozen Python app
|
|
47
|
+
|
|
48
|
+
Frozen Python apps often need these under the hardened runtime:
|
|
49
|
+
|
|
50
|
+
```xml
|
|
51
|
+
<key>com.apple.security.cs.allow-unsigned-executable-memory</key><true/>
|
|
52
|
+
<key>com.apple.security.cs.disable-library-validation</key><true/>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Add only what the app needs; start without them and add one at a time if the signed app crashes at launch. Camera, microphone or Apple Events access also need usage strings in `Info.plist`.
|
|
56
|
+
|
|
57
|
+
## macOS signing in CI
|
|
58
|
+
|
|
59
|
+
1. Export the Developer ID Application certificate as `.p12`, store it base64-encoded with its password as CI secrets.
|
|
60
|
+
2. In the job: create a temporary keychain (`security create-keychain`), import the `.p12` (`security import ... -T /usr/bin/codesign`), allow codesign access (`security set-key-partition-list -S apple-tool:,apple:`), sign, then delete the keychain.
|
|
61
|
+
3. Notarize with an App Store Connect API key (`xcrun notarytool submit --key <p8> --key-id <id> --issuer <uuid>`) or an app-specific password stored with `xcrun notarytool store-credentials`.
|
|
62
|
+
|
|
63
|
+
## Common notarization failures
|
|
64
|
+
|
|
65
|
+
| Message | Fix |
|
|
66
|
+
|---|---|
|
|
67
|
+
| The binary is not signed with a valid Developer ID certificate | A nested `.so`/`.dylib` was skipped; sign every Mach-O file |
|
|
68
|
+
| The signature does not include a secure timestamp | Add `--timestamp` |
|
|
69
|
+
| The executable does not have the hardened runtime enabled | Add `--options runtime` |
|
|
70
|
+
| Signed app fails after editing | Any change after signing breaks it; sign last, then package |
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: quality-nonconformance
|
|
3
|
+
description: Nonconformance report (NCR) and corrective and preventive action (CAPA) workflow for regulated manufacturing such as medical devices under FDA's Quality Management System Regulation (21 CFR 820, which incorporates ISO 13485:2016) and automotive suppliers under IATF 16949, covering NCR intake and severity triage, containment and quarantine, root cause analysis with 5 Whys, Ishikawa diagrams and 8D, disposition decisions (use as is, rework, repair, scrap, return to supplier), CAPA plans, and effectiveness verification before closure. Use when a part, lot or process fails a specification, a customer complaint or audit finding needs a CAPA, you are writing or fixing an NCR or CAPA procedure or tracker, or a corrective action keeps failing to stop a repeat defect.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Works from the user's NCR, inspection, complaint and production records. Quotes clause numbers, not licensed standard text; the user needs their own copies of ISO 13485 and IATF 16949. Not regulatory or legal advice.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: compliance
|
|
9
|
+
kete-loom/risk: read-only
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Quality nonconformance and CAPA
|
|
14
|
+
|
|
15
|
+
Stop bad product reaching the customer, find the cause that actually explains the defect, fix it so it does not come back, and leave a record an auditor can follow. This skill structures the work; the organisation's quality management system (QMS) procedures and its quality and regulatory staff decide.
|
|
16
|
+
|
|
17
|
+
## Boundary: when a qualified person must decide
|
|
18
|
+
|
|
19
|
+
**Stop and tell the user a qualified quality or regulatory person must decide**, and do not draft a conclusion for them, when:
|
|
20
|
+
|
|
21
|
+
- The defect could affect patient or user safety, or a device already shipped: field action, recall, correction or removal, and Medical Device Reporting (21 CFR 803) or reports of corrections and removals (21 CFR 806) decisions belong to regulatory affairs.
|
|
22
|
+
- A disposition would ship product outside specification (use as is, concession or deviation). Automotive: the customer must authorise it in writing under IATF 16949 and the customer's own requirements.
|
|
23
|
+
- A design change, validated process change, or supplier change follows from the CAPA; it needs the change control and, where required, revalidation or customer approval (for example a PPAP resubmission).
|
|
24
|
+
- Anyone asks to close a CAPA without objective evidence of effectiveness.
|
|
25
|
+
|
|
26
|
+
## 1. Intake: open the NCR
|
|
27
|
+
|
|
28
|
+
Record, from evidence, not memory:
|
|
29
|
+
|
|
30
|
+
1. What failed: part number, revision, lot or serial numbers, quantity affected and quantity inspected.
|
|
31
|
+
2. Requirement violated: drawing, specification, procedure or customer requirement, with revision.
|
|
32
|
+
3. Where found (incoming, in process, final inspection, customer, field, audit) and by whom, when.
|
|
33
|
+
4. Objective evidence: measurements, photos, test records.
|
|
34
|
+
5. Severity and risk: link to the product's risk file (ISO 14971 risk management for devices; PFMEA and control plan for automotive). A failure mode not in the risk file is itself a finding.
|
|
35
|
+
|
|
36
|
+
Number every NCR, never delete one, and keep its history (records and electronic signatures under 21 CFR Part 11 if records are electronic and the site is FDA-regulated).
|
|
37
|
+
|
|
38
|
+
## 2. Containment, within hours
|
|
39
|
+
|
|
40
|
+
1. Quarantine and tag all suspect material: in stock, in process, in transit, at suppliers, at distribution.
|
|
41
|
+
2. Define the suspect range from the last known good to the first known good, using lot traceability. If you cannot bound it, widen it.
|
|
42
|
+
3. Add a 100% check or sort at the point of detection until the fix is proven, and record results.
|
|
43
|
+
4. Decide whether the customer must be told now (automotive customers usually require notification; device field impact goes to regulatory per the boundary above).
|
|
44
|
+
|
|
45
|
+
Containment is not correction. Record both separately.
|
|
46
|
+
|
|
47
|
+
## 3. Root cause
|
|
48
|
+
|
|
49
|
+
Pick the method by the problem, and check the cause against the data:
|
|
50
|
+
|
|
51
|
+
- **5 Whys** for a single, clear failure chain. Each "why" must be backed by evidence. Stop at a cause the organisation can control and that, if removed, would have prevented the defect.
|
|
52
|
+
- **Ishikawa (fishbone)** when several causes are possible: list candidates under Man (people), Machine, Method, Material, Measurement, Environment, then test each one with data.
|
|
53
|
+
- **8D** for customer complaints, recurring or cross-functional problems, and where the customer requires it (common in automotive). Steps and the report outline are in `references/8d-and-capa.md`.
|
|
54
|
+
- Use is/is-not analysis, process data, and a test that turns the defect on and off when you can.
|
|
55
|
+
|
|
56
|
+
Find two causes: why it **occurred** and why it **escaped** detection. Also ask why the system allowed it (systemic cause), for example a control plan that never covered the characteristic.
|
|
57
|
+
|
|
58
|
+
Never accept "operator error" or "retrain the operator" as the root cause on its own. Ask what made the error possible and prefer error-proofing (IATF 16949 expects it in problem solving).
|
|
59
|
+
|
|
60
|
+
Verify measurement before blaming the process: check that the gauge is calibrated and that measurement system analysis (gauge R&R) is acceptable for that characteristic.
|
|
61
|
+
|
|
62
|
+
## 4. Disposition
|
|
63
|
+
|
|
64
|
+
| Disposition | Needs |
|
|
65
|
+
|---|---|
|
|
66
|
+
| Use as is / concession | documented justification, authorised approver, customer authorisation where required |
|
|
67
|
+
| Rework (back to specification) | approved rework instruction, re-inspection, record on the lot, batch or device production record (QMSR no longer uses the term device history record) |
|
|
68
|
+
| Repair (still not fully to specification) | as concession, plus customer authorisation in automotive |
|
|
69
|
+
| Scrap | controlled scrapping so it cannot re-enter stock |
|
|
70
|
+
| Return to supplier | supplier NCR or SCAR, replacement or credit, supplier containment |
|
|
71
|
+
|
|
72
|
+
Record who decided, when, and on what evidence.
|
|
73
|
+
|
|
74
|
+
## 5. CAPA
|
|
75
|
+
|
|
76
|
+
1. Decide whether a CAPA is needed by your procedure's rules (for example: safety impact, recurrence, customer complaint, audit finding, trend). Not every NCR needs one; record the decision either way.
|
|
77
|
+
2. Corrective action removes the cause found in section 3; preventive action removes the cause of a potential problem elsewhere (similar products, lines or suppliers). ISO 13485 treats these as separate requirements (clauses 8.5.2 and 8.5.3).
|
|
78
|
+
3. Each action has an owner, due date, and the evidence that will show it is done. Actions must not adversely affect product conformity or safety; check that before implementation.
|
|
79
|
+
4. Update the documents the action touches: drawings, work instructions, PFMEA, control plan, risk file, training records, supplier requirements.
|
|
80
|
+
|
|
81
|
+
## 6. Effectiveness check, then close
|
|
82
|
+
|
|
83
|
+
1. Define the effectiveness criteria when the CAPA is opened, not when it is closed: for example zero recurrences in the next N lots or N weeks, a capability index above target, or complaint rate below a threshold.
|
|
84
|
+
2. Wait long enough to see the result, then check against the criteria with data.
|
|
85
|
+
3. Not effective: reopen the root cause analysis. Do not stack new actions on an unverified cause.
|
|
86
|
+
4. Close only with objective evidence and the approver your procedure names. Feed the result into management review and trend analysis.
|
|
87
|
+
|
|
88
|
+
Clause references and the records auditors expect are in `references/8d-and-capa.md`.
|
|
89
|
+
|
|
90
|
+
## Rules
|
|
91
|
+
|
|
92
|
+
- Never back-date, edit or delete a quality record; correct with a dated, signed amendment.
|
|
93
|
+
- Never close a CAPA on "action completed" alone; closure needs verified effectiveness.
|
|
94
|
+
- Never ship quarantined material without a recorded disposition.
|
|
95
|
+
- Do not quote standard text you do not have; cite clause numbers and tell the user to check their licensed copy.
|
|
96
|
+
|
|
97
|
+
## Report
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
NCR <id> | part <pn rev> | lots <range> | qty affected <n> | found at <stage> | severity <level>
|
|
101
|
+
Requirement: <spec, rev> Evidence: <refs>
|
|
102
|
+
Containment: <actions, locations, qty quarantined, sort results>
|
|
103
|
+
Root cause (occurrence): <cause + evidence> Root cause (escape): <cause + evidence> Method: <5 Whys | Ishikawa | 8D>
|
|
104
|
+
Disposition: <type, approver, customer authorisation ref>
|
|
105
|
+
CAPA <id>: actions (owner, due, evidence) | effectiveness criteria | check date | result
|
|
106
|
+
Needs qualified decision: <reportability, concession, change control, other>
|
|
107
|
+
```
|