flonat-research 0.1.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/.claude/agents/domain-reviewer.md +336 -0
- package/.claude/agents/fixer.md +226 -0
- package/.claude/agents/paper-critic.md +370 -0
- package/.claude/agents/peer-reviewer.md +289 -0
- package/.claude/agents/proposal-reviewer.md +215 -0
- package/.claude/agents/referee2-reviewer.md +367 -0
- package/.claude/agents/references/journal-referee-profiles.md +354 -0
- package/.claude/agents/references/paper-critic/council-personas.md +77 -0
- package/.claude/agents/references/paper-critic/council-prompts.md +198 -0
- package/.claude/agents/references/peer-reviewer/report-template.md +199 -0
- package/.claude/agents/references/peer-reviewer/sa-prompts.md +260 -0
- package/.claude/agents/references/peer-reviewer/security-scan.md +188 -0
- package/.claude/agents/references/proposal-reviewer/report-template.md +144 -0
- package/.claude/agents/references/proposal-reviewer/sa-prompts.md +149 -0
- package/.claude/agents/references/referee-config.md +114 -0
- package/.claude/agents/references/referee2-reviewer/audit-checklists.md +287 -0
- package/.claude/agents/references/referee2-reviewer/report-template.md +334 -0
- package/.claude/rules/design-before-results.md +52 -0
- package/.claude/rules/ignore-agents-md.md +17 -0
- package/.claude/rules/ignore-gemini-md.md +17 -0
- package/.claude/rules/lean-claude-md.md +45 -0
- package/.claude/rules/learn-tags.md +99 -0
- package/.claude/rules/overleaf-separation.md +67 -0
- package/.claude/rules/plan-first.md +175 -0
- package/.claude/rules/read-docs-first.md +50 -0
- package/.claude/rules/scope-discipline.md +28 -0
- package/.claude/settings.json +125 -0
- package/.context/current-focus.md +33 -0
- package/.context/preferences/priorities.md +36 -0
- package/.context/preferences/task-naming.md +28 -0
- package/.context/profile.md +29 -0
- package/.context/projects/_index.md +41 -0
- package/.context/projects/papers/nudge-exp.md +22 -0
- package/.context/projects/papers/uncertainty.md +31 -0
- package/.context/resources/claude-scientific-writer-review.md +48 -0
- package/.context/resources/cunningham-multi-analyst-agents.md +104 -0
- package/.context/resources/cunningham-multilang-code-audit.md +62 -0
- package/.context/resources/google-ai-co-scientist-review.md +72 -0
- package/.context/resources/karpathy-llm-council-review.md +58 -0
- package/.context/resources/multi-coder-reliability-protocol.md +175 -0
- package/.context/resources/pedro-santanna-takeaways.md +96 -0
- package/.context/resources/venue-rankings/abs_ajg_2024.csv +1823 -0
- package/.context/resources/venue-rankings/abs_ajg_2024_econ.csv +356 -0
- package/.context/resources/venue-rankings/cabs_4_4star_theory.csv +40 -0
- package/.context/resources/venue-rankings/core_2026.csv +801 -0
- package/.context/resources/venue-rankings.md +147 -0
- package/.context/workflows/README.md +69 -0
- package/.context/workflows/daily-review.md +91 -0
- package/.context/workflows/meeting-actions.md +108 -0
- package/.context/workflows/replication-protocol.md +155 -0
- package/.context/workflows/weekly-review.md +113 -0
- package/.mcp-server-biblio/formatters.py +158 -0
- package/.mcp-server-biblio/pyproject.toml +11 -0
- package/.mcp-server-biblio/server.py +678 -0
- package/.mcp-server-biblio/sources/__init__.py +14 -0
- package/.mcp-server-biblio/sources/base.py +73 -0
- package/.mcp-server-biblio/sources/formatters.py +83 -0
- package/.mcp-server-biblio/sources/models.py +22 -0
- package/.mcp-server-biblio/sources/multi_source.py +243 -0
- package/.mcp-server-biblio/sources/openalex_source.py +183 -0
- package/.mcp-server-biblio/sources/scopus_source.py +309 -0
- package/.mcp-server-biblio/sources/wos_source.py +508 -0
- package/.mcp-server-biblio/uv.lock +896 -0
- package/.scripts/README.md +161 -0
- package/.scripts/ai_pattern_density.py +446 -0
- package/.scripts/conf +445 -0
- package/.scripts/config.py +122 -0
- package/.scripts/count_inventory.py +275 -0
- package/.scripts/daily_digest.py +288 -0
- package/.scripts/done +177 -0
- package/.scripts/extract_meeting_actions.py +223 -0
- package/.scripts/focus +176 -0
- package/.scripts/generate-codex-agents-md.py +217 -0
- package/.scripts/inbox +194 -0
- package/.scripts/notion_helpers.py +325 -0
- package/.scripts/openalex/query_helpers.py +306 -0
- package/.scripts/papers +227 -0
- package/.scripts/query +223 -0
- package/.scripts/session-history.py +201 -0
- package/.scripts/skill-health.py +516 -0
- package/.scripts/skill-log-miner.py +273 -0
- package/.scripts/sync-to-codex.sh +252 -0
- package/.scripts/task +213 -0
- package/.scripts/tasks +190 -0
- package/.scripts/week +206 -0
- package/CLAUDE.md +197 -0
- package/LICENSE +21 -0
- package/MEMORY.md +38 -0
- package/README.md +269 -0
- package/docs/agents.md +44 -0
- package/docs/bibliography-setup.md +55 -0
- package/docs/council-mode.md +36 -0
- package/docs/getting-started.md +245 -0
- package/docs/hooks.md +38 -0
- package/docs/mcp-servers.md +82 -0
- package/docs/notion-setup.md +109 -0
- package/docs/rules.md +33 -0
- package/docs/scripts.md +303 -0
- package/docs/setup-overview/setup-overview.pdf +0 -0
- package/docs/skills.md +70 -0
- package/docs/system.md +159 -0
- package/hooks/block-destructive-git.sh +66 -0
- package/hooks/context-monitor.py +114 -0
- package/hooks/postcompact-restore.py +157 -0
- package/hooks/precompact-autosave.py +181 -0
- package/hooks/promise-checker.sh +124 -0
- package/hooks/protect-source-files.sh +81 -0
- package/hooks/resume-context-loader.sh +53 -0
- package/hooks/startup-context-loader.sh +102 -0
- package/package.json +51 -0
- package/packages/cli-council/.github/workflows/claude-code-review.yml +44 -0
- package/packages/cli-council/.github/workflows/claude.yml +50 -0
- package/packages/cli-council/README.md +100 -0
- package/packages/cli-council/pyproject.toml +43 -0
- package/packages/cli-council/src/cli_council/__init__.py +19 -0
- package/packages/cli-council/src/cli_council/__main__.py +185 -0
- package/packages/cli-council/src/cli_council/backends/__init__.py +8 -0
- package/packages/cli-council/src/cli_council/backends/base.py +81 -0
- package/packages/cli-council/src/cli_council/backends/claude.py +25 -0
- package/packages/cli-council/src/cli_council/backends/codex.py +27 -0
- package/packages/cli-council/src/cli_council/backends/gemini.py +26 -0
- package/packages/cli-council/src/cli_council/checkpoint.py +212 -0
- package/packages/cli-council/src/cli_council/config.py +51 -0
- package/packages/cli-council/src/cli_council/council.py +391 -0
- package/packages/cli-council/src/cli_council/models.py +46 -0
- package/packages/llm-council/.github/workflows/claude-code-review.yml +44 -0
- package/packages/llm-council/.github/workflows/claude.yml +50 -0
- package/packages/llm-council/README.md +453 -0
- package/packages/llm-council/pyproject.toml +42 -0
- package/packages/llm-council/src/llm_council/__init__.py +23 -0
- package/packages/llm-council/src/llm_council/__main__.py +259 -0
- package/packages/llm-council/src/llm_council/checkpoint.py +193 -0
- package/packages/llm-council/src/llm_council/client.py +253 -0
- package/packages/llm-council/src/llm_council/config.py +232 -0
- package/packages/llm-council/src/llm_council/council.py +482 -0
- package/packages/llm-council/src/llm_council/models.py +46 -0
- package/packages/mcp-bibliography/MEMORY.md +31 -0
- package/packages/mcp-bibliography/_app.py +226 -0
- package/packages/mcp-bibliography/formatters.py +158 -0
- package/packages/mcp-bibliography/log/2026-03-13-2100.md +35 -0
- package/packages/mcp-bibliography/pyproject.toml +15 -0
- package/packages/mcp-bibliography/run.sh +20 -0
- package/packages/mcp-bibliography/scholarly_formatters.py +83 -0
- package/packages/mcp-bibliography/server.py +1857 -0
- package/packages/mcp-bibliography/tools/__init__.py +28 -0
- package/packages/mcp-bibliography/tools/_registry.py +19 -0
- package/packages/mcp-bibliography/tools/altmetric.py +107 -0
- package/packages/mcp-bibliography/tools/core.py +92 -0
- package/packages/mcp-bibliography/tools/dblp.py +52 -0
- package/packages/mcp-bibliography/tools/openalex.py +296 -0
- package/packages/mcp-bibliography/tools/opencitations.py +102 -0
- package/packages/mcp-bibliography/tools/openreview.py +179 -0
- package/packages/mcp-bibliography/tools/orcid.py +131 -0
- package/packages/mcp-bibliography/tools/scholarly.py +575 -0
- package/packages/mcp-bibliography/tools/unpaywall.py +63 -0
- package/packages/mcp-bibliography/tools/zenodo.py +123 -0
- package/packages/mcp-bibliography/uv.lock +711 -0
- package/scripts/setup.sh +143 -0
- package/skills/beamer-deck/SKILL.md +199 -0
- package/skills/beamer-deck/references/quality-rubric.md +54 -0
- package/skills/beamer-deck/references/review-prompts.md +106 -0
- package/skills/bib-validate/SKILL.md +261 -0
- package/skills/bib-validate/references/council-mode.md +34 -0
- package/skills/bib-validate/references/deep-verify.md +79 -0
- package/skills/bib-validate/references/fix-mode.md +36 -0
- package/skills/bib-validate/references/openalex-verification.md +45 -0
- package/skills/bib-validate/references/preprint-check.md +31 -0
- package/skills/bib-validate/references/ref-manager-crossref.md +41 -0
- package/skills/bib-validate/references/report-template.md +82 -0
- package/skills/code-archaeology/SKILL.md +141 -0
- package/skills/code-review/SKILL.md +265 -0
- package/skills/code-review/references/quality-rubric.md +67 -0
- package/skills/consolidate-memory/SKILL.md +208 -0
- package/skills/context-status/SKILL.md +126 -0
- package/skills/creation-guard/SKILL.md +230 -0
- package/skills/devils-advocate/SKILL.md +130 -0
- package/skills/devils-advocate/references/competing-hypotheses.md +83 -0
- package/skills/init-project/SKILL.md +115 -0
- package/skills/init-project-course/references/memory-and-settings.md +92 -0
- package/skills/init-project-course/references/organise-templates.md +94 -0
- package/skills/init-project-course/skill.md +147 -0
- package/skills/init-project-light/skill.md +139 -0
- package/skills/init-project-research/SKILL.md +368 -0
- package/skills/init-project-research/references/atlas-pipeline-sync.md +70 -0
- package/skills/init-project-research/references/atlas-schema.md +81 -0
- package/skills/init-project-research/references/confirmation-report.md +39 -0
- package/skills/init-project-research/references/domain-profile-template.md +104 -0
- package/skills/init-project-research/references/interview-round3.md +34 -0
- package/skills/init-project-research/references/literature-discovery.md +43 -0
- package/skills/init-project-research/references/scaffold-details.md +197 -0
- package/skills/init-project-research/templates/field-calibration.md +60 -0
- package/skills/init-project-research/templates/pipeline-manifest.md +63 -0
- package/skills/init-project-research/templates/run-all.sh +116 -0
- package/skills/init-project-research/templates/seed-files.md +337 -0
- package/skills/insights-deck/SKILL.md +151 -0
- package/skills/interview-me/SKILL.md +157 -0
- package/skills/latex/SKILL.md +141 -0
- package/skills/latex/references/latex-configs.md +183 -0
- package/skills/latex-autofix/SKILL.md +230 -0
- package/skills/latex-autofix/references/known-errors.md +183 -0
- package/skills/latex-autofix/references/quality-rubric.md +50 -0
- package/skills/latex-health-check/SKILL.md +161 -0
- package/skills/learn/SKILL.md +220 -0
- package/skills/learn/scripts/validate_skill.py +265 -0
- package/skills/lessons-learned/SKILL.md +201 -0
- package/skills/literature/SKILL.md +335 -0
- package/skills/literature/references/agent-templates.md +393 -0
- package/skills/literature/references/bibliometric-apis.md +44 -0
- package/skills/literature/references/cli-council-search.md +79 -0
- package/skills/literature/references/openalex-api-guide.md +371 -0
- package/skills/literature/references/openalex-common-queries.md +381 -0
- package/skills/literature/references/openalex-workflows.md +248 -0
- package/skills/literature/references/reference-manager-sync.md +36 -0
- package/skills/literature/references/scopus-api-guide.md +208 -0
- package/skills/literature/references/wos-api-guide.md +308 -0
- package/skills/multi-perspective/SKILL.md +311 -0
- package/skills/multi-perspective/references/computational-many-analysts.md +77 -0
- package/skills/pipeline-manifest/SKILL.md +226 -0
- package/skills/pre-submission-report/SKILL.md +153 -0
- package/skills/process-reviews/SKILL.md +244 -0
- package/skills/process-reviews/references/rr-routing.md +101 -0
- package/skills/project-deck/SKILL.md +87 -0
- package/skills/project-safety/SKILL.md +135 -0
- package/skills/proofread/SKILL.md +254 -0
- package/skills/proofread/references/quality-rubric.md +104 -0
- package/skills/python-env/SKILL.md +57 -0
- package/skills/quarto-deck/SKILL.md +226 -0
- package/skills/quarto-deck/references/markdown-format.md +143 -0
- package/skills/quarto-deck/references/quality-rubric.md +54 -0
- package/skills/save-context/SKILL.md +174 -0
- package/skills/session-log/SKILL.md +98 -0
- package/skills/shared/concept-validation-gate.md +161 -0
- package/skills/shared/council-protocol.md +265 -0
- package/skills/shared/distribution-diagnostics.md +164 -0
- package/skills/shared/engagement-stratified-sampling.md +218 -0
- package/skills/shared/escalation-protocol.md +74 -0
- package/skills/shared/external-audit-protocol.md +205 -0
- package/skills/shared/intercoder-reliability.md +256 -0
- package/skills/shared/mcp-degradation.md +81 -0
- package/skills/shared/method-probing-questions.md +163 -0
- package/skills/shared/multi-language-conventions.md +143 -0
- package/skills/shared/paid-api-safety.md +174 -0
- package/skills/shared/palettes.md +90 -0
- package/skills/shared/progressive-disclosure.md +92 -0
- package/skills/shared/project-documentation-content.md +443 -0
- package/skills/shared/project-documentation-format.md +281 -0
- package/skills/shared/project-documentation.md +100 -0
- package/skills/shared/publication-output.md +138 -0
- package/skills/shared/quality-scoring.md +70 -0
- package/skills/shared/reference-resolution.md +77 -0
- package/skills/shared/research-quality-rubric.md +165 -0
- package/skills/shared/rhetoric-principles.md +54 -0
- package/skills/shared/skill-design-patterns.md +272 -0
- package/skills/shared/skill-index.md +240 -0
- package/skills/shared/system-documentation.md +334 -0
- package/skills/shared/tikz-rules.md +402 -0
- package/skills/shared/validation-tiers.md +121 -0
- package/skills/shared/venue-guides/README.md +46 -0
- package/skills/shared/venue-guides/cell_press_style.md +483 -0
- package/skills/shared/venue-guides/conferences_formatting.md +564 -0
- package/skills/shared/venue-guides/cs_conference_style.md +463 -0
- package/skills/shared/venue-guides/examples/cell_summary_example.md +247 -0
- package/skills/shared/venue-guides/examples/medical_structured_abstract.md +313 -0
- package/skills/shared/venue-guides/examples/nature_abstract_examples.md +213 -0
- package/skills/shared/venue-guides/examples/neurips_introduction_example.md +245 -0
- package/skills/shared/venue-guides/journals_formatting.md +486 -0
- package/skills/shared/venue-guides/medical_journal_styles.md +535 -0
- package/skills/shared/venue-guides/ml_conference_style.md +556 -0
- package/skills/shared/venue-guides/nature_science_style.md +405 -0
- package/skills/shared/venue-guides/reviewer_expectations.md +417 -0
- package/skills/shared/venue-guides/venue_writing_styles.md +321 -0
- package/skills/split-pdf/SKILL.md +172 -0
- package/skills/split-pdf/methodology.md +48 -0
- package/skills/sync-notion/SKILL.md +93 -0
- package/skills/system-audit/SKILL.md +157 -0
- package/skills/system-audit/references/sub-agent-prompts.md +294 -0
- package/skills/task-management/SKILL.md +131 -0
- package/skills/update-focus/SKILL.md +204 -0
- package/skills/update-project-doc/SKILL.md +194 -0
- package/skills/validate-bib/SKILL.md +242 -0
- package/skills/validate-bib/references/council-mode.md +34 -0
- package/skills/validate-bib/references/deep-verify.md +71 -0
- package/skills/validate-bib/references/openalex-verification.md +45 -0
- package/skills/validate-bib/references/preprint-check.md +31 -0
- package/skills/validate-bib/references/report-template.md +62 -0
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
# TikZ & Figure Anti-Collision Rules
|
|
2
|
+
|
|
3
|
+
> LLMs cannot do spatial reasoning visually. Convert every spatial question to a **computation** before placing elements. These rules are organized as a 6-pass verification workflow to run after any TikZ diagram or matplotlib figure is written or edited.
|
|
4
|
+
|
|
5
|
+
## The Core Principle
|
|
6
|
+
|
|
7
|
+
**Never eyeball positions. Calculate them.** Spatial errors (labels on arrows, boxes overlapping, annotations bleeding) are invisible in `.tex` source and Python scripts alike. The only defence is arithmetic verification before compiling or rendering. **These rules apply to both TikZ diagrams AND matplotlib/Python figures.**
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Pass 1: Bezier Curve Clearance (Rules 1-3)
|
|
12
|
+
|
|
13
|
+
> Most dangerous class of error. Curved arrows (`bend left`, `bend right`, `in`/`out` angles) create invisible collision zones that swallow labels.
|
|
14
|
+
|
|
15
|
+
### Rule 1: Compute Bezier Max Depth Before Placing Any Label Near a Curve
|
|
16
|
+
|
|
17
|
+
**Problem:** A `bend left=35` arrow looks like it stays close to the straight-line path, but its maximum perpendicular displacement can be large enough to overlap labels, boxes, or other arrows.
|
|
18
|
+
|
|
19
|
+
**Formula — Bezier max depth:**
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
depth = (chord / 2) * tan(bend_angle / 2)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Where:
|
|
26
|
+
- `chord` = straight-line distance between the two endpoints
|
|
27
|
+
- `bend_angle` = the TikZ bend angle (e.g., 35 for `bend left=35`)
|
|
28
|
+
|
|
29
|
+
**Example:**
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
% Chord = 6cm, bend left=35
|
|
33
|
+
% depth = (6/2) * tan(35/2) = 3 * tan(17.5°) = 3 * 0.3153 = 0.946cm
|
|
34
|
+
%
|
|
35
|
+
% WRONG: Label placed 0.5cm from the chord — the curve passes through it
|
|
36
|
+
\draw[->] (A) to[bend left=35] node[above, yshift=0.5cm] {label} (B);
|
|
37
|
+
%
|
|
38
|
+
% RIGHT: Label shifted beyond the depth + padding
|
|
39
|
+
% Required clearance: 0.946 + 0.3 (padding) = 1.25cm minimum
|
|
40
|
+
\draw[->] (A) to[bend left=35] node[above, yshift=1.4cm] {label} (B);
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Action:** For every curved arrow, compute the depth. Any element within `depth + 0.3cm` of the chord midpoint is at risk.
|
|
44
|
+
|
|
45
|
+
### Rule 2: Return Arrows Must Clear Outbound Curves
|
|
46
|
+
|
|
47
|
+
**Problem:** A diagram has a forward arrow `A -> B` curving one way and a return arrow `B -> A` curving the other. The two curves intersect if both use the same bend angle and the vertical/horizontal offset is insufficient.
|
|
48
|
+
|
|
49
|
+
**Formula — minimum separation between opposing curves:**
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
min_separation = 2 * depth + gap
|
|
53
|
+
= 2 * (chord/2) * tan(bend_angle/2) + 0.4cm
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Example:**
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
% Chord = 5cm, bend left=30 for both directions
|
|
60
|
+
% depth = 2.5 * tan(15°) = 2.5 * 0.2679 = 0.67cm
|
|
61
|
+
% min_separation = 2 * 0.67 + 0.4 = 1.74cm
|
|
62
|
+
%
|
|
63
|
+
% WRONG: Both arrows at the same vertical level — they cross
|
|
64
|
+
\draw[->] (A) to[bend left=30] (B);
|
|
65
|
+
\draw[->] (B) to[bend left=30] (A);
|
|
66
|
+
%
|
|
67
|
+
% RIGHT: Vertically separate the nodes or increase bend angles asymmetrically
|
|
68
|
+
\draw[->] (A) to[bend left=25] (B);
|
|
69
|
+
\draw[->] (B) to[bend left=45] (A); % deeper curve, stays below
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Action:** When a diagram has bidirectional curved arrows between the same pair of nodes, compute both depths and verify they don't intersect.
|
|
73
|
+
|
|
74
|
+
### Rule 3: Curved Arrows Must Not Cross Intermediate Nodes
|
|
75
|
+
|
|
76
|
+
**Problem:** A curved arrow from node A to node C passes through the vertical/horizontal space occupied by node B (which sits between them). The curve's depth places it directly on top of B.
|
|
77
|
+
|
|
78
|
+
**Formula — curve y-position at node B's x-coordinate:**
|
|
79
|
+
|
|
80
|
+
For a symmetric bend, approximate the curve height at horizontal position `x` from the start:
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
y(x) ≈ depth * sin(pi * x / chord)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Compare `y(x_B)` against node B's bounding box.
|
|
87
|
+
|
|
88
|
+
**Example:**
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
% A at (0,0), B at (3,0), C at (6,0). Curve A->C with bend left=30
|
|
92
|
+
% chord = 6, depth = 3 * tan(15°) = 0.804cm
|
|
93
|
+
% At x=3 (node B): y = 0.804 * sin(pi * 3/6) = 0.804 * 1.0 = 0.804cm
|
|
94
|
+
%
|
|
95
|
+
% If node B is a box extending 0.5cm above its center, the curve at 0.804cm
|
|
96
|
+
% is only 0.3cm above B's top edge — too close.
|
|
97
|
+
%
|
|
98
|
+
% RIGHT: Increase bend angle or route the arrow above/below the row
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Action:** For any curved arrow that spans multiple columns or rows, check whether the curve passes through intermediate nodes.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Pass 2: Gap Calculations (Rules 4-5)
|
|
106
|
+
|
|
107
|
+
> Minimum spacing between all elements. No two elements should touch or nearly touch.
|
|
108
|
+
|
|
109
|
+
### Rule 4: Minimum Gap Between Parallel Elements
|
|
110
|
+
|
|
111
|
+
**Problem:** Adjacent boxes, labels, or arrows placed too close together merge visually or overlap when rendered.
|
|
112
|
+
|
|
113
|
+
**Minimum gaps:**
|
|
114
|
+
|
|
115
|
+
| Element pair | Minimum gap |
|
|
116
|
+
|-------------|-------------|
|
|
117
|
+
| Box edge to box edge | 0.5cm |
|
|
118
|
+
| Arrow to parallel arrow | 0.4cm |
|
|
119
|
+
| Label baseline to any element | 0.3cm |
|
|
120
|
+
| Annotation rectangle edge to any neighbor | 0.5cm |
|
|
121
|
+
|
|
122
|
+
**Verification:** For every pair of adjacent elements, compute the distance between their nearest edges. If below the minimum, increase spacing.
|
|
123
|
+
|
|
124
|
+
**Example:**
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
% WRONG: Two boxes with 0.2cm gap — they'll touch or nearly merge
|
|
128
|
+
\node[draw, minimum width=2cm] (A) at (0,0) {Box A};
|
|
129
|
+
\node[draw, minimum width=2cm] (B) at (2.2,0) {Box B};
|
|
130
|
+
% Gap = 2.2 - (0 + 1.0) - 1.0 = 0.2cm (half-widths: 1.0cm each)
|
|
131
|
+
%
|
|
132
|
+
% RIGHT: Ensure 0.5cm gap minimum
|
|
133
|
+
\node[draw, minimum width=2cm] (A) at (0,0) {Box A};
|
|
134
|
+
\node[draw, minimum width=2cm] (B) at (2.5,0) {Box B};
|
|
135
|
+
% Gap = 2.5 - 1.0 - 1.0 = 0.5cm
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Rule 5: Annotation Rectangles Must Not Bleed Into Neighbors
|
|
139
|
+
|
|
140
|
+
**Problem:** A dashed rectangle drawn around a group of nodes (e.g., `\draw[dashed] ($(A.north west)+(-0.3,0.3)$) rectangle ...`) extends into the space of neighboring groups.
|
|
141
|
+
|
|
142
|
+
**Formula — annotation edge position:**
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
annotation_right_edge = rightmost_node_x + node_half_width + padding
|
|
146
|
+
annotation_left_edge = leftmost_node_x - node_half_width - padding
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Overlap test:**
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
overlap = annotation_right_edge > neighbor_left_edge - min_gap
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
If true, reduce padding or increase inter-group spacing.
|
|
156
|
+
|
|
157
|
+
**Example:**
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
% Group 1 rightmost node at x=4, half-width 1cm, padding 0.4cm
|
|
161
|
+
% annotation_right_edge = 4 + 1.0 + 0.4 = 5.4cm
|
|
162
|
+
%
|
|
163
|
+
% Group 2 leftmost node at x=5.5, half-width 1cm
|
|
164
|
+
% neighbor_left_edge = 5.5 - 1.0 = 4.5cm
|
|
165
|
+
%
|
|
166
|
+
% overlap check: 5.4 > 4.5 - 0.5 = 4.0 → 5.4 > 4.0 → YES, but...
|
|
167
|
+
% visual check: 5.4 vs 4.5 = only 0.9cm gap between annotation and box
|
|
168
|
+
%
|
|
169
|
+
% WRONG: annotation_right_edge (5.4) is only 0.1cm from Group 2's box edge (4.5)
|
|
170
|
+
% RIGHT: Move Group 2 to x=6.5 or reduce Group 1 padding to 0.2cm
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Pass 3: Label Positioning (Rules 6-7)
|
|
176
|
+
|
|
177
|
+
> Labels must fit in available space and not collide with the elements they describe.
|
|
178
|
+
|
|
179
|
+
### Rule 6: Text Width Must Fit Available Horizontal Space
|
|
180
|
+
|
|
181
|
+
**Problem:** A label or node text is wider than the space between its neighbors, causing it to overflow visually even though LaTeX compiles without error.
|
|
182
|
+
|
|
183
|
+
**Formula — available width:**
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
available_width = right_boundary - left_boundary - 2 * inner_sep
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Estimation — text width:** Approximate at 0.15cm per character for `\footnotesize`, 0.18cm for `\small`, 0.22cm for `\normalsize`. Multiply character count by the rate.
|
|
190
|
+
|
|
191
|
+
**Action:** Before writing any label, estimate its rendered width. If `text_width > available_width`, either:
|
|
192
|
+
- Shorten the text
|
|
193
|
+
- Use `text width=Xcm` with line breaks
|
|
194
|
+
- Reduce font size
|
|
195
|
+
- Increase the container
|
|
196
|
+
|
|
197
|
+
### Rule 7: Edge Labels Must Account for Arrow Curvature
|
|
198
|
+
|
|
199
|
+
**Problem:** `node[midway, above]` on a curved arrow places the label at the midpoint of the *chord*, not the midpoint of the *curve*. For high bend angles, this puts the label far from the actual arrow.
|
|
200
|
+
|
|
201
|
+
**Fix:** Use `node[pos=0.5, above]` (which TikZ evaluates along the curve path, not the chord) and add `sloped` if the arrow isn't horizontal. For very curved arrows, manually position with explicit coordinates computed from the depth formula (Rule 1).
|
|
202
|
+
|
|
203
|
+
**Example:**
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
% WRONG: Label floats away from a sharply curved arrow
|
|
207
|
+
\draw[->] (A) to[bend left=50] node[midway, above] {label} (B);
|
|
208
|
+
%
|
|
209
|
+
% RIGHT: Use pos= along the path and add sloped for angled segments
|
|
210
|
+
\draw[->] (A) to[bend left=50] node[pos=0.5, sloped, above] {label} (B);
|
|
211
|
+
%
|
|
212
|
+
% For extreme cases, compute the curve midpoint and place manually:
|
|
213
|
+
% midpoint_x = (x_A + x_B) / 2
|
|
214
|
+
% midpoint_y = (y_A + y_B) / 2 + depth (depth from Rule 1)
|
|
215
|
+
\node at (midpoint_x, midpoint_y + 0.3) {label};
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## Pass 4: Labels vs. Drawn Shapes — the Boundary Rule (Rule 8)
|
|
221
|
+
|
|
222
|
+
> Text placed at hardcoded coordinates that collide with the edge of a circle, rectangle, or filled region. The compiler gives zero warnings — these only show up visually.
|
|
223
|
+
|
|
224
|
+
### Rule 8: Every Label Near a Shape Must Clear Its Computed Boundary
|
|
225
|
+
|
|
226
|
+
**The rule:** Every label placed near a drawn geometric shape must have its coordinate verified against the shape's computed boundary. Never place text at a coordinate chosen for aesthetic alignment (e.g., "same y-height as another label") without checking whether that coordinate clears the shape it's near.
|
|
227
|
+
|
|
228
|
+
**For TikZ circles:** `\draw (cx, cy) circle (r);` → boundary extends from `cy - r` to `cy + r`. Any label must be at least **0.4cm** outside the boundary (if external) or at least **0.4cm** inside (if internal).
|
|
229
|
+
|
|
230
|
+
```
|
|
231
|
+
% WRONG — label at y=2.0 sits exactly on boundary of circle with center (4, 0.5) radius 1.5
|
|
232
|
+
\draw (4, 0.5) circle (1.5cm); % top edge at y = 0.5 + 1.5 = 2.0
|
|
233
|
+
\node at (4, 2.0) {Sample}; % COLLISION: y = top edge
|
|
234
|
+
|
|
235
|
+
% RIGHT — label 0.4cm above the top edge
|
|
236
|
+
\node at (4, 2.4) {Sample}; % 2.0 + 0.4 = 2.4 ✓
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**For TikZ rectangles:** bottom-left `(x, y)` with `minimum width` and `minimum height` → compute edges. Same 0.4cm clearance rule.
|
|
240
|
+
|
|
241
|
+
**For matplotlib `FancyBboxPatch` / `Circle`:** bottom-left `(x, y)` with width `w` and height `h` → top edge at `y + h`. When positioning `ax.text()` near patches, compute the patch boundary and verify clearance. Text with `va='center'` extends roughly half its font height above and below the anchor — account for this.
|
|
242
|
+
|
|
243
|
+
**Critical corollary — don't match coordinates across different shapes:** If two shapes have different sizes, a single y-coordinate that's safe for one may collide with the other. Always compute boundaries independently for each shape.
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Pass 5: General Structural Checks (Rules 9-10)
|
|
248
|
+
|
|
249
|
+
> Catch-all checks for common TikZ pitfalls.
|
|
250
|
+
|
|
251
|
+
### Rule 9: Node Anchors Must Be Consistent Within a Row/Column
|
|
252
|
+
|
|
253
|
+
**Problem:** Mixing `.center`, `.north`, `.south` anchors within the same visual row causes elements to appear misaligned vertically.
|
|
254
|
+
|
|
255
|
+
**Rule:** Within any visual row, use the same anchor for all nodes. Within any visual column, use the same anchor. When connecting to a node, specify the anchor explicitly (`A.east`, `B.west`) rather than relying on TikZ's automatic anchor selection.
|
|
256
|
+
|
|
257
|
+
**Example:**
|
|
258
|
+
|
|
259
|
+
```
|
|
260
|
+
% WRONG: Inconsistent anchors — nodes appear at different heights
|
|
261
|
+
\node (A) at (0,0) {Short};
|
|
262
|
+
\node[anchor=north] (B) at (3,0) {Tall text\\ two lines};
|
|
263
|
+
%
|
|
264
|
+
% RIGHT: Both use the same anchor
|
|
265
|
+
\node[anchor=center] (A) at (0,0) {Short};
|
|
266
|
+
\node[anchor=center] (B) at (3,0) {Tall text\\ two lines};
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Rule 10: Coordinate Arithmetic Must Be Verified for Every Placed Element
|
|
270
|
+
|
|
271
|
+
**Problem:** Copy-paste errors, wrong signs, or forgotten offsets silently place elements in wrong positions. Since LLMs cannot visually verify, every coordinate must be traceable to a formula.
|
|
272
|
+
|
|
273
|
+
**Rule:** For every `\node at (x,y)` or `\coordinate`, add a comment showing how `x` and `y` were derived:
|
|
274
|
+
|
|
275
|
+
```
|
|
276
|
+
% Column 1 at x=0, Column 2 at x=3.5 (col_width=3, gap=0.5)
|
|
277
|
+
% Row 1 at y=0, Row 2 at y=-2.5 (row_height=2, gap=0.5)
|
|
278
|
+
\node[draw] (A) at (0, 0) {Top Left};
|
|
279
|
+
\node[draw] (B) at (3.5, 0) {Top Right};
|
|
280
|
+
\node[draw] (C) at (0, -2.5) {Bottom Left};
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**Action:** After writing a TikZ diagram, re-derive every coordinate from the grid/layout formula. Flag any coordinate that can't be explained by the layout logic.
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## 6-Pass Verification Workflow
|
|
288
|
+
|
|
289
|
+
Run these passes **in order** after writing or editing any TikZ diagram or matplotlib figure:
|
|
290
|
+
|
|
291
|
+
| Pass | Rules | What to check | Stop condition |
|
|
292
|
+
|------|-------|---------------|----------------|
|
|
293
|
+
| **1. Bezier curves** | 1, 2, 3 | Compute depth for every `bend`/`in`/`out` (TikZ) or `arc3` (matplotlib). Check clearance against all nearby elements. | All curves have documented depths; no element within `depth + 0.3cm` of chord midpoint |
|
|
294
|
+
| **2. Gap calculations** | 4, 5 | Measure edge-to-edge distance for every adjacent pair. Check annotation rectangles. | All gaps meet minimums in Rule 4 table |
|
|
295
|
+
| **3. Label positioning** | 6, 7 | Estimate text width vs. available space. Verify edge labels account for curvature. | All labels fit; curved-arrow labels use `pos=` or manual placement |
|
|
296
|
+
| **4. Shape boundaries** | 8 | Verify every label near a circle/rectangle/patch clears its computed boundary by 0.4cm. | All labels have documented clearance from nearest shape edge |
|
|
297
|
+
| **5. Structural checks** | 9, 10 | Verify anchor consistency. Re-derive every coordinate from layout formula. | All anchors consistent; every coordinate has a comment |
|
|
298
|
+
| **6. Visual PDF review** | All | Compile and inspect rendered output (use `pdf-to-images.py` if available). | No overlaps, no misalignment, no clipped text |
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## Quick Reference: Bezier Depth Table
|
|
303
|
+
|
|
304
|
+
Pre-computed depths for common bend angles (per 1cm of chord):
|
|
305
|
+
|
|
306
|
+
| Bend angle | `tan(angle/2)` | Depth per cm of chord |
|
|
307
|
+
|-----------|----------------|----------------------|
|
|
308
|
+
| 15 | 0.1317 | 0.066 cm |
|
|
309
|
+
| 20 | 0.1763 | 0.088 cm |
|
|
310
|
+
| 25 | 0.2217 | 0.111 cm |
|
|
311
|
+
| 30 | 0.2679 | 0.134 cm |
|
|
312
|
+
| 35 | 0.3153 | 0.158 cm |
|
|
313
|
+
| 40 | 0.3640 | 0.182 cm |
|
|
314
|
+
| 45 | 0.4142 | 0.207 cm |
|
|
315
|
+
| 50 | 0.4663 | 0.233 cm |
|
|
316
|
+
| 60 | 0.5774 | 0.289 cm |
|
|
317
|
+
|
|
318
|
+
**Usage:** `depth = (chord / 2) * value_from_table`
|
|
319
|
+
|
|
320
|
+
Example: 8cm chord, bend=40 -> depth = 4 * 0.364 = 1.456cm
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## Matplotlib Extension: arc3 Bézier & Anchor-Based Centering
|
|
325
|
+
|
|
326
|
+
> These rules extend the TikZ principles to Python/matplotlib figures generated in Phase 3. The same "never eyeball, always compute" principle applies.
|
|
327
|
+
|
|
328
|
+
### Bézier-First for matplotlib Arrows
|
|
329
|
+
|
|
330
|
+
When labelling curved arrows using `connectionstyle='arc3,rad=R'`, compute the actual curve position before placing labels. The same "Claude cannot eyeball where a curve passes" rule from Pass 1 applies to Python figures.
|
|
331
|
+
|
|
332
|
+
**Control point formula:**
|
|
333
|
+
|
|
334
|
+
```python
|
|
335
|
+
# For ax.annotate with connectionstyle='arc3,rad=R':
|
|
336
|
+
# Start: (x1, y1), End: (x2, y2)
|
|
337
|
+
dx, dy = x2 - x1, y2 - y1
|
|
338
|
+
cx = (x1 + x2) / 2 + R * dy # control point x
|
|
339
|
+
cy = (y1 + y2) / 2 - R * dx # control point y
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
**To find where the curve passes at any point**, use the quadratic Bézier formula:
|
|
343
|
+
|
|
344
|
+
```
|
|
345
|
+
B(t) = (1-t)²·P0 + 2(1-t)t·P1 + t²·P2, t ∈ [0,1]
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
**Label placement workflow:**
|
|
349
|
+
1. Compute the control point using the formula above
|
|
350
|
+
2. Find t at the desired x-coordinate (numerical sampling)
|
|
351
|
+
3. Compute y(t) — this is where the curve actually passes
|
|
352
|
+
4. Offset the label perpendicular to the curve with a white-background bbox
|
|
353
|
+
|
|
354
|
+
**Label offset direction:**
|
|
355
|
+
- Arrow curves upward → label above (`va='bottom'`)
|
|
356
|
+
- Arrow curves downward → label below (`va='top'`)
|
|
357
|
+
- Arrow is straight → label above (`va='bottom'`)
|
|
358
|
+
|
|
359
|
+
### Anchor-Based Centering of Text Pairs
|
|
360
|
+
|
|
361
|
+
When multiple text elements (title + math, header + body) are placed inside a single container, do NOT use `va='center'` for both at symmetric y-offsets. Multi-line text extends further from its anchor than single-line text, creating visual asymmetry even when coordinates are symmetric.
|
|
362
|
+
|
|
363
|
+
**Instead, anchor both elements outward from the container's center:**
|
|
364
|
+
- Upper element: `va='bottom'` at `center_y + small_gap` (text grows upward)
|
|
365
|
+
- Lower element: `va='top'` at `center_y - small_gap` (text grows downward)
|
|
366
|
+
|
|
367
|
+
```python
|
|
368
|
+
# WRONG — symmetric coordinates but visually asymmetric
|
|
369
|
+
ax.text(x, box_mid_y + 0.7, 'Title\nLine 2', va='center', ...) # top-heavy
|
|
370
|
+
ax.text(x, box_mid_y - 0.7, r'$math$', va='center', ...) # too low
|
|
371
|
+
|
|
372
|
+
# RIGHT — anchor-based, text grows outward from center
|
|
373
|
+
ax.text(x, box_mid_y + 0.15, 'Title\nLine 2', va='bottom', ...) # grows UP
|
|
374
|
+
ax.text(x, box_mid_y - 0.15, r'$math$', va='top', ...) # grows DOWN
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### Helper Functions (Copy-Paste Template)
|
|
378
|
+
|
|
379
|
+
Include these at the top of any matplotlib script with curved arrows:
|
|
380
|
+
|
|
381
|
+
```python
|
|
382
|
+
import numpy as np
|
|
383
|
+
|
|
384
|
+
def arc3_control_point(x1, y1, x2, y2, rad):
|
|
385
|
+
"""Compute the quadratic Bézier control point for matplotlib's arc3."""
|
|
386
|
+
dx, dy = x2 - x1, y2 - y1
|
|
387
|
+
cx = (x1 + x2) / 2 + rad * dy
|
|
388
|
+
cy = (y1 + y2) / 2 - rad * dx
|
|
389
|
+
return cx, cy
|
|
390
|
+
|
|
391
|
+
def find_t_for_x(target_x, x1, cx, x2, num_samples=1000):
|
|
392
|
+
"""Find the Bézier parameter t where x(t) ≈ target_x."""
|
|
393
|
+
ts = np.linspace(0, 1, num_samples)
|
|
394
|
+
xs = (1 - ts)**2 * x1 + 2 * (1 - ts) * ts * cx + ts**2 * x2
|
|
395
|
+
return ts[np.argmin(np.abs(xs - target_x))]
|
|
396
|
+
|
|
397
|
+
def bezier_y_at_t(t, y1, cy, y2):
|
|
398
|
+
"""Y-coordinate of quadratic Bézier at parameter t."""
|
|
399
|
+
return (1 - t)**2 * y1 + 2 * (1 - t) * t * cy + t**2 * y2
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
**When to use:** Every time a matplotlib figure has `connectionstyle='arc3'` AND labels near those arrows.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Validation Tiers
|
|
2
|
+
|
|
3
|
+
> Shared reference for research projects. Declare the validation tier before proceeding with analysis. This determines claim strength, required sample sizes, and quality thresholds. Adapted from CommDAAF AgentAcademy protocol (Xu 2026).
|
|
4
|
+
|
|
5
|
+
## Principle
|
|
6
|
+
|
|
7
|
+
**Declare the tier before examining results.** This prevents scope creep (exploratory work masquerading as publication-ready) and under-investment (publication claims with pilot-level validation). The tier is locked at project initialisation and can only be upgraded through explicit re-declaration.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## The Three Tiers
|
|
12
|
+
|
|
13
|
+
| Tier | Label | Validation Required | Claim Strength | Time Investment |
|
|
14
|
+
|------|-------|-------------------|----------------|-----------------|
|
|
15
|
+
| 🟢 | **Exploratory** | Basic checks, robustness to obvious alternatives | Hypothesis-generating, suggestive | Hours to 1 day |
|
|
16
|
+
| 🟡 | **Pilot** | Sensitivity analysis, multiple specifications, spot-checks | Tentative conclusions, "warrants further investigation" | 1-3 days |
|
|
17
|
+
| 🔴 | **Publication** | Full robustness battery, pre-registration, replication, external validation | "Robust evidence", causal claims (if design supports) | 3+ days |
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## What Each Tier Requires
|
|
22
|
+
|
|
23
|
+
### 🟢 Exploratory
|
|
24
|
+
|
|
25
|
+
**Purpose:** Quick investigation, feasibility check, pattern discovery.
|
|
26
|
+
|
|
27
|
+
| Requirement | Standard |
|
|
28
|
+
|-------------|----------|
|
|
29
|
+
| Sample size | No minimum (but state N) |
|
|
30
|
+
| Robustness | At least 1 alternative specification |
|
|
31
|
+
| Standard errors | Correct level (clustered if panel) |
|
|
32
|
+
| Sensitivity | Not required |
|
|
33
|
+
| Pre-registration | Not required |
|
|
34
|
+
| Replication | Not required |
|
|
35
|
+
| Claim language | "suggests", "preliminary evidence", "initial exploration" |
|
|
36
|
+
|
|
37
|
+
**Escalation trigger:** If the user makes causal claims or says "we find that X causes Y" at exploratory tier → escalate to Level 2.
|
|
38
|
+
|
|
39
|
+
### 🟡 Pilot
|
|
40
|
+
|
|
41
|
+
**Purpose:** Serious investigation with enough rigour to guide next steps.
|
|
42
|
+
|
|
43
|
+
| Requirement | Standard |
|
|
44
|
+
|-------------|----------|
|
|
45
|
+
| Sample size | Justify based on method (power analysis encouraged) |
|
|
46
|
+
| Robustness | 3+ alternative specifications |
|
|
47
|
+
| Standard errors | Correct and justified |
|
|
48
|
+
| Sensitivity | Key parameter sensitivity (at minimum: functional form, sample restrictions) |
|
|
49
|
+
| Pre-registration | Encouraged |
|
|
50
|
+
| Replication | Internal (split-sample or bootstrap) |
|
|
51
|
+
| Claim language | "evidence consistent with", "findings warrant further investigation" |
|
|
52
|
+
|
|
53
|
+
**Escalation trigger:** If the user submits pilot-tier work to a top journal without upgrading → escalate to Level 3.
|
|
54
|
+
|
|
55
|
+
### 🔴 Publication
|
|
56
|
+
|
|
57
|
+
**Purpose:** Results intended for peer-reviewed publication.
|
|
58
|
+
|
|
59
|
+
| Requirement | Standard |
|
|
60
|
+
|-------------|----------|
|
|
61
|
+
| Sample size | Power analysis required (justify effect size assumption) |
|
|
62
|
+
| Robustness | Full battery: alternative DVs, specifications, samples, estimators |
|
|
63
|
+
| Standard errors | Multiple approaches compared (e.g., robust, clustered, wild bootstrap) |
|
|
64
|
+
| Sensitivity | Formal sensitivity analysis (Oster bounds, Rosenbaum bounds, or equivalent) |
|
|
65
|
+
| Pre-registration | Required for experiments; strongly encouraged for observational |
|
|
66
|
+
| Replication | Cross-language (if code-based) or cross-method |
|
|
67
|
+
| External validation | Where possible (out-of-sample, different dataset, different context) |
|
|
68
|
+
| Claim language | Must match identification strategy — no "effects" without causal design |
|
|
69
|
+
|
|
70
|
+
**Escalation trigger:** If any publication requirement is missing → escalate per the full [escalation protocol](escalation-protocol.md).
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## How to Declare
|
|
75
|
+
|
|
76
|
+
### At project initialisation (`/init-project-research`)
|
|
77
|
+
|
|
78
|
+
The tier is recorded in `.planning/state.md`:
|
|
79
|
+
|
|
80
|
+
```markdown
|
|
81
|
+
## Validation Tier
|
|
82
|
+
🟡 PILOT — sensitivity analysis + multiple specifications required
|
|
83
|
+
Declared: 2026-03-15
|
|
84
|
+
Rationale: Conference paper for CORE A venue, not yet targeting journal
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Mid-project upgrade
|
|
88
|
+
|
|
89
|
+
To upgrade tier (e.g., exploratory → publication):
|
|
90
|
+
|
|
91
|
+
1. State the new tier and why
|
|
92
|
+
2. Review existing work against the new tier's requirements
|
|
93
|
+
3. List what additional validation is needed
|
|
94
|
+
4. Update `.planning/state.md`
|
|
95
|
+
|
|
96
|
+
Downgrades are also legitimate: "We're cutting scope to exploratory for this conference deadline."
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Integration with Existing Systems
|
|
101
|
+
|
|
102
|
+
| System | How tiers interact |
|
|
103
|
+
|--------|-------------------|
|
|
104
|
+
| **Severity gradient** (`severity-gradient` rule) | Tier maps to phase: Exploratory ≈ Discovery, Pilot ≈ Drafting, Publication ≈ Pre-submission |
|
|
105
|
+
| **Escalation protocol** (`escalation-protocol.md`) | Tiers define what triggers escalation — exploratory has a longer leash |
|
|
106
|
+
| **Design-before-results** rule | Applies at all tiers, but strictness scales: exploratory allows iteration, publication requires pre-commitment |
|
|
107
|
+
| **Method probing** (`method-probing-questions.md`) | All tiers require answering probing questions; the depth of acceptable answers varies |
|
|
108
|
+
| **Review agents** | `referee2-reviewer` calibrates expectations to declared tier |
|
|
109
|
+
| **Quality scoring** | Thresholds from severity-gradient: 60 (exploratory), 70 (pilot), 90 (publication) |
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Anti-Patterns
|
|
114
|
+
|
|
115
|
+
| Anti-Pattern | Why It's Wrong | Correct Approach |
|
|
116
|
+
|-------------|----------------|------------------|
|
|
117
|
+
| No tier declared | Defaults create confusion — exploratory work gets judged as publication | Always declare at start |
|
|
118
|
+
| "Exploratory" with causal claims | Claim strength exceeds validation level | Either upgrade tier or soften claims |
|
|
119
|
+
| "Publication" with no sensitivity analysis | Missing a core requirement | Add sensitivity before submitting |
|
|
120
|
+
| Upgrading tier after seeing results | Post-hoc rationalisation | Tier must be declared before results |
|
|
121
|
+
| Same tier for all projects | One size doesn't fit all | Match tier to actual goals |
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Venue Guides — Shared Resource
|
|
2
|
+
|
|
3
|
+
Writing style guides, reviewer expectations, and formatting requirements for academic publication venues. Used by multiple skills and agents.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
### Writing Style Guides
|
|
8
|
+
| File | Covers |
|
|
9
|
+
|------|--------|
|
|
10
|
+
| `venue_writing_styles.md` | Master overview — style spectrum, quick reference, adaptation tips |
|
|
11
|
+
| `nature_science_style.md` | Nature, Science, PNAS — accessibility, storytelling, broad impact |
|
|
12
|
+
| `cell_press_style.md` | Cell, Neuron, Immunity — graphical abstracts, eTOC, Highlights |
|
|
13
|
+
| `medical_journal_styles.md` | NEJM, Lancet, JAMA, BMJ — structured abstracts, evidence language |
|
|
14
|
+
| `ml_conference_style.md` | NeurIPS, ICML, ICLR, CVPR — contribution bullets, ablations |
|
|
15
|
+
| `cs_conference_style.md` | ACL, EMNLP, CHI, SIGKDD — field-specific conventions |
|
|
16
|
+
|
|
17
|
+
### Reviewer Expectations
|
|
18
|
+
| File | Covers |
|
|
19
|
+
|------|--------|
|
|
20
|
+
| `reviewer_expectations.md` | What reviewers prioritise at each venue type, common rejection reasons, rebuttal strategies |
|
|
21
|
+
|
|
22
|
+
### Formatting Requirements
|
|
23
|
+
| File | Covers |
|
|
24
|
+
|------|--------|
|
|
25
|
+
| `journals_formatting.md` | Page limits, citation styles, figure requirements for 50+ journals |
|
|
26
|
+
| `conferences_formatting.md` | Conference paper specifications (NeurIPS, ICML, CHI, etc.) |
|
|
27
|
+
|
|
28
|
+
### Writing Examples (`examples/`)
|
|
29
|
+
| File | Shows |
|
|
30
|
+
|------|-------|
|
|
31
|
+
| `nature_abstract_examples.md` | Flowing paragraph abstracts for high-impact journals |
|
|
32
|
+
| `neurips_introduction_example.md` | ML conference intro with contribution bullets |
|
|
33
|
+
| `cell_summary_example.md` | Cell Press Summary, Highlights, eTOC format |
|
|
34
|
+
| `medical_structured_abstract.md` | NEJM, Lancet, JAMA structured abstract format |
|
|
35
|
+
|
|
36
|
+
## Consumers
|
|
37
|
+
|
|
38
|
+
| Skill / Agent | What it uses |
|
|
39
|
+
|---------------|-------------|
|
|
40
|
+
| `/retarget-journal` | Formatting requirements + writing style when switching venues |
|
|
41
|
+
| `paper-critic` agent | Reviewer expectations when evaluating paper quality |
|
|
42
|
+
| `referee2-reviewer` agent | Reviewer expectations for venue-appropriate critique |
|
|
43
|
+
|
|
44
|
+
## Origin
|
|
45
|
+
|
|
46
|
+
Extracted from the venue-templates skill (K-Dense Inc., MIT license). US grant templates (NSF, NIH, DOE, DARPA) and poster guidelines were excluded — grants are not relevant to UK-based research, and posters are covered by `/latex-posters`.
|