Seneca Starter KitPlainTechnical

Kit version 0.1.0

Technical reference

Product A (for example an assessment app) records learner events. The Seneca SDK transforms them inside Product A, and only allowlisted, pseudonymous evidence is sent to Seneca. Product B (for example a tutoring app) asks Seneca for context for one purpose, under the learner's authorization, and decides what to do with it. Product A and Product B never connect.

This kit shows that flow with synthetic data: four worked examples (one of them for writing), a reference transform that runs in this page and in Node, three JSON Schemas and a Product B example.

Sandbox evaluation only. Synthetic data only, no production use, no redistribution. Full terms: LICENSE.md. The kit uses its own teaching formats. Seneca's production integration format is shared in a sandbox under a pilot agreement.

1. Quickstart

Node 18 or later. No install, no dependencies, no network calls.

README.md

The zip is assembled in your browser from the files in section 8.

cd seneca-starter-kit
node kit/cli.mjs --check                                    # run every example, check every schema
node kit/cli.mjs examples/app-to-app/product-a-export.csv   # transform one file
node kit/product-b-start.mjs                                # plan a first session from a context file
python python/product_b_start.py                            # the same, in Python
node kit/cli.mjs --suggest your-export.csv > mapping.json   # map a CSV with its own column names

2. Flow

Product A ── raw events ──> SDK transform ── evidence ──> Seneca record
             (stays in A)   (runs inside A)   (sent)              │
                                                                   │ learner authorizes
                                                                   │ one recipient, one purpose
Product B <──────────────── context (summary + limits) ───────────┘

Product A x Product B: no connection, no shared learner IDs, no item-level rows.

3. Worked examples


3.1 Product A input

Struck-through fields stay in Product A.

Download

3.2 Evidence (computed in this page)

Output of kit/transform.mjs on the input above. Left behind:

evidence.jsonDownload

3.3 Seneca record (illustrative)

Hand-written to show the shape. How Seneca forms readings and confidence is not described.

seneca-record.jsonDownload

3.4 Product B request and context (illustrative)

No public endpoint. Context reads are set up per integration in a pilot. Note that learner_ref differs from the record's: each recipient gets its own.

product-b-request.json
product-b-context.jsonDownload

4. Input formats

FormatDetected byWhat the kit reads
JSON exportobject with responses[]export, student.id, session, skill_labels, skill_report[], and per response question_id, skill_tag, outcome, points, max_points, seconds, attempt, hint_used or assistance, answered_at
JSON export (writing)object with submissions[]export, student.id, assignments (label, genre, setting), criteria (label), and per submission submission_id, assignment_id, draft, revises, submitted_at, word_count, ai_assistance, scores[] (criterion, score, max, rater.role, scored_at)
JSON rowsan array of flat objectsread like CSV rows: keys become columns (use a column mapping if they aren't the kit's names); keys holding nested objects are left behind
CSVheader row with commasrequired learner_id, item_id, occurred_at; optional session_id, skill_tag, skill_label, aligned_to, item_type, outcome, points, max_points, seconds, attempt, assistance, setting, timed, self_rating
xAPI 2.0.0 / 1.0.3statement(s) with actor, verb, objectaccount actor; ADL answered or completed; result.success, result.score (raw/min/max), result.duration; first category activity as skill; registration as session
Caliper 1.2envelope with sensor and data[]AssessmentItemEvent (Completed) and GradeEvent (Graded, with a Score)

5. Transform rules

  1. Allowlist only. Any field the transform doesn't read stays in Product A and is reported by name with a reason (identity, content, not needed for this purpose, not in the kit allowlist).
  2. Learner, session and item IDs become pseudonyms (lrn_, ses_, itm_). The kit uses an unkeyed demo hash; production references are keyed and differ per recipient.
  3. A payload containing what looks like an email address, phone number or national ID number is refused before anything is read.
  4. Writing: the text never leaves. Essays, prompts and comments are left behind. Every score becomes a judgment attributed to its rater (teacher, ai_grader, peer or self); a score without a rater role is refused. A revision must point to an earlier draft in the same payload.
  5. A CSV, or a JSON array of flat rows, with its own column names can be read through a column mapping (seneca-starter-mapping@0.1, schema): which of your columns is which kit field, how your value labels translate (for example Right to correct), and a timezone for timestamps that have none. Unmatched columns stay behind. Try it in section 7, or run node kit/cli.mjs --suggest your-export.csv.
  6. One learner per payload. Up to 2,000 events and 1 MiB (500 events per Caliper envelope).
  7. Nothing is guessed. A score without right/wrong stays not_reported; self-ratings stay self_reported; completion-only events stay completion_only; unreported help stays unknown.
  8. Unsupported shapes fail with a code: UNSUPPORTED_VERB, UNSUPPORTED_ACTOR, UNSUPPORTED_EVENT, UNSUPPORTED_VERSION, MULTIPLE_LEARNERS, INVALID_FIELD, INVALID_TIME, INVALID_MAPPING, PERSONAL_DATA.

6. Output formats

FormatProduced bySchema
seneca-starter-evidence@0.1the transform (step 3.2)starter-evidence.schema.json
seneca-starter-record@0.1illustrative (step 3.3)starter-record.schema.json
seneca-starter-context@0.1illustrative (step 3.4)starter-context.schema.json
seneca-starter-mapping@0.1you (section 7 or --suggest)starter-mapping.schema.json
seneca-starter-context-preview@0.1previewContext(): counts and limits onlynone

These are teaching formats. They are not Seneca's production contract.

7. Try it in the browser

Paste a synthetic payload in any of the five formats, or a CSV (or JSON array of rows) with your own column names and use Map my columns. The transform runs in this tab. Nothing you paste is uploaded or stored. The only thing the page sends is an anonymous count that the tester was used, never what you pasted.

Load a sample or paste a payload, then press Transform locally.

8. Files

9. What exists today

SurfaceStatus
Seneca partner event formatPilot. Served to approved pilot partners. Documentation and sandbox access come with the pilot agreement.
CSV exportsPilot. Mapped to the partner event format during a pilot.
xAPI 2.0.0 and 1.0.3SDK only. Adapter for a defined subset (answered and completed statements). Hosted intake is not open yet.
1EdTech Caliper 1.2SDK only. Adapter for AssessmentItemEvent (Completed) and GradeEvent (Graded). Hosted intake is not open yet. No certification is claimed.
Context reads for Product BPilot. Set up per integration. No public endpoint.
AI assistants over MCPLive. Learner-authorized reads of the learner's own Seneca record at https://vindicaseneca.com/mcp. See Developers.
This kit's formatsTeaching only. Not the production contract.

10. Before a pilot

Have these ready for a first call. None of it needs real student data.

  1. One kind of event to start with, for example answered questions in a diagnostic, and a made-up export of it in your real format. If it's a CSV, attach the mapping.json from section 7.
  2. How learners are identified in your product (account IDs, never names or emails), and where in your app a learner would connect Seneca.
  3. Which direction: sending evidence, reading context for a first session, or both. For reading, the one purpose you'd ask for.
  4. Who your learners are: their age range and the countries they're in. Consent rules differ by age and country.
  5. Who owns it on your side, and when you'd want a pilot to start.

11. Contact

Email kevinchoi@vindicaseneca.com to review an integration, send a synthetic example for mapping, or discuss a paid pilot with sandbox access. Synthetic data only, please.

We count visits and tool use anonymously: no cookies, no identifiers, and never anything you type or paste. Browsers that send Global Privacy Control or Do Not Track are not counted.