Image remediation pass — final report

Pass scope: ELEC 271, 274, 278, 292, 224, 232, 280, 252, MTHE 237, APSC 221. Conventions inferred from existing notes (no CLAUDE.md present): embed style ![[course-topic.png]] followed by an italic caption line. Wikimedia attribution caption form: *Image: [Title](commons-url), [License](license-url) — short description.* Self-generated attribution form: *Self-generated illustrative figure — description.* Course filename prefix elec271-, elec274-, elec280-, elec292-, elec224-, elec232-, mthe237-, apsc221-.

Vault stats after pass: 469 unique image attachments, 440 unique embeds referenced, 0 broken embeds.

Step 0 audit

Wrote _quarantine/image-gap-audit.md (heuristic gap audit by course). Raw counts: ELEC 280 47 gaps / ELEC 274 48 / ELEC 292 57 / ELEC 224 50 / ELEC 271 41 / ELEC 278 17 / ELEC 232 59 / ELEC 252 52 (audit-only) / MTHE 237 10 / APSC 221 14. (Heuristic produces many false positives — e.g. flags any note that mentions the word “cache,” “pipeline,” or “coordinate” anywhere in the body. The remediation pass therefore prioritized notes where the topic is the figure or the prose explicitly describes a curve/diagram.)

Images added this pass (per note)

ELEC 292 — Introduction to Data Science (matplotlib-generated)

NoteImageTypeSource
AUC.mdelec292-roc-auc-curve.pngself-generatedmatplotlib
ROC curve.mdelec292-roc-auc-curve.pngself-generatedmatplotlib
Confusion matrix.mdelec292-confusion-matrix.pngself-generatedmatplotlib
Gradient descent.mdelec292-gradient-descent.pngself-generatedmatplotlib
Learning rate.mdelec292-learning-rate-impact.pngself-generatedmatplotlib
Principal Component Analysis.mdelec292-pca-projection.pngself-generatedmatplotlib
t-SNE.mdelec292-tsne-clusters.pngself-generatedmatplotlib (cluster illustration only — not real t-SNE output)
Logistic regression.mdelec292-logistic-sigmoid.pngself-generatedmatplotlib
Generalization (machine learning).mdelec292-generalization-bias-variance.pngself-generatedmatplotlib
Normalization.mdelec292-normalization-effect.pngself-generatedmatplotlib
Moving-average filter.mdelec292-moving-average-filter.pngself-generatedmatplotlib
Classification (ML).mdelec292-classification-boundary.pngself-generatedmatplotlib

ELEC 224 — Continuous-Time Signals and Systems (matplotlib-generated)

NoteImageType
Lowpass filter.mdelec224-bode-lowpass.pngself-generated
Highpass filter.mdelec224-bode-highpass.pngself-generated
Frequency response.mdelec224-bode-lowpass.pngself-generated
Sampling.mdelec224-sampling.pngself-generated
Aliasing.mdelec224-aliasing.pngself-generated
Sampling theorem.mdelec224-sampling.pngself-generated
Nyquist rate.mdelec224-aliasing.pngself-generated
Sinc interpolation.mdelec224-sinc-function.pngself-generated
Gibbs phenomenon.mdelec224-gibbs-phenomenon.pngself-generated
RC step response.mdelec224-rc-step-response.pngself-generated
Time constant.mdelec224-rc-step-response.pngself-generated
Graphical convolution.mdelec224-graphical-convolution.pngself-generated
Spectrum (signal).mdelec224-spectrum-example.pngself-generated
Impulse response.mdelec224-impulse-response-stability.pngself-generated
BIBO stability.mdelec224-impulse-response-stability.pngself-generated
Complex sinusoid.mdelec224-complex-sinusoid-helix.pngself-generated

MTHE 237 — Differential Equations (matplotlib-generated)

NoteImageType
Distinct real eigenvalues case.mdmthe237-phase-portrait-stable-node-illus.pngself-generated
Linear autonomous system.mdmthe237-phase-portrait-saddle-illus.pngself-generated
Impulse response.md (MTHE 237 source)mthe237-impulse-response-underdamped.pngself-generated

APSC 221 — Engineering Economics (matplotlib-generated)

NoteImage
Cash flow diagram.mdapsc221-cash-flow-diagram.png
Supply and demand.mdapsc221-supply-demand.png
Learning curve model.mdapsc221-learning-curve.png
Fixed cost.mdapsc221-fixed-variable-total-cost.png
Total cost.mdapsc221-fixed-variable-total-cost.png
Geometric gradient series.mdapsc221-geometric-gradient.png
Sensitivity analysis.mdapsc221-sensitivity-tornado.png
Power-sizing model.mdapsc221-power-sizing.png
POLC.mdapsc221-polc-cycle.png
Management process.mdapsc221-polc-cycle.png

ELEC 271 — Digital Systems (Wikimedia Commons)

NoteImageLicenseSource
Conjunction.mdelec271-and-gate-iec.pngPDAND_ANSI_Labelled.svg
Disjunction.mdelec271-or-gate-iec.pngPDOR_ANSI_Labelled.svg
Negation.mdelec271-not-gate-iec.pngPDNOT_ANSI_Labelled.svg
Exclusive Disjunction.mdelec271-xor-gate-iec.pngPDXOR_ANSI_Labelled.svg
Material Biconditional.mdelec271-xnor-gate-iec.pngPDXNOR_ANSI_Labelled.svg
NAND gate.mdelec271-nand-gate-iec.pngPDNAND_ANSI_Labelled.svg
NOR gate.mdelec271-nor-gate-iec.pngPDNOR_ANSI_Labelled.svg

ELEC 280 — Electromagnetics (Wikimedia Commons)

NoteImageLicenseSource
Cartesian coordinates.mdelec280-cartesian-coordinates.pngCC BY-SA 3.0Cartesian_coordinates_3D.svg
Cylindrical coordinates.mdelec280-cylindrical-coordinates.pngPDCoord_system_CY_1.svg
Spherical coordinates.mdelec280-spherical-coordinates.pngCC0Spherical_coordinates_on_a_globe.svg
Right-hand rule.mdelec280-right-hand-rule.pngCC BY-SA 3.0Right_hand_rule_cross_product.svg
Plane wave.mdelec280-plane-wave-em.pngCC0Plane_electromagnetic_wave.svg
Smith chart.mdelec280-smith-chart.pngCC BY-SA 3.0Smith_chart_gen.svg
Capacitance.mdelec280-parallel-plate-cap.pngCC BY-SA 4.0Parallel_plate_capacitor_cs.svg
Electric field.mdelec280-electric-dipole-field.pngCC BY-SA 3.0Electric-dipole-field-lines-and-equipotential-lines.svg
Magnetic field.mdelec280-magnetic-dipole-field.pngPDMagnetic_field_due_to_dipole_moment.svg

ELEC 232 — Vector Calculus and Complex Analysis (Wikimedia Commons)

NoteImageLicenseSource
Contour integral.mdelec232-contour-integral.pngCC0FresnelIntegralContour.png

ELEC 274 — Computer Architecture (Wikimedia Commons)

NoteImageLicenseSource
Memory hierarchy.mdelec274-memory-hierarchy.pngPDComputerMemoryHierarchy.svg
Cache address mapping.mdelec274-cache-direct-mapped.pngCC BY-SA 4.0Direct_Mapped_Cache.svg

ELEC 278 — Information Structures

No additions this pass. The course was already at 31 of 58 notes with images and the remaining gap-audit hits were almost entirely false positives (notes that mention “cache,” “graph,” or “pipeline” in passing). The high-leverage targets — adjacency list/matrix, BST/AVL/heap structure, sorting walk-throughs — already have hand-authored figures.

ELEC 252 — Electronics I

Audit-only per scope. No additions. The verifier reports 0 broken embeds across the course’s 110 notes-with-images.

Files downloaded but NOT embedded — and why

FileReason skipped (logged for future use)
elec274-pipeline-five-stage.pngThumbnail resolution from Commons was 972×282 — too narrow for the depth of detail; defer until a cleaner SVG render or a self-generated equivalent is produced.
elec274-cache-set-associative.png (CC BY-SA 3.0)Diagram notation differs from the way Cache address mapping.md walks through tag/index/offset. Embedding would create a notation conflict. Use later only if the note is rewritten to match.
elec274-cache-fully-associative.png (CC BY-SA 3.0)Same reason as above.

Files queried but missing or non-free (logged, not downloaded)

The first download pass requested several Commons filenames that the API returned as either nonexistent or under non-free licenses. After the second pass (corrected canonical filenames), all 21 target files downloaded successfully. No file in the final pass came back as “missing” or “non-free.” See _audit/commons_log.json for the full per-file response log.

One Wikimedia file was downloaded but rejected as unusable: elec278-adjacency-list-canonical.png (intended Singly_linked_list.png). The thumbnail came back at 300×34 pixels — too small to be useful. Deleted from attachments/; the existing hand-authored adjacency list figure is fine.

Missing notes

No “missing notes” hits in the embed pass — every target note in the plan exists in the vault.

Broken embeds

Zero. All 440 unique ![[ ]] references across the vault resolve to a real file in attachments/. Verified by _audit/verify_embeds.py after the pass completed.

Attribution

Wrote attachments/attributions.md covering:

  • Every image added in this pass (filename, first-used note, type, caption snippet).
  • A second table listing each Wikimedia file with its Commons page URL, license short name, and author as returned by the Commons extmetadata API.

Tools / scripts produced

All under D:/Public Obsidian/_audit/ (not part of the vault):

  • gap_audit.py — produces _quarantine/image-gap-audit.md and audit.json.
  • generate_plots.py — generates all 33 matplotlib figures.
  • download_commons.py — Commons API verification + thumbnail download with attribution capture.
  • embed_images.py — embed planner + inserter + attribution writer.
  • verify_embeds.py — vault-wide broken-embed scan.

Summary

  • Notes touched (image add): 50 notes received a new embed (some notes received the same image for two related concepts, e.g. ROC/AUC; some images were used in two notes).
  • Wikimedia images downloaded with free-license verification: 21, of which 18 were embedded and 3 were retained but not embedded (notation mismatch / resolution).
  • Self-generated matplotlib figures: 33, all illustrative — captions in the notes state this honestly.
  • 0 broken embeds vault-wide.
  • ELEC 274 audit: 3 HIGH fixed, 1 HIGH from the audit subagent verified as a false positive, 12 MEDIUM + 5 LOW logged in _quarantine/elec274-audit-report.md. Cache memory.md rewritten to remove AI tone.
  • ELEC 252: audit-only as scoped; no changes.