Releases: Aelira-AI/aelira-core
Releases · Aelira-AI/aelira-core
Release list
v0.9.6
Immutable
release. Only release title and notes can be modified.
Aelira v0.9.6
Security
- Image-equation remediation is bound to a purpose-authorized vision provider, validates the exact source occurrence, rejects unrestricted recognition output, verifies rendered MathML deterministically, caps confidence at 0.55, and always requires human acceptance.
- PDF table remediation binds visible cells to real marked content and verifies the saved Table/TR/TH/TD hierarchy, ParentTree, MCID/MCR, and object identity before publication. Ambiguous or excessive structures fail closed before mutation.
- Remediation artifacts remain tenant-fenced, descriptor and checksum-bound, approval-gated under the final lock, and unavailable until validation succeeds. Canvas and Brightspace enqueue failures expose stable bounded codes rather than provider or filesystem detail.
Added
- Printed standalone equation images addressable by page, xref, image index, bounding box, and occurrence identity can be recognized as LaTeX, converted through
latex2mathml, round-trip verified, and associated with/Formulacontent and embedded MathML. - Verified tables remediate automatically when their real cell structure is provable. Inclusive limits are 64 columns, 10,000 cells, and 200 tables; ragged, merged, unbound, or oversized cases remain explicit manual-review outcomes.
- Canvas stored-content remediation now persists durable jobs, immutable bounded source snapshots, complete target fingerprints, source-current approvals, bounded diagnostic evidence, restart discovery, and fenced writeback intents.
Fixed
- OCR-generated searchable text survives into the delivered PDF, while suitability, signatures, XFA, partial-text, and indeterminate cases remain fail closed.
- PDF-derived HTML is reconstructed through a passive allowlist and rejects active content, event handlers, unsafe URLs, malformed image payloads, decompression risks, and trailing-data polyglots.
- Direct, queued, and Brightspace publication consumes the exact descriptor-bound output claim rather than reopening a mutable pathname.
- OneDrive receives tenant scope through
department_id. Invalid constructor wiring, reserved scan metadata, remediation CORS preflight, and LMS enqueue-error sanitization are covered by regression tests.
Changed
- Document remediation runs through the durable queue with active-job deduplication, bounded legacy waiting, tenant-fenced job status and latest-job endpoints, artifact-gated downloads, and a killable subprocess with bounded termination and no retry after a hard timeout.
- Equation approval is revalidated after subprocess completion and again under the final artifact lock. Missing purpose-bound vision configuration degrades to detection plus manual remediation without fabricated MathML.
- Release reruns isolate publication receipts by workflow attempt while retaining the exact seven-file SBOM, signed-tag, dependency-audit, reproducibility, and coordinated image/package/release gates.
Operator action required
- Drain active work and pause remediation intake. Back up PostgreSQL and verify the restore path before changing images or schema.
- Run
alembic upgrade headexplicitly and confirm the repository has one head:20260825_canvas_queue. - Set
REMEDIATION_EXECUTION_TIMEOUT_SECONDSandREMEDIATION_TERMINATION_GRACE_SECONDSfor the deployment. Defaults are 1,800 seconds and 10 seconds. A hard timeout is terminal and is not retried automatically. - Deploy API and worker from the same 0.9.6 release. Confirm API health, a fresh worker heartbeat, queue age, and failed/quarantined rows before resuming intake.
- Image-derived equations remain
ai_vision, confidence0.55, andneeds_review=true. Recognition alone never approves or publishes an artifact; persist human acceptance and allow the worker to revalidate it at consumption time. - Preserve every v0.9.5 operator action in
CHANGELOG.md, including review and deliberate resubmission of any pre-v0.9.5 quarantined work.
Included changes
- #163 makes release artifact consumption safe across reruns.
- #164 adds public document-remediation guides.
- #165 preserves OCR output.
- #166 sanitizes accessible PDF-derived HTML.
- #168 binds PDF publication to verified output claims.
- #171 adds verified image-equation MathML remediation.
- #172 adds verified table structure remediation.
- #173 hardens queued remediation execution and artifact publication.
- #174 queues Canvas stored-content remediation safely.
- #175 hardens integration errors, tenant scope, and migration tests.
Release-candidate evidence
- Each included feature PR passed the backend, lint, dependency-security, CLI, dashboard, deterministic Chromium, linux/amd64 Docker, and linux/arm64 Docker checks at its reviewed head.
- Publication remains blocked until the exact merged release commit passes the same CI gates and the signed tag satisfies every protected release workflow receipt, signature, SBOM, audit, and reproducibility check.
- This checked-in body is consumed verbatim by
.github/workflows/release.yml.
v0.9.5
Immutable
release. Only release title and notes can be modified.
Aelira v0.9.5
Security
- Canvas staff authorization remains bound to the authoritative tenant, account, course, content type, and object throughout launch, navigation, scan, remediation, approval, upload, and write-back paths.
- API-key recovery and management remain tenant-scoped, LMS AI use is policy-bound and purpose-isolated, and release publication remains fail-closed behind signed-tag, protected-denylist, CI, four-receipt, dependency-audit, seven release SBOM assets, and reproducibility gates.
Fixed
- Canvas content identity now includes course and content type; inline image remediation preserves image type; LTI navigation exchanges launch codes once; dashboard review actions and labels reflect persisted state.
- Standalone batches drain all requested work, including the verified 1,000-item boundary, instead of stopping after the first page.
Changed
- Cloud scans, remediations, uploads, syncs, and Canvas reconciliation run through a bounded, fenced, multi-worker durable queue with heartbeats, retries, restart recovery, deduplication, and explicit managed artifacts.
- The deterministic release browser gate covers the staff Canvas course, image remediation, review, write-back, rescan, restart, and artifact journey across five release Chromium tests and the ten-project compatibility matrix.
Operator action required
- Durable-job quarantine: durable-worker activation quarantines every pre-v0.9.5 pending or processing job rather than executing it. Each row becomes terminal
failedwith exact reasonpre_v0_9_5_job_quarantined; its original payload, result, and external-effect evidence remain available for review. Identify all affected rows with:SELECT id, job_type, status, last_error_code, created_at FROM cloud_job_queue WHERE status = 'failed' AND last_error_code = 'pre_v0_9_5_job_quarantined' ORDER BY created_at, id; - Review each quarantined row and its linked course, file, credential, managed artifact, and external-effect evidence. Do not edit the old row back to
pending. After confirming current authorization and intent, deliberately resubmit scans, remediations, uploads, and syncs through the same authenticated dashboard action or API endpoint that initiates new work; retain the failed row as the audit record. - Preserve every v0.9.4 operator action in
CHANGELOG.md, back up PostgreSQL, runalembic upgrade headexplicitly, and confirm API and worker health before accepting new work.
Release-candidate evidence
- The open-core candidate integrates the reviewed hardening train through Task24a.
- Website release coordination is current at commit
88d6e717aab852aefd10ca10e8bd49504eeb6d1c: 15 focused tests (13 metadata + 2 dependency-policy), production website and CMS builds, and the generator check using a synthetic immutable v0.9.5 fixture are locally verified; canonical metadata remains v0.9.4 until immutable v0.9.5 exists. - Publication remains blocked until the signed tag and all protected release workflow gates succeed. This checked-in body is consumed verbatim by
.github/workflows/release.yml.
v0.9.4
Changes since v0.9.3
- fix(ci): bound dependencies and document key rotation
- fix(ci): keep migration ids and auth fixtures valid
- fix(release): gate publication on protected environment
- chore(release): v0.9.4
- fix(release): fail closed when disclosure policy is unavailable
- fix(release): publish API and dashboard atomically
- fix(alerts): backfill and constrain weekly schedules
- fix(db): commit LTI enum before data migrations
- fix(db): make v0.9.3 migration downgrade non-destructive
- fix(dashboard): make expired sessions terminate once
- fix(auth): make session expiry terminal and refresh rotation tolerant
- fix(canvas): keep OAuth tokens out of download URLs
- fix(canvas): constrain OAuth and API requests to safe origins
- fix(canvas): authenticate OAuth state and validate instance origins
- fix(lti): restrict Canvas placements to staff roles
- fix(jobs): report unavailable execution honestly
- fix(education): enforce Canvas launch scope on scan routes
- fix(canvas): enforce launch scope on content review routes
- fix(canvas): enforce launch scope on course routes
- refactor(auth): preserve authorization context in principals
- fix(auth): invalidate legacy permissive LTI access
- fix(lti): enforce staff-only launch before provisioning
- fix(lti): deny learner and unknown launches
v0.9.3
Changes since v0.9.2
- chore(release): v0.9.3
- fix(remediation): describe images from the image, and retry a refused vision call
- fix(canvas): remediate content in place, and stop scanning a wrapper we invented
- fix(db,canvas): add the missing scan-type enum values, and count regressions inside a rule
- fix(db): bring the migrations up to the models
- test(canvas): walk the review journey end to end, not one call at a time
- test(canvas,integrations): fix seven tests that were failing on stale expectations
- fix(storage): derive the upload directory from the working directory
- ci(tests): run the integration tests in CI, and name the ones that fail
- fix(canvas): count files in the course and institution compliance scores
- fix(dashboard): remove controls and messages that claimed more than they did
- feat(canvas): write remediated files back to the course
- chore(tests): apply black formatting to the remediate endpoint tests
- fix(canvas): report the verified fixed and remaining split, or admit it is unknown
- feat(canvas): verify HTML remediation by rescanning the result
- fix(canvas): run the remediation that the remediate endpoint reports
- chore: ignore the uploads directory written at the repo root
- test(auth): cover the API key dependency's LTI cookie path
- feat(lti): launch exchange page and account-level course overview
- feat(canvas): content review view backed by real scan findings
- feat(canvas): show files with course content and act on items in place
- feat(dashboard): card, score chip, and progress bar primitives
- fix(dashboard): keep the intended destination through the login bounce
- feat(dashboard): shared course content state and batch outcome helpers
- fix(auth): admit LTI-launch tokens on the API key cookie path
- fix(canvas): serve real scan findings to the content review view
- fix(canvas): approve and write back file remediations
- feat(canvas): expose the current scan id on content status items
- fix(canvas): start the scan task for each queued file job
- feat(canvas): treat course files as course content
- fix(lti): stop treating the opaque context id as a course id
- chore(lti): include placement and course id in the launch log line
- fix(lti): route course launches through the launch exchange page
- fix(lti): resolve the course id from launch custom parameters
- fix(auth): admit LTI-launch tokens on the cookie authentication path
v0.9.2
Changes since v0.9.1
- chore(release): bump remaining version references to 0.9.2
- chore(release): v0.9.2
- fix(remediation): count content-tagger fixes in the remediation result
- ci(release): gate all publishing on green CI for the published SHA
- fix(security): validate every browser request and redirect hop during web scans
- docs(quickstart): document the WCAG knowledge-base seeding steps
- docs(quickstart): pull nomic-embed-text alongside the chat model
- chore(github): convert issue templates to YAML issue forms
- chore(deps): bump the pip-minor-patch group across 1 directory with 78 updates (#138)
- chore(github): issue-form contact links routing questions to Discussions
- docs(readme): route questions and ideas to the now-enabled Discussions
- docs(examples): three runnable examples — engine-direct, API, CLI
- fix(deps): drop the mpmath pin — sympy bounds it (<1.4)
- docs+build: make Node versions coherent — dashboard 22, CLI floor 20
- fix(deps): drop the direct pydantic_core pin — let pydantic govern it
- chore(deps): bump rich from 14.2.0 to 15.0.0 (#129)
- chore(deps): bump more-itertools from 10.8.0 to 11.1.0 (#130)
- chore(deps): bump reportlab from 4.4.10 to 5.0.0 (#131)
- chore(deps): bump pycparser from 2.23 to 3.0 (#133)
- ci(publish-npm): Node 20 → 22 — npm@latest (npm 12) requires node >=22
v0.9.1
Security
- Bearer token hardening: access tokens are type-gated and checked against live sessions, so refresh tokens can no longer be replayed as access credentials and revoked tokens stop working at logout
- CSRF enforcement on cookie-authenticated dashboard mutations via a double-submit
X-CSRF-Token; the dashboard's blanket exemptions were removed - OAuth callback CSRF protection: Google/Microsoft connect and callback now use server-side one-time state, and the workspace binding comes only from verified state metadata
/google/connectnow requires authentication (development fallback removed)- OAuth login domain matching uses exact domain equality (a substring match could be bypassed by look-alike domains)
- Sitemap XML parsing switched to
defusedxml(XXE)
Changed
- Faculty gamification and leaderboards are now opt-in and off by default
- LMS integration maturity labeled honestly: Canvas is production-verified; others range from beta to untested
- Documentation claims accuracy pass; SECURITY.md supported-versions table aligned; dashboard licence declared
- Upload paths genericized and dashboard debug logging removed
Dependencies
- bcrypt 5.0.0, redis 8.1.0, websockets 17.0.1, python-pptx 1.0.2, av 18.1.0, packaging 26.3, setuptools 84.0.0, click 8.3.3
- Dashboard and CLI npm minor/patch groups; docker build actions updated
Upgrading
Self-hosted deployments on 0.9.0 should upgrade promptly — the security fixes above close real authentication gaps. git pull && docker compose up -d --build, or pull the 0.9.1 images from GHCR. Database migrations run automatically on container start.
Full changelog: CHANGELOG.md
v0.9.0
[0.9.0] - 2026-08-15
Added
- Initial public release
- FastAPI backend with document scanning and AI-powered remediation
- React + Vite admin dashboard
- Document processors: PDF, DOCX, PPTX, XLSX, LaTeX, HTML, images, video
- AI remediation with bring-your-own-model support: Gemini, OpenAI, Anthropic, xAI, any OpenAI-compatible endpoint, or fully local via Ollama
- WCAG 2.1 AA compliance scanning and reporting
- Authentication: magic links, Google OAuth, Microsoft OAuth
- Multi-tenant department system with tier-based quotas
- LMS integrations: Canvas LTI 1.3, Blackboard, Moodle, Brightspace
- Cloud storage integrations: Google Workspace, Microsoft 365
- PDF/UA compliance tagging and structure tree manipulation
- Reading order analysis and correction
- Table accessibility detection and remediation
- Color contrast analysis
- OCR for scanned documents
- Video captioning and audio description
- GDPR-compliant account management and data deletion
- Database schema management with Alembic migrations
- Docker development environment