Product manual (generated)
metaproc — Product Manual & Feature Inventory
Section titled “metaproc — Product Manual & Feature Inventory”Last reviewed against source on 2026-05-31 (commit 82f983a). This is a factual
inventory generated by reading every R module; companion document
CODE_REFERENCE.md reproduces the exact R code behind every
model, figure, and graphic for correctness auditing.
1. What metaproc is
Section titled “1. What metaproc is”A button-driven application for frequentist meta-analysis, in the browser or on the desktop, built as an R Shiny app (golem package, bslib/Bootstrap 5 UI). It is button-driven and template-based — the intended user is a researcher, not an R programmer.
The defining principle — “SAS-like” reproducible code capture
Section titled “The defining principle — “SAS-like” reproducible code capture”Every model, table, figure, and graphic in the app is produced by building R
code as text from the user’s choices, evaluating that exact text, and displaying
the same text in a copyable code panel. What you see in the “R code” panel is —
by construction — what actually ran. This is implemented uniformly: each template
has a build_code() generator that returns a $display string (shown) and a
$model string (evaluated); the two are assembled from the same pieces. See
CODE_REFERENCE.md for the verbatim generators. The only outputs not governed
by a user-visible code panel are the four appraisal/QC computations noted in §6.4
and the in-app diagnostic helper panels (heterogeneity panel, interpretation,
caveats) which are rendered HTML summaries rather than re-runnable code.
Engines (all frequentist)
Section titled “Engines (all frequentist)”| Purpose | Package | Where |
|---|---|---|
| Pairwise pooling, diagnostics, 3-level | metafor (escalc, rma, rma.mh, rma.peto, rma.glmm, rma.mv) | Templates, Pipeline |
| Network meta-analysis | netmeta (pairwise, netmeta) | Network |
| Risk-of-bias figures | robvis | Appraise → Risk of bias |
| Effect-size conversion | esc | Tools → Converter |
| Report rendering | rmarkdown (+ Quarto’s bundled pandoc) | Report |
| Power, GRADE, SWiM, PRISMA | base R (hand-implemented formulas / base graphics) | various |
Note: the meta package is a locked dependency but pairwise pooling stays on metafor. Mantel-Haenszel / Peto are done via metafor’s
rma.mh/rma.peto.
Accessibility & UX
Section titled “Accessibility & UX”Motion (inter-tab transitions, plot-render shimmer loaders, value-box count-up) is gated behind
prefers-reduced-motion. Icon-only controls and the ⓘ info-tips carry ARIA labels and are
keyboard-operable (Enter/Space); slide-out panels are role="dialog"; focus shows a consistent
:focus-visible ring. Body text meets WCAG-AA contrast on the Orbital theme. A navbar
colourblind-safe switch swaps the plot palette — the static forest (study squares/CIs) and
funnel contour shading, the ggiraph forest/funnel, the EDA plots (distributions / missingness /
correlations / by-group / scatter), SWiM harvest, PRISMA flow, and leave-one-out — to the Okabe–Ito set. A navbar light/dark toggle recolours the entire UI (page canvas, sidebars, cards, panels, tables, chips, inputs) via a scoped [data-bs-theme="dark"] palette with a reduced-motion-safe crossfade, while plots keep a white publication “paper”; the UI font is a modern sans-serif with a robust offline fallback (never a browser serif). (A full axe/Lighthouse + screen-reader audit is still recommended.) A first-run guided
tour (Import → EDA → Templates → Report; dismissible, re-openable from Help) and one-click worked
examples ease new users in.
2. Navigation map (exact, in order)
Section titled “2. Navigation map (exact, in order)”From app_ui.R (bslib::page_navbar, id main_nav). The clickable title returns
to Home.
| # | Item | Type | Module |
|---|---|---|---|
| 1 | Home | panel | mod_home |
| 2 | Data | panel | mod_data_import |
| 3 | Combine | panel | mod_combine |
| 4 | Plan | panel | mod_planner |
| 5 | EDA | panel | mod_eda |
| 6 | Templates | panel | mod_templates |
| 7 | Network | panel | mod_network |
| 8 | Pipeline | panel | mod_pipeline |
| 9 | Appraise ▾ | menu | Risk of bias (mod_rob), GRADE (mod_grade), SWiM (mod_swim) |
| 10 | Report ▾ | menu | Reproducible report (mod_report), PRISMA 2020 flow (mod_prisma) |
| 11 | Tools ▾ | menu | Effect-size converter (mod_esc), Power analysis (mod_power) |
| 12 | Workspace | button | toggles the slide-out dataset switcher |
| 13 | Guide | panel | mod_guide |
| 14 | About | panel | mod_landing |
| 15 | Help | link | quick-help modal |
Global chrome: floating zoom/scale control (root-rem based, persists in
localStorage); slide-out Workspace panel listing every loaded file/sheet with
row×col counts (click to switch active dataset app-wide); slide-out glossary
info-panel (102 plain-language term definitions opened by ⓘ icons — the most-used deepened with worked examples + cautions; ~76 placed
across tabs); scroll-down cue; keyboard nav (Ctrl+←/→ cycle tabs, Backspace
back / Shift+Backspace forward).
Theme (app_theme.R + inst/app/www/custom.css): Bootstrap 5 in the “Orbital”
brand (teal → emerald; see C:\dev\metaproc-deploy\design\BRAND.md, the locked source of
truth). Primary is an AA-safe deep teal #0A7A68; secondary a muted slate #5B6877;
amber-deep #D97706 is the on-brand warning accent. The default warm-light mood uses a
warm parchment canvas #F3F0E9 (deliberately never pure white) with soft teal/emerald radial
tints and a dark blue-slate ink #19222C; the navbar light/dark toggle switches to deep
dusk (canvas #060A11, dusk surfaces #141C25/#18222B) scoped under
[data-bs-theme="dark"]. Two mood-paired accents (shared amber + a partner — violet in dusk,
coral in light) carry active-state and informational highlights. Code/results panels stay a
dark navy (#0D141B bg, teal-tinted #9FE8DC text) in both moods as a contrast anchor.
Fonts Inter (UI + headings) + IBM Plex Mono (code). All decorative motion respects
prefers-reduced-motion and the in-app Motion toggle. The plot palette (mp_plot_palette())
follows suit — teal #0E9F8E / deep teal #0A7A68 / amber #E08A00 — while the
colourblind-safe Okabe–Ito palette is unchanged.
3. Data lifecycle features
Section titled “3. Data lifecycle features”3.1 Data tab (mod_data_import)
Section titled “3.1 Data tab (mod_data_import)”Exists:
- Upload CSV / XLS / XLSX, or load a bundled example (
example_pairwise.csv). - Multi-sheet Excel: every worksheet is read and added to the Workspace under
the key
"<file> — <sheet>"; switchable from the Workspace panel or the in-tab picker. - Automatic header detection for extraction-template workbooks
(
mp_detect_header): scans the first 12 rows, picks the row with the most filled cells as the header, and detects a following “instructions/type” row (Dropdown:/Integer/e.g.…) to drop. Manual override controls: “Header is on row”, “Drop rows after header”, “Auto-detect” — per sheet. - Junk-column drop (readxl
...Nauto-names) and blank-row drop. - Value boxes: rows / columns / missing values.
- DT preview rendered fresh per dataset (survives 0-row sheets and column-count changes); per-column filters when ≤40 columns; horizontal scroll for wide sheets.
- Data-overview histogram/barplot of any column + its plot code.
- Duplicate study-ID detection (unit-of-analysis warning).
- Biological-range checks (see §7) and Consistency rules builder (see §7),
both with reproducible code, both toggleable via
qc.yml. - Import code panel (exact
read.csv/read_excel(...)shown); Clear button; CSV download of the active dataset. - Edit / clean data card: an editable grid (cell edits coerce to the column type and
write back to the active dataset), per-column retype (numeric/integer/character/factor)
- rename, and row include/exclude (drops rows so EDA/Templates see fewer) — each emitting its exact R (code-capture). Degrades safely on 0-row and very wide sheets.
Does NOT exist: flip/transpose; paste-from-clipboard import;
database/URL/API import; .sav/.dta/.RData import; encoding selection.
3.2 Combine tab (mod_combine)
Section titled “3.2 Combine tab (mod_combine)”Exists: join columns across worksheets into one analysis table — base sheet +
merge-in sheets; auto-detected, user-editable join keys (from a key vocabulary:
study_id, intervention, arm, timepoint…); left / inner / full join;
per-sheet key + column pickers; grain guard (warns when a repeated-measure
column is not a key and offers “Add to key”); filter-before-join (closest /
max / min / first-non-missing per group) to prevent fan-out; fan-out warning
naming the inflating IDs; colliding columns prefixed by sheet name; generated
merge() code; CSV download; “Use as active dataset”. A Combine mode toggle also offers
stack / row-bind (concatenate studies: union of columns, missing filled NA, a .source
origin column) with its generated code.
Does NOT exist: fuzzy/approximate key matching; many-to-many resolution beyond the filter rules.
3.3 EDA tab (mod_eda)
Section titled “3.3 EDA tab (mod_eda)”Exists, six views, each with its plot R code: Summary (per-variable
type/N/missing/unique/mean/SD/min/median/max DT); Distributions (histogram with
bins slider + log10 toggle; numeric-looking text auto-coerced; barplot for
categoricals); Missingness (per-column missing bar); Correlations
(Pearson/Spearman heatmap with cell values); By group (boxplot by a categorical);
Scatter (with optional lm trend line, plus an opt-in Interactive ggiraph hover
view). All plots are resizable (drag a corner) and full-screen-expandable (⛶); in-plot fonts scale with the panel/zoom size and render in sans-serif.
Does NOT exist: outlier tests, normality tests, time-series/longitudinal EDA, pairs-plot matrix, interactive hover on views other than Scatter, export of EDA plots as files (EDA plots are on-screen only; only their code is copyable).
4. Analysis templates (Templates tab, mod_templates + fct_templates)
Section titled “4. Analysis templates (Templates tab, mod_templates + fct_templates)”Eleven config-driven templates. Each declares column roles (auto-guessed from names, user-mappable) and options, then generates + runs metafor code.
| # | Template | Effect measures | Pooling / model specials |
|---|---|---|---|
| 1 | Pairwise — binary (2×2) | RR (default), OR, RD | Inverse-variance / Mantel-Haenszel / Peto; flip direction; zero-cell warning |
| 2 | Pairwise — continuous | SMD (default, Hedges’ g), MD, ROM | flip direction |
| 3 | Single-group proportion | PLO logit+CC (default), GLMM (no CC), Freeman-Tukey PFT, raw PR | boundary-rate switch to GLMM |
| 4 | Correlation | Fisher’s z (ZCOR) | — |
| 5 | Pre-computed (yi/SE) | none / exp display transform | — |
| 6 | Single-group incidence rate | IRLN (default), IR | — |
| 7 | Single-group mean | MN (default), MNLN | — |
| 8 | Three-level (rma.mv) | none / exp | nested random effects; REML/ML only (no Knapp-Hartung); opt-in cluster-robust SEs (RVE: CR2 + Satterthwaite df, clubSandwich) |
| 9 | Time-to-event — hazard ratio (HR) | log-HR + SE → HR (exp, null = 1) | pools per-study log-HR + SE; pair with the HR converter for reported HR + 95% CI |
| 10 | Two-group incidence-rate ratio (IRR) | IRR (exp, null = 1) | event counts + person-time per group via escalc("IRR") |
| 11 | Change from baseline (pre/post) | MC (raw) / SMCC (standardized) | change-score SD from an imputed, flagged pre-post correlation ri (+ sensitivity note) |
Shared model options (all templates except the three-level model): τ² estimator — REML (default), Paule-Mandel, DerSimonian-Laird, ML, Empirical Bayes, Sidik-Jonkman, or common-effect (FE); Knapp-Hartung adjustment (default ON, auto-greyed under the common-effect/FE model where it has no role); confidence level.
Per-run outputs (all exist):
- Value boxes: pooled estimate + CI (back-transformed), I², k.
- Forest plot tab — interactive controls: prediction interval on/off (default
on), sort (default / effect size / precision), custom x-axis label; the live
forest()call is shown; export PNG / PDF / SVG. An Interactive toggle (default off) adds a ggiraph (SVG) forest with per-study hover tooltips (study, estimate, CI, weight); the static metafor plot + its code stay the default/export. - Funnel plot tab (contour-enhanced); same opt-in Interactive (ggiraph) hover view.
- Heterogeneity panel: K, total N, Cochran’s Q (df, p), I² with 95% CI, τ² with 95% CI, τ, H², 95% prediction interval.
- Per-study estimates table (Study, Estimate, CI, Weight %) + CSV download.
- Plain-language interpretation (effect, significance vs null, heterogeneity band, caveat).
- Copyable plain-text results summary.
- Exact R code panel + verbatim
summary(fit)(the binary template’s code documents metafor’s default continuity correction,add = 1/2, to = "only0"). - Caveat banners: zero/full-cell continuity correction, k<5 prediction interval, “judge heterogeneity from Q+I²+τ²+PI together”.
- Weight-dominance notice (any study ≥ 50% weight; threshold in
diagnostics.yml). - Subgroup analysis (optional): pick a categorical column and re-run → the forest plot
regroups by subgroup with a pooled summary diamond per group (per-group
rma) plus the overall diamond, and a panel reports therma(mods=~g)Q-between test + per-subgroup estimates (IV templates only; the forest subtotals and the panel use the same per-grouprma, so they agree). - Multi-arm handling: detects sub-arms (suffix / repeated id / flag column) and offers pool-within-study / independent / three-level.
- Boundary-proportion switch: 0%/100% rates → one-click switch to GLMM.
- Clinical translation (binary RR/OR): NNT/NNH + absolute effects (“X fewer/more per 1000”) from a user-entered baseline risk, with CIs and the exact R (code-capture).
- L’Abbé plot (binary): each study’s treatment-arm vs control-arm risk; shown code + PNG export.
Robustness & diagnostics card (all exist): leave-one-out (table + dot plot), influence diagnostics (Cook’s distance, DFFITS, std. residual, influential flag), exclude-large-studies sensitivity (n > 10× median, configurable).
Templates does NOT include: Hartung-Knapp modified SE variants beyond test="knha";
arcsine/other proportion transforms beyond the four listed; dose-response or
multivariate/multiple-outcome models (beyond 3-level + the opt-in RVE); Bayesian estimation;
prediction-interval method choice (uses metafor default).
5. Other analysis surfaces
Section titled “5. Other analysis surfaces”5.1 Network meta-analysis (mod_network, netmeta)
Section titled “5.1 Network meta-analysis (mod_network, netmeta)”Exists: arm-level data → pairwise() → netmeta(); outcome type binary
(OR/RR) or continuous (SMD/MD); reference-treatment picker (auto-prefers
placebo/control); network plot, forest vs reference, summary, league
table, P-score rankings, net-split (direct vs indirect inconsistency),
comparison-adjusted funnel; exports network PNG / forest PNG / league CSV;
exact R code panel; bundled example_network.csv.
Does NOT exist: Bayesian NMA; node-splitting beyond netsplit; SUCRA plots
(P-scores only, shown as text); network meta-regression; component NMA;
ranking-probability rankograms; design-by-treatment interaction model.
5.2 Pipeline (mod_pipeline + fct_pipeline)
Section titled “5.2 Pipeline (mod_pipeline + fct_pipeline)”Exists: a 3-step builder — set base analysis (pairwise-binary mapping +
measure/model), drag components into an ordered pipeline, configure each, Run;
each step emits its own modular R code + text output + plot in order. Ten step
types: Primary, Subgroup, Meta-regression (+bubble/regplot), Multivariable
meta-regression (≥2 moderators / interactions + seeded permutest), Publication
bias (funnel + small-study tests: Peters/Harbord auto-selected for OR/RR, Egger
elsewhere; Begg shown), Cumulative (cumul), Leave-one-out, Influence diagnostics,
Trim-and-fill (trimfill), Baujat.
Limitations: the pipeline base is hard-wired to the pairwise-binary
template (mod_pipeline.R:81) — it always uses 2×2 event/total mapping and the
binary escalc, regardless of what the Templates tab is set to. Continuous /
proportion / etc. pipelines are not available here. Steps run against the base
es/fit; there is no branching or conditional flow.
5.3 Appraise menu
Section titled “5.3 Appraise menu”- Risk of bias (
mod_rob, robvis): RoB 2 / ROBINS-I / QUADAS-2; editable per-domain judgement dropdowns; traffic-light + summary plots; PNG export. Domains are genericD1..Dn(5/7/4) — not the named domain labels of each instrument. - GRADE (
mod_grade): start High (RCT) / Low (observational); five downgrade factors + three upgrade factors (obs only); certainty computed by arithmetic clamp to Very low/Low/Moderate/High; value-box rating + factor table + the arithmetic shown as code. Plus a Cochrane-style Summary-of-Findings row populated from the live analysis (rv$analysis): relative + absolute effect (per 1000, from a baseline rate) + k + N + I² + the certainty rating. - SWiM (
mod_swim): editable per-study effect-direction table (4 directions); vote counting; harvest barplot; vote-count code shown.
Appraisal does NOT include: RoB instrument-specific domain prompts/signalling questions; automatic RoB import from data; ROB-ME / ROBIS / AMSTAR; SWiM weighting beyond simple vote counts.
5.4 Report (mod_report)
Section titled “5.4 Report (mod_report)”Exists: a real rmarkdown report built from the last Templates run (rv$analysis),
output as HTML (default), PDF, or R Markdown (.Rmd) source via a format selector (the
choice persists in rv$report_format). Selectable sections: Methods, PRISMA-flow bullets,
included-studies table, pooled result (summary), forest plot, heterogeneity + prediction
interval, reproducible R code, software/package citations. Uses Quarto’s bundled pandoc
if none is on PATH; PDF renders via TinyTeX (one-time install, graceful fall-back to HTML if
no LaTeX). Render errors are surfaced in the UI (notification + status alert), never a silent
hang. DPI 120; error-tolerant chunks. The HTML report is fully self-contained and offline —
assets are embedded and MathJax is disabled (mathjax: null; the report uses no LaTeX math), so it
opens with no internet connection. The .Rmd download bundles a sibling -data.rds so it
re-renders as-is. A Download reproducibility bundle button on the same tab produces a .zip
— a runnable analysis.R, the dataset.csv it reads, the .Rmd, sessionInfo(), renv.lock
(exact versions), and a README — that re-runs in a clean R session and reproduces the pooled estimate.
Does NOT exist / important gaps:
- No Word (.docx) output — HTML, PDF, and
.Rmdsource are supported; Word is not. - The report’s PRISMA section is text bullets from manually typed counts; it
does not embed the
mod_prismadiagram. - Report covers the pairwise Templates analysis only — it does not pull in Network, RoB, GRADE, SWiM, or pipeline results.
- Requires a Templates run first (no report without
rv$analysis).
5.5 PRISMA 2020 flow (mod_prisma)
Section titled “5.5 PRISMA 2020 flow (mod_prisma)”Exists: a PRISMA-style flow diagram drawn with base R graphics; counts auto-derived from screening/inclusion columns in the loaded data (inclusion flag, exclusion-reason, screening-stage, identified-count), with editable node labels; “included” and “reports-excluded” boxes are computed live; excluded-reasons list; PNG / SVG export.
Does NOT exist: uses base-graphics boxes, not the official PRISMA2020 /
DiagrammeR template; the screening-excluded box is wired to the editable text input,
not the data-computed split (see CODE_REFERENCE.md §13 for the exact wiring);
not embedded in the HTML report.
5.6 Tools menu
Section titled “5.6 Tools menu”- Effect-size converter (
mod_esc, esc + closed-form): 12 conversions → effect + SE- exact code — group means/SDs/Ns, independent t, one-way F (2 groups), χ²(df=1),
2×2 table, point-biserial r, unstandardized B, standardized β, two proportions, and
(Phase 8) HR + 95% CI → log-HR + SE (Tierney 2007), median/IQR/range → mean & SD
(Wan 2014 / Luo 2018; three scenarios), and a cluster-RCT design-effect adjustment
(SE inflated by √DEff, DEff = 1+(m−1)·ICC). Inputs are validated (clear message on a
bad CI ordering / out-of-range ICC).
All but the 2×2 and proportions return Hedges’ g (
es.type="g").
- exact code — group means/SDs/Ns, independent t, one-way F (2 groups), χ²(df=1),
2×2 table, point-biserial r, unstandardized B, standardized β, two proportions, and
(Phase 8) HR + 95% CI → log-HR + SE (Tierney 2007), median/IQR/range → mean & SD
(Wan 2014 / Luo 2018; three scenarios), and a cluster-RCT design-effect adjustment
(SE inflated by √DEff, DEff = 1+(m−1)·ICC). Inputs are validated (clear message on a
bad CI ordering / out-of-range ICC).
All but the 2×2 and proportions return Hedges’ g (
- A-priori power (
mod_power): power for random-effects vs common-effect models given K / N-per-group / expected SMD / heterogeneity band / α, plus a power-vs-K curve with an 80% target line. Formulas hand-implemented (no dmetar): the heterogeneity band sets τ² = v * I²/(1 - I²) (the exact I² inversion → variance inflation 1/(1 - I²), shown in-panel) — more conservative than dmetar’s fixed 1.33/1.67/2.0 multipliers at higher I².
Tools does NOT include: sample-size/MDES solving (power is forward-only, no inversion to required K); converter coverage of log-rank O−E/V → log-HR, or correlation-matrix conversions (HR + 95% CI, medians/IQR/range → mean & SD, and the cluster design-effect SE adjustment are now covered — see above).
5.7 Plan wizard (mod_planner) and Guide (mod_guide)
Section titled “5.7 Plan wizard (mod_planner) and Guide (mod_guide)”- Plan: PICO inputs + a questionnaire (design, data type, structure, rare
events, dependence, moderators, k) →
mp_recommend()returns a recommended template, effect measure, model (random-effects; Knapp-Hartung when k<10), pooling (MH/Peto for rare events), a suggested pipeline, and caveats; “Apply & go” pre-selects the template on the Templates tab. - Guide: a PICO analysis picker and per-analysis walkthroughs that display the real generated code for 8 analyses; a “Your first meta-analysis in 5 steps” walkthrough; and one-click worked examples (binary / continuous / proportion / network) that load a bundled dataset and run it so you land on a populated result.
These are advisory/navigational — Plan/Guide do not themselves fit models, but the worked-example buttons drive a real analysis on Templates/Network.
5.8 Review progress stepper (Home)
Section titled “5.8 Review progress stepper (Home)”A slim horizontal pipeline on the Home tab — Protocol → Data → Analyses → GRADE →
Report — that shows, at a glance, how far the current review has progressed. It is
purely additive and read-only: the status is derived from the existing in-session
stores (no new persistent state, no computation), so it changes no analysis numbers
and is golden-safe. The strip persists with a project .rds exactly as much as the
session state it reflects.
- Status derivation lives in
mp_stepper_status()(fct_stepper.R), a pure function (no Shiny) that reads the same state the Summary-of-Findings table does: the review protocol (Plan), the active data, the outcomes list, the workflow store, per-outcome GRADE ratings, and the report blocks. Each step resolves to one of done / now (the single active frontier) / todo, plus a short status line — e.g. “Scope set”, “28 studies · 3 outcomes”, “2 of 3 run”, “1 of 3 rated”, “Not started”. With no outcomes defined yet, Analyses degrades to “any analysis run?” and GRADE reads “Needs outcomes”. - Navigation: each step is a real
<button>that jumps to its tab (Protocol → Plan, Analyses → Templates, etc.) via the same Homegotopath every other Home button uses, so it reaches menu-nested panes (GRADE, Report) by their stable pane value. - Styling / a11y (
.mp-stepperincustom.css, Orbital skin): brand-gradient done dots and connectors, an amber active dot with a beating glow ring; per-steparia-labelcarrying the status,aria-current="step"on the active step, the shared:focus-visiblering, and every animation disabled underprefers-reduced-motion.
5.9 Recent projects (Home, on-device)
Section titled “5.9 Recent projects (Home, on-device)”A “pick up where you left off” list on the Home tab — saved/opened projects shown
as cards (a hexagonal initial badge, the project name, a meta line, and a relative
time). It is client-side only (decision B4 option (a)): the list lives in the
browser’s localStorage under mp-recent-projects, never on the server, so it
adds no data-at-rest, no backups, and no privacy-policy obligations. The card
carries the honest limitation in its copy and an explicit privacy line — “Stored
only in this browser — never uploaded to the server.” (the same wording the portal
uses; the two share this localStorage key, which the portal reads read-only).
- What gets recorded — after a successful project save or load,
mod_homesends the client a small metadata record viasession$sendCustomMessage("mp-recent-project", …): the project name (the review protocol’s title if set, else the active dataset, else a generic fallback), the study count k (rows of the active data), the analysis kind (the latest analysis item’s measure label, when known), and an ISO-8601 timestamp. The record is built by the puremp_recent_project_meta()(fct_recents.R) from cheap reads of existing in-session state — no model is fitted and the save/load logic itself is not touched; the notification is appended only after success, so a rejected (foreign).rdsrecords nothing. - The list (
metaproc.js) — keeps the newest 8 entries, newest first, deduped by name (case-insensitive). Because a browser cannot re-read a file path (a hard security boundary), clicking a recent card re-opens the existing Load project file dialog (a real.click()on the file input, inside the user gesture) and shows a small hint — “Re-select.rds” — so reopening is one click but the user still chooses the file. A clean empty state shows when the list is empty, and a server-rendered fallback keeps the card sensible without JS. - Scope — purely additive chrome; it works identically in desktop and web
mode (no
METAPROC_MODEgating) and changes no analysis numbers (golden-safe). - Styling / a11y (
.mp-recent-*incustom.css, Orbital skin): each card is a real<button>(so it carries the shared ripple and:focus-visiblering) with a descriptivearia-label; the hint toast is anaria-livestatus; the hexagonal badge is the brand mark’s shape (decorative,aria-hidden); colours ride on--mp-*tokens so the card reads in both warm-light and deep-dusk, and all motion is disabled underprefers-reduced-motion.
6. Real-world data robustness (the Phase 4 batch)
Section titled “6. Real-world data robustness (the Phase 4 batch)”All fixture-validated against a real extraction workbook
(tests/fixtures/eans_iih_extraction.xlsx).
- Combine grain guard + refinement-key suggestion + filter-before-join (§3.2).
- Multi-arm / sub-arm detection and three pooling modes (§4).
- Weight-dominance notice + leave-one-out / influence / exclude-large (§4).
- Boundary proportions — 0%/100% → logit-CC / GLMM / Freeman-Tukey switch (§4).
- Biological-range checks — a 30-variable clinical registry
(
biological_ranges.R): per-cell value-vs-typical-range (warning) and value-vs-possible-range (error) flags, to catch unit mismatches / data-entry errors (e.g. cmH₂O vs mmHg). Toggle inqc.yml. - Configurable consistency rules (
fct_consistency.R): a rule engine with four rule types —sum_eq_total,sum_le_total,le,range— a starter library, in-app authoring, a violations panel, YAML export, and rules saved with the project. Reproducible per-rule code shown. Toggle inqc.yml. - PRISMA 2020 flow generated from screening/inclusion data (§5.5).
- Regression test (14 assertions across items 1–7) + glossary terms.
7. Configuration (user-extensible without editing source)
Section titled “7. Configuration (user-extensible without editing source)”inst/config/:
diagnostics.yml—weight_dominance_threshold(0.5),large_study_multiplier(10).grain_keys.yml— glob patterns identifying repeated-measure columns for the Combine grain guard (timepoint*, _months, visit, followup*, …).qc.yml—enable_biological_ranges,enable_consistency_rules.
The biological-range registry (biological_ranges.R) and consistency starter
templates (fct_consistency.R) are R data structures intended to be extended.
Multi-arm flag columns are read from a multiarm config with a code default.
8. Project / workspace persistence
Section titled “8. Project / workspace persistence”- Save project →
.rdscontaining all datasets, the active dataset, and the consistency rules. - Load project / New project.
- Every loaded file/sheet is remembered in the Workspace and switchable app-wide.
Does NOT persist: per-template analysis configuration (mappings/options), pipeline definitions, RoB/GRADE/SWiM/PRISMA entries, or generated reports — saving stores the data + rules, not the analysis state.
9. What metaproc is currently missing (consolidated gap list)
Section titled “9. What metaproc is currently missing (consolidated gap list)”Packaging / distribution
- Not yet an installable desktop binary — runs from R via
shiny::runApp(run_app()). Electron shell + bundled R/packages is the planned-but-unbuilt Phase 5. - Dev workflow (
golem::run_dev) needs devtools/pkgload/roxygen2 not in the renv lock.
Statistical scope
- Frequentist only — no Bayesian pairwise or network MA.
- No diagnostic test-accuracy meta-analysis (bivariate/HSROC).
- No dose-response, multivariate/multiple-outcome (beyond 3-level), or IPD meta-analysis.
- No robust/cluster-variance (RVE) one-click option.
- Pipeline is locked to the binary base template (no continuous/proportion pipelines).
- No Trial Sequential Analysis / required information size (sequential monitoring of whether the evidence base is yet conclusive).
Reporting
- Report is HTML only (no PDF/Word).
- Report does not include Network, RoB, GRADE, SWiM, pipeline, or the PRISMA diagram (only typed PRISMA counts as bullets).
- No journal forest layouts (JAMA/RevMan) — would require driving pooling off
the
{meta}package.
Appraisal
- RoB domains are generic
D1..Dn, not instrument-named with signalling questions. - GRADE/SWiM are standalone calculators (no auto-import from the analysis).
Data handling
- Imports limited to CSV/Excel (no SPSS/Stata/RData/database/URL). (In-app cell editing, column retype/rename, row include/exclude, and Combine row-bind/stacking are now available.)
- Drag-to-resize DT column widths not available (DT lacks it natively).
Persistence
- Saved projects store data + rules only — not analysis/pipeline/report state.
Licensing
- The GPL-derivative concern (R + meta/metafor/netmeta/robvis/esc are GPL copyleft)
was resolved 2026-06-11: metaproc itself is now GPL-3.0-or-later. Desktop
installers are conveyance, so each shipped installer ships with a matching public
source tag (GPLv3 section 6 Corresponding Source); hosted SaaS use is not
conveyance (network use is not distribution under GPLv3). See
LICENSING.md+NOTICE.
10. Run / verify
Section titled “10. Run / verify”R 4.5.3 at C:\Program Files\R\R-4.5.3\bin\Rscript.exe (not on PATH). From
metaproc/:
source("renv/activate.R"); library(metaproc); shiny::runApp(run_app(), launch.browser = TRUE)Regression suite: testthat::test_dir("tests/testthat") (14 assertions, green).