{
  "id": "competency:msc-agentic",
  "code": "CDU-ICT-AGT-900",
  "level": "MSc",
  "name": "Master of Science — Agentic Systems Engineering",
  "faculty": "Faculty of Information and Communication Technology",
  "lineage": [
    {
      "institution": "Conquest Designer University",
      "year": 2026,
      "note": "the first degree authored with the kit — the house teaching its own arithmetic"
    }
  ],
  "researchProject": "The operating mathematics of an autonomous agent: identity, admission, patience and capacity",
  "description": "The calculations an agent and its operator run every day: the check digit behind every PAN, the sliding-window admission every polite service enforces, the exponential backoff every resilient client owes its upstreams, and the agent-day budget that bounds what can honestly be promised.",
  "syllabus": [
    "Card-number identity: ISO/IEC 7812 PANs and the Luhn check digit",
    "Admission control: sliding windows, retry-after, and why refusal is a number",
    "Patience: exponential backoff, caps, and total waiting time",
    "Capacity: the 1440-minute agent-day, fares, and what remains to promise"
  ],
  "reference": {
    "Luhn": "ISO/IEC 7812-1 Annex B — double every second digit from the right, subtract 9 above 9, sum; the check digit completes the sum to a multiple of 10",
    "Sliding window": "admit while count(events in the last W) < max; otherwise retry after the oldest event ages out",
    "Exponential backoff": "wait_n = min(cap, base × 2^n) — AWS Architecture Blog, \"Exponential Backoff And Jitter\" (2015)",
    "The agent-day": "1440 minutes = 1440 ST; one agent, however fast, has 24 hours a day (the agent-day rule)"
  },
  "role": "You are a systems engineer explaining a computation to an operator. State the inputs, the bound, the formula, the result — and what the operator should set or do next.",
  "feeUsd": 1,
  "version": "1.0.1",
  "qualification": {
    "award": "MSc",
    "nqfLevel": 9,
    "qualificationType": "Master's Degree (HEQSF qualification type 9a)",
    "totalCredits": 180,
    "minCreditsAtExitLevel": 120,
    "iscedFields": [
      "061"
    ],
    "standards": [],
    "registration": "not registered"
  },
  "modules": [
    {
      "code": "CDU-ICT-AGT-900-901",
      "title": "Coursework — the executable units",
      "nqfLevel": 9,
      "credits": 60,
      "prerequisites": [],
      "coRequisites": [],
      "outcomes": [
        "answer every unit of the qualification against its published reference, with the working shown"
      ],
      "assessment": {
        "formative": [
          "worked examples re-run against the published reference",
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "every unit passed once through the seeded assessment (the seeded assessment room)",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [
        "luhn_pan",
        "rate_window",
        "backoff_schedule",
        "agent_day_budget"
      ],
      "notionalHours": 600
    },
    {
      "code": "CDU-ICT-AGT-900-902",
      "title": "Research report",
      "nqfLevel": 9,
      "credits": 120,
      "prerequisites": [
        "CDU-ICT-AGT-900-901"
      ],
      "coRequisites": [],
      "outcomes": [
        "The operating mathematics of an autonomous agent: identity, admission, patience and capacity"
      ],
      "assessment": {
        "formative": [
          "worked examples re-run against the published reference",
          "seeded practice scenarios, deterministic per (pan, unit, attempt)"
        ],
        "summative": "the research report, assessed against the qualification’s published reference block",
        "passMark": 50,
        "subminimum": 40,
        "moderation": "internally assessed by the unit itself — its reference implementation is the marker; the working is published so anyone can re-run the mark (D-13.1 — no model marks anything)"
      },
      "unitIds": [],
      "notionalHours": 1200
    }
  ],
  "units": [
    {
      "id": "luhn_pan",
      "name": "PAN check digit (Luhn)",
      "answers": "Is this card-shaped number self-consistent, and what check digit completes this body?",
      "example": {
        "body": "971034210000001"
      },
      "reference": "ISO/IEC 7812-1 Annex B (the Luhn formula)",
      "signature": {
        "input": {
          "body": {
            "type": "string",
            "describe": "The number without its final check digit — 7 to 18 digits, spaces allowed"
          }
        },
        "output": {
          "checkDigit": {
            "type": "number",
            "describe": "The digit that completes the number"
          },
          "pan": {
            "type": "string",
            "describe": "The completed number, spaced in fours"
          },
          "length": {
            "type": "number",
            "describe": "Digits in the completed number"
          }
        }
      }
    },
    {
      "id": "rate_window",
      "name": "Sliding-window admission",
      "answers": "May one more request pass this window now — and if not, when?",
      "example": {
        "max": 5,
        "windowSeconds": 600,
        "ageSeconds": "30,90,180,400,590"
      },
      "reference": "The sliding window (the house's own intake rule)",
      "signature": {
        "input": {
          "max": {
            "type": "number",
            "describe": "Requests allowed inside the window",
            "min": 1,
            "max": 100000
          },
          "windowSeconds": {
            "type": "number",
            "describe": "The window",
            "unit": "s",
            "min": 1,
            "max": 604800
          },
          "ageSeconds": {
            "type": "string",
            "describe": "Ages of the prior requests, seconds ago, comma-separated (empty for none)"
          }
        },
        "output": {
          "inWindow": {
            "type": "number",
            "describe": "Prior requests still inside the window"
          },
          "admit": {
            "type": "boolean",
            "describe": "Whether one more passes now"
          },
          "retryAfterSeconds": {
            "type": "number",
            "describe": "Wait this long when refused; 0 when admitted"
          }
        }
      }
    },
    {
      "id": "backoff_schedule",
      "name": "Exponential backoff",
      "answers": "How long does a polite client wait between retries, and how long might the whole attempt take?",
      "example": {
        "attempts": 5,
        "baseSeconds": 1,
        "capSeconds": 30
      },
      "reference": "AWS Architecture Blog, \"Exponential Backoff And Jitter\" (2015): wait_n = min(cap, base × 2^n)",
      "signature": {
        "input": {
          "attempts": {
            "type": "number",
            "describe": "Retry attempts to schedule",
            "min": 1,
            "max": 20
          },
          "baseSeconds": {
            "type": "number",
            "describe": "The first wait",
            "unit": "s",
            "min": 0.01,
            "max": 3600
          },
          "capSeconds": {
            "type": "number",
            "describe": "The longest any single wait may be",
            "unit": "s",
            "min": 0.01,
            "max": 86400
          }
        },
        "output": {
          "scheduleSeconds": {
            "type": "number[]",
            "describe": "The wait before each retry, in order"
          },
          "totalSeconds": {
            "type": "number",
            "describe": "Worst-case total waiting time"
          },
          "cappedFrom": {
            "type": "number",
            "describe": "The first attempt (1-based) the cap bites on; 0 when it never does"
          }
        }
      }
    },
    {
      "id": "agent_day_budget",
      "name": "The agent-day budget",
      "answers": "Of the 1440 ST an agent-day holds, what has this agent already promised, and what may it still take on?",
      "example": {
        "faresClaimedSt": "120,60",
        "consultationsPlanned": 8
      },
      "reference": "the agent-day rule — : 1440 minutes = 1440 ST; a capacity bound, not an allocation",
      "signature": {
        "input": {
          "faresClaimedSt": {
            "type": "string",
            "describe": "Fares already claimed today, whole ST, comma-separated (empty for none)"
          },
          "consultationsPlanned": {
            "type": "number",
            "describe": "Consultations the agent still plans today, at 1 ST each",
            "min": 0,
            "max": 1440,
            "default": 0
          }
        },
        "output": {
          "bookedSt": {
            "type": "number",
            "describe": "ST already promised (fares + planned consultations)"
          },
          "remainingSt": {
            "type": "number",
            "describe": "What is left of the day"
          },
          "overcommitted": {
            "type": "boolean",
            "describe": "True when promises exceed the day — stop claiming"
          }
        }
      }
    }
  ]
}