The assignment

A first-year programming task. Write a function that takes an annual income and returns the tax owed under UK income tax bands. The student is expected to handle the personal allowance, the basic-rate band, and the higher-rate band, and to submit a working build in a GitHub repo with a README.

Requirements
  • input: annual income in pounds
  • apply the personal allowance and the tax bands in order
  • output: total tax owed and net income
  • submit a working repo with a README

How the submission usually arrives

In a standard submission, the README explains what the program does and the repo contains the final function. The code compiles and returns the right numbers for the test cases in the brief.

JavaScript
function calculateTax(income) {
  if (income <= 12570) return 0;
  if (income <= 50270) return (income - 12570) * 0.2;
  return (50270 - 12570) * 0.2 + (income - 50270) * 0.4;
}

The artefact is fine. The problem is what sits around it. From the submission alone, a marker cannot tell where the function came from, which parts the student worked out, which parts came from a model, and whether the numbers were understood or copied. The code is the evidence and the reasoning at the same time, and those two things are no longer the same.

The question behind the mark: what was understood, and what was generated? With the assessment model most of us inherited, that is often impossible to answer from the submitted artefact alone.

The PRISM Workflow inside the same task

PrismMO does not replace the assignment. The task stays the same. The repo stays the same. The README stays the same file. What changes is what the README carries. Five stages sit inside the work and leave a trace the student can point to.

P

Problem

The student states the brief in their own words. Inputs, outputs, bands, edge cases, and anything the brief does not cover.

R

Respond

A first attempt before any AI is used. It does not need to be correct. It needs to be theirs.

I

Interact

Prompts, model replies, and what the student kept, rejected, or changed. The AI section of the README.

S

Synthesize

The final code, with a short account of how it was built from the earlier attempts and the AI exchanges.

M

Make Visible

A short reflection linking decisions to what the student now understands, and what they would still change.

Walkthrough

Problem

The student writes the problem into the README before touching an editor.

Given an annual income, return the tax owed using three bands: zero up to 12,570, twenty per cent up to 50,270, forty per cent after that. Return net income alongside the tax. Treat negative income as invalid. No allowance for National Insurance or Scottish rates.

Short, but it pins down what the code has to do and what it does not have to do. The marker can now read the rest of the work against a problem the student has defined.

Respond

A first pass, written before any model is opened.

JavaScript
function calculateTax(income) {
  let tax = 0;
  if (income > 12570) {
    tax = (income - 12570) * 0.2;
  }
  return tax;
}

One band handled. Higher-rate income is wrong. The student knows it. The value of this snippet is not that it works. It is that it marks a starting position that a marker can compare the final code to.

Interact

The student asks a model for help with the higher-rate band and records the exchange.

Prompt
Write a JavaScript function for UK income tax bands.
Model reply (excerpt)
if (income > 50000) {
  tax = income * 0.4;
}

The student notes, in the README, what is wrong with the reply: the threshold is 50,270, not 50,000, and the forty per cent rate applies to the income above the higher threshold, not to the full amount. The correction happens in the next block.

JavaScript
if (income <= 50270) {
  tax = (income - 12570) * 0.2;
} else {
  tax = (50270 - 12570) * 0.2;
  tax += (income - 50270) * 0.4;
}

What the marker can now see: an error spotted in a model reply, a stated reason for the correction, and code that reflects the corrected reasoning. This is the thinking the traditional submission hides.

Synthesize

The final function, and a two-line note in the README about how it was built.

JavaScript
function calculateTax(income) {
  let tax = 0;
  if (income > 12570) {
    if (income <= 50270) {
      tax = (income - 12570) * 0.2;
    } else {
      tax = (50270 - 12570) * 0.2;
      tax += (income - 50270) * 0.4;
    }
  }
  return tax;
}

Make Visible

My first version only handled the basic rate. The model gave me a shape for the higher band but used the wrong threshold and taxed the full income at forty per cent. I kept the structure, fixed the threshold, and changed the calculation to apply forty per cent only to income above 50,270. Next time I would write a small table of expected results first and test against it before touching the code.

Two paragraphs. The student has said what they did, what went wrong, and what they would change. The marker is no longer guessing.

Before and after

Traditional submission

What the marker sees

  • final function
  • short description of the program
  • a working build

Understanding is inferred from the output. If the function works, the student is assumed to have understood it. If AI was used, there is no record of how.

PrismMO submission

What the marker sees

  • problem stated in the student's own words
  • first attempt before AI
  • prompts, replies, and what was kept or changed
  • final code with a note on how it was built
  • short reflection on decisions and what changed

Understanding is read from the trace, not guessed from the output. The assessment criteria do not change. The evidence base does.

Where this lives in the README

Nothing on this page lives in a new file or a new platform. Every stage of the PRISM Workflow maps to a section of the README the student already has to write.

README section What it carries Workflow stage
Overview Context for the build Problem
Problem and requirements The brief, restated by the student Problem
Design and planning First attempts, shape of the approach Respond
AI section Prompts, replies, and what the student did with them Interact
Dev decisions How the final code was built from the iterations Synthesize
Testing Validation and expected results Synthesize
Reflection Decisions, mistakes, next steps Make Visible

This structure matches how working developers already use README files in industry. For a student, the instruction is simple: fill the sections you already have, and fill them as you go.

How the PRISM Framework reads the work

The Workflow makes the thinking visible. The Framework turns that visibility into marks against criteria the lecturer already uses.

Output

Does the final build meet the brief? The same question traditional assessment asks, answered from the same artefact.

Process

Is there a trace of how the work was built? First attempts, iterations, and AI exchanges in the README.

Decisions

Are choices explained? Rejected options, corrected AI output, trade-offs the student made.

Understanding

Can the student account for what they produced? The reflection section is where this sits.

The final program is not the evidence. The trace that produced it is.

Start with one assignment

PrismMO is built to work inside a module, not replace it. The first step is one task, one brief, one marking round with the PRISM Workflow in place. No new platform, no new toolset, no change to the criteria the module already uses.

  1. Pick a task students already hand in with a README and a repo.
  2. Add the PRISM sections to the README template for that task.
  3. State, in the brief, that AI use is expected and that the README carries the evidence.
  4. Mark against the criteria you already use, reading the README through the four Framework lenses.

What this changes for you: nothing in the criteria, nothing in the tools, nothing in the artefact students submit. Only what that artefact is allowed to carry.