Commit 36b863

2026-08-12 09:10:36 lisa: Add C07 study pages; regenerate C06 via the shared port script sd/C07: home + Naming Conventions, Internal Documentation, Validation Techniques (21 skill codes), linked from the SD hub. sd/C06 pages regenerated by sat/port-reference-godot-to-wiki.py (marker update; C06-home now generated from the repo README like every other page). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
sd/C06/C06-home.md ..
@@ 1,11 1,11 @@
-<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot — do not hand-edit; re-run the port. -->
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
# C06 — Skills in Using the Features of the Programming Language
The Hamilton and Alexandra College · Year 12 · 2026
-Criterion 6 is graded from **34 skill codes** (C611–C658) across two indicators: using a range of programming-language features, and using appropriate data types, data structures and data sources. Each page below covers one topic: the VCE definition, the GDScript syntax, labelled examples — from the shared **Myki fare app** domain and from the projects we studied in class — and the **evidence standard**: what earns each tick and what does not. Your checkpoint and validation feedback is graded against these pages, so what they say *is* the standard.
+Study material and grading standard for **VCE Software Development, Unit 4 Outcome 1, Criterion 6** — *Skills in using the features of the programming language* — for students building their SAT in **Godot / GDScript**.
----
+Each page covers one topic: the VCE definition, the GDScript syntax, a minimal worked example in the shared **Myki fare app** domain, and the **evidence standard** — what earns each skill-code tick and what does not. Your checkpoint and validation feedback — from your teacher or an AI reviewer — is graded against these pages, so what they say *is* the standard.
## Using these pages for your checkpoint
@@ 19,6 19,8 @@
## How the codes work
+- **34 skill codes** (C611–C658) across two indicators.
+
- **Checkpoint sheet:** three boxes per code — label your code `C611a`, `C611b`, `C611c` for your first, second and third nominated feature (102 marks).
- **Validation sheet:** one box per code, ticked only for skills demonstrated **live** during the Live Coding Validation (34 marks) — in the Prove-It's-Yours re-label, the data-layer extension, or a mini-challenge. Practise finding and re-labelling your own code without notes.
@@ 53,12 55,12 @@
| C624 | 3–4 | conditional operators | [Instructions and Operators](/sd/C06/Instructions%20and%20Operators) |
| C625 | 3–4 | sequence | [Control Structures](/sd/C06/Control%20Structures) |
| C626 | 3–4 | selection | [Control Structures](/sd/C06/Control%20Structures) |
-| C627 | 3–4 | GUIs | [GUI and Controls](/sd/C06/GUI%20and%20Controls) |
+| C627 | 3–4 | GUIs | [GUI](/sd/C06/GUI%20and%20Controls) |
| C628 | 3–4 | data types for local variables | [Local and Global Variables](/sd/C06/Local%20and%20Global%20Variables) |
| C629 | 3–4 | reasoning — why these data types | [Data Types](/sd/C06/Data%20Types) |
| C631 | 5–6 | global variables | [Local and Global Variables](/sd/C06/Local%20and%20Global%20Variables) |
| C632 | 5–6 | iteration / repetition | [Control Structures](/sd/C06/Control%20Structures) |
-| C633 | 5–6 | relevant GUI controls | [GUI and Controls](/sd/C06/GUI%20and%20Controls) |
+| C633 | 5–6 | relevant GUI controls | [GUI](/sd/C06/GUI%20and%20Controls) |
| C634 | 5–6 | data types for global variables | [Local and Global Variables](/sd/C06/Local%20and%20Global%20Variables) |
| C635 | 5–6 | arrays | [Data Structures](/sd/C06/Data%20Structures) |
| C636 | 5–6 | records | [Data Structures](/sd/C06/Data%20Structures) |
@@ 77,12 79,12 @@
| C657 | 9–10 | range of types, structures and sources | [Data Sources](/sd/C06/Data%20Sources) |
| C658 | 9–10 | reasoning — why all of them | [Data Sources](/sd/C06/Data%20Sources) |
-Reference-only page with no codes of its own: [Data Type Characteristics](/sd/C06/Data%20Type%20Characteristics) — the input/storage/output table the reasoning codes draw their "why" from.
+Reference-only pages with no codes of their own: [Data Type Characteristics](/sd/C06/Data%20Type%20Characteristics) — the input/storage/output table the reasoning codes draw their "why" from.
## Example code
-Snippets come from two places, and the pages keep both:
+Snippets use two sources, and the pages keep both:
- The **Myki fare app** domain (balance, fares, zones, concession, journeys) — minimal made-for-purpose examples.
-- **Real code from the projects studied in class**, attributed in the snippet's first comment line (e.g. `# connect-go-dots — grid.gd`): `connect-go-dots`, `tile-matching-game` and `club-ladder` — plus *non-examples* showing what does not earn a tick (engine methods, engine inheritance). Also worth reading: `dodge-the-creeps`.
+- **Real code from the projects studied in class**, attributed in the snippet's first comment line (e.g. `# connect-go-dots — grid.gd`). So far: `connect-go-dots` (instructions, sequence, iteration, GUI and controls, autoload global), `tile-matching-game` (operators, selection, a real `while`, data types, typed arrays, records, CSV source, full functions and methods, classes and objects) and `club-ladder` (`match`, class-as-record, direct `.new()`, XML read *and* write, `res://` vs `user://`, model design reasoning) — plus *non-examples* for engine methods and engine inheritance. Also worth reading: `dodge-the-creeps` (GUI, signals).
sd/C06/Control Structures.md ..
@@ 1,4 1,4 @@
-<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot — do not hand-edit; re-run the port. -->
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
# Control Structures — GDScript
sd/C06/Data Sources.md ..
@@ 1,4 1,4 @@
-<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot — do not hand-edit; re-run the port. -->
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
# Data Sources — GDScript
*VCE scope only. The study design names exactly three data sources: **plain text (TXT), delimited (CSV) and XML files**. JSON, databases (SQLite), REST APIs and Godot's own `.tres`/`.res` resources are **out of scope** — they do not earn source codes, however natural they feel in Godot.*
sd/C06/Data Structures.md ..
@@ 1,4 1,4 @@
-<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot — do not hand-edit; re-run the port. -->
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
# Data Structures — GDScript
sd/C06/Data Type Characteristics.md ..
@@ 1,4 1,4 @@
-<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot — do not hand-edit; re-run the port. -->
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
# Table 5.1 Characteristics of Data Types and Structures
*Language-agnostic — this table applies unchanged to Godot.*
sd/C06/Data Types.md ..
@@ 1,4 1,4 @@
-<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot — do not hand-edit; re-run the port. -->
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
# Data Types — GDScript
sd/C06/Functions and Methods.md ..
@@ 1,4 1,4 @@
-<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot — do not hand-edit; re-run the port. -->
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
# Functions and Methods — GDScript
sd/C06/GUI and Controls.md ..
@@ 1,4 1,4 @@
-<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot — do not hand-edit; re-run the port. -->
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
# GUI — Godot Control Nodes
sd/C06/Instructions and Operators.md ..
@@ 1,4 1,4 @@
-<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot — do not hand-edit; re-run the port. -->
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
# Instructions and Operators — GDScript
sd/C06/Local and Global Variables.md ..
@@ 1,4 1,4 @@
-<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot — do not hand-edit; re-run the port. -->
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
# Local and Global Variables — GDScript
sd/C06/OOP Concepts.md ..
@@ 1,4 1,4 @@
-<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot — do not hand-edit; re-run the port. -->
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C06-2026/C06-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
# OOP Concepts — GDScript
/dev/null .. sd/C07/C07-home.md
@@ 0,0 1,84 @@
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C07-2026/C07-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
+# C07 — Skills in Developing the Software Solution
+
+The Hamilton and Alexandra College · Year 12 · 2026
+
+Study material and grading standard for **VCE Software Development, Unit 4 Outcome 1, Criterion 7** — *Skills in developing the software solution* — for students building their SAT in **Godot / GDScript**.
+
+Each page covers one indicator: the VCE definition, the GDScript conventions, labelled examples — from the shared **Myki fare app** domain and from the projects we studied in class — and the **evidence standard**: what earns each tick and what does not. Your checkpoint and validation feedback is graded against these pages, so what they say *is* the standard.
+
+**Where C7 is assessed:** C7 does not run its own validation. All three indicators are assessed **live in Part B** of the single 100-minute Live Coding Validation, on your comment-stripped copy of the one feature the teacher picks: a **naming audit** (C7-1), writing the **internal documentation from scratch** (C7-2), and adding **input validation** with a test run to show the checks fire (C7-3).
+
+## Using these pages for your checkpoint
+
+1. Pick a nominated feature you have built.
+
+2. Walk the lookup table below: for each code, open its page and compare your code against the **Earns the tick** line.
+
+3. Label the exact line (`# C721a — …`), and for every ✍️ code write the actual prose — the label alone earns nothing there.
+
+4. Anything you cannot label yet is your to-do list — each page shows the smallest pattern that earns the tick.
+
+## How the codes work
+
+- **21 skill codes** across **three** indicators: C7-1 naming conventions (5 codes, 25%), C7-2 internal documentation (9 codes, 40%), C7-3 validation techniques (7 codes, 35%).
+
+- **Checkpoint sheet:** three boxes per code — label `C711a` / `C711b` / `C711c` for your first, second and third nominated feature (63 marks).
+
+- **Validation sheet:** one box per code (21 marks), ticked only for skills demonstrated **live** during Part B — naming audit, internal documentation, input validation. Practise doing all three on your own code without notes.
+
+- **✍️ = written evidence required.** These codes need real prose in the comments, not just the label. **All nine C7-2 codes are ✍️** — a student who labels well but writes nothing loses nearly half the criterion.
+
+- **Label as you code.** A skill the marker cannot find earns nothing — put the code in a comment on the line (or block) that shows it. Every example on these pages carries its own label to model exactly this.
+
+**Levels of performance:** Not shown (0) · 1–2 very low · 3–4 low · 5–6 medium · 7–8 high · 9–10 very high.
+
+## Quality qualifiers decide the band
+
+Unlike C6, the C7 descriptors carry **quality words** that matter as much as the code itself:
+
+| Band | C7-2 clarity | C7-3 consistency |
+|---|---|---|
+| 5–6 | *some issues with clarity* | *some inconsistencies* |
+| 7–8 | *minor issues* | *minor inconsistencies* |
+| 9–10 | **clear and concise** | **no inconsistencies** |
+
+And C7-2 climbs a verb ladder: **identifies** (1–2) → **outlines** (3–4) → **describes** (5–6) → **explains** (7–8) → **explains all, clear and concise** (9–10).
+
+## Code → page lookup
+
+| Code | Indicator | Level | Skill | ✍️ | Page |
+|---|---|---|---|---|---|
+| C711 | C7-1 | 1–2 | identifies naming conventions | | [Naming Conventions](/sd/C07/Naming%20Conventions) |
+| C712 | C7-2 | 1–2 | identifies functioning | ✍️ | [Internal Documentation](/sd/C07/Internal%20Documentation) |
+| C713 | C7-3 | 1–2 | identifies input data for validation | | [Validation](/sd/C07/Validation%20Techniques) |
+| C721 | C7-1 | 3–4 | applies naming to variables | | [Naming Conventions](/sd/C07/Naming%20Conventions) |
+| C722 | C7-2 | 3–4 | outlines functioning | ✍️ | [Internal Documentation](/sd/C07/Internal%20Documentation) |
+| C723 | C7-3 | 3–4 | existence checking | | [Validation](/sd/C07/Validation%20Techniques) |
+| C724 | C7-3 | 3–4 | type checking | | [Validation](/sd/C07/Validation%20Techniques) |
+| C725 | C7-3 | 3–4 | range checking | | [Validation](/sd/C07/Validation%20Techniques) |
+| C731 | C7-1 | 5–6 | applies naming to interface controls | | [Naming Conventions](/sd/C07/Naming%20Conventions) |
+| C732 | C7-2 | 5–6 | describes functionality | ✍️ | [Internal Documentation](/sd/C07/Internal%20Documentation) |
+| C733 | C7-2 | 5–6 | describes use of data | ✍️ | [Internal Documentation](/sd/C07/Internal%20Documentation) |
+| C734 | C7-2 | 5–6 | evidence of code maintenance | ✍️ | [Internal Documentation](/sd/C07/Internal%20Documentation) |
+| C735 | C7-3 | 5–6 | two validation checks | | [Validation](/sd/C07/Validation%20Techniques) |
+| C741 | C7-1 | 7–8 | applies naming to code structures | | [Naming Conventions](/sd/C07/Naming%20Conventions) |
+| C742 | C7-2 | 7–8 | explains functionality | ✍️ | [Internal Documentation](/sd/C07/Internal%20Documentation) |
+| C743 | C7-2 | 7–8 | explains use of data | ✍️ | [Internal Documentation](/sd/C07/Internal%20Documentation) |
+| C744 | C7-2 | 7–8 | explains use of code structures | ✍️ | [Internal Documentation](/sd/C07/Internal%20Documentation) |
+| C745 | C7-3 | 7–8 | all three validation checks | | [Validation](/sd/C07/Validation%20Techniques) |
+| C751 | C7-1 | 9–10 | applies naming to ALL solution elements | | [Naming Conventions](/sd/C07/Naming%20Conventions) |
+| C752 | C7-2 | 9–10 | explains ALL, clear and concise | ✍️ | [Internal Documentation](/sd/C07/Internal%20Documentation) |
+| C753 | C7-3 | 9–10 | validates ALL input data, reasonableness and completeness | ✍️ | [Validation](/sd/C07/Validation%20Techniques) |
+
+## C6 → C7 synergy
+
+The reasoning comments C6 already asked for (C629/C638/C645/C658 — *why this type / structure / source*) are **also C7-2 evidence**: they describe and explain your use of data. Good internal documentation earns marks on both criteria at once.
+
+## Example code
+
+Snippets come from two places, and the pages keep both:
+
+- The **Myki fare app** domain (balance, fares, zones, concession, journeys) — minimal made-for-purpose examples.
+
+- **Real code from the projects studied in class**, attributed in the snippet's first comment line: `connect-go-dots`, `tile-matching-game` and `club-ladder` — whose comments and naming are the model this criterion asks for (club-ladder especially).
/dev/null .. sd/C07/Internal Documentation.md
@@ 0,0 1,157 @@
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C07-2026/C07-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
+# Internal Documentation — GDScript
+
+**Skill codes on this page — all nine are ✍️: written prose required, the label alone earns nothing.**
+
+| Code | Level | Skill |
+|---|---|---|
+| C712 ✍️ | 1–2 | identifies functioning |
+| C722 ✍️ | 3–4 | outlines functioning |
+| C732 ✍️ | 5–6 | describes functionality |
+| C733 ✍️ | 5–6 | describes use of data |
+| C734 ✍️ | 5–6 | evidence of code maintenance |
+| C742 ✍️ | 7–8 | explains functionality |
+| C743 ✍️ | 7–8 | explains use of data |
+| C744 ✍️ | 7–8 | explains use of code structures |
+| C752 ✍️ | 9–10 | explains ALL, clear and concise |
+
+**Definition.** *Internal documentation:* notes and code comments contained within source code that describe the code. This is the **heaviest indicator** — nine of C7's 21 codes, worth 40% of the criterion — and the whole ladder is a verb climb: **identifies → outlines → describes → explains**, with clarity qualifiers deciding the top bands (*some issues* 5–6 → *minor issues* 7–8 → *clear and concise* 9–10).
+
+**Godot mechanics:** `#` starts a comment; `##` starts a *doc comment* that Godot renders in the editor's help and hover tips — your documentation becomes real, browsable docs (GDScript's equivalent of Python's `pydoc`). Use `##` for file headers and function docs, `#` for inline notes.
+
+**In the validation** Part B you write the internal documentation for the picked feature **from scratch** on the comment-stripped copy — these patterns are what you'll be reproducing from memory.
+
+## C712 — Identify the functioning
+
+One written line naming what the program (or feature) does:
+
+```gdscript
+## C712 — Myki fare app: calculates fares by zone and tracks the card balance.
+```
+
+**Earns the tick:** a true sentence about *your* program's purpose. **Doesn't:** a label with no sentence.
+
+## C722 — Outline the functioning (header comment)
+
+**Definition.** *Header comment:* meaningful comments at the top of a source code file — the file's name, purpose, author and date.
+
+```gdscript
+## fare_calculator.gd — Myki fare app # C722 — header comment
+## Purpose: reads the zone, works out the fare (with the
+## concession discount), charges the card and updates the display.
+## Author: <you> Created: 2026-07-28
+```
+
+**Earns the tick:** a header that *outlines the flow* — a reader knows what happens in this file without scrolling. **In club-ladder** every script opens this way: `## The rules. Loads the season, records results, adds and removes teams, and saves after every change.` (`app.gd`).
+
+## C732 — Describe the functionality
+
+Level 5–6: each function documented with **what it does**:
+
+```gdscript
+# club-ladder — ladder.gd
+## Throw away the old rows and build one row per team, in ladder order. # C732
+func build(teams: Array[Team], win_value: int, draw_value: int) -> void:
+```
+
+**Earns the tick:** every function in the picked feature has a doc line that describes its job accurately.
+
+## C733 — Describe the use of data
+
+What each variable or structure **stores, and what it is used for**:
+
+```gdscript
+# tile-matching-game — card.gd
+## Cards with the same pair_id match each other. Two cards in a pair can show
+## completely different things — matching compares this id, not what is on screen.
+var pair_id := "" # C733 — describes what the data means, not just its type
+```
+
+```gdscript
+var balance: float = 20.00 # C733 — money left on the card, in dollars
+```
+
+**Synergy:** the *why-this-type* comments C6 asked for (C629/C638) are C733 evidence too — one comment, marks on both criteria.
+
+## C734 — Evidence of code maintenance
+
+Comments that record a **fix, change or lesson learned** — proof the code has been maintained, not written once:
+
+```gdscript
+# tile-matching-game — game.gd
+# The board may have been rebuilt while we were waiting. # C734 — records the bug this guards against
+if is_instance_valid(first_card):
+ first_card.flip_down()
+```
+
+```gdscript
+# board.gd
+# add_child() first so the card's @onready variables exist, # C734 — lesson learned, kept for the next reader
+# then fill in what it should show.
+```
+
+A dated changelog line also works: `# C734 — 2026-08-01 fixed: fare charged twice when touching on within 2s`.
+
+**Earns the tick:** a comment that could only exist because the code *changed* — a fixed bug, a guarded edge case, a recorded decision.
+
+## C742 / C743 / C744 — Explain (the why)
+
+Level 7–8 upgrades the verb: not *what*, but **why it works this way**.
+
+**C742 — explains functionality:**
+
+```gdscript
+# club-ladder — app.gd
+## Every change goes through here, so there is exactly one place that could # C742
+## forget to save — rather than one place per button.
+func refresh() -> void:
+```
+
+**C743 — explains use of data:**
+
+```gdscript
+# club-ladder — team.gd
+## Games played is worked out, not stored. If we stored it as well we would # C743
+## have two places to keep in step, and one day they would disagree.
+func played() -> int:
+ return wins + draws + losses
+```
+
+**C744 — explains use of code structures:**
+
+```gdscript
+# club-ladder — team.gd
+## Points are worked out too, but a Team cannot do it alone: what a win is # C744
+## worth is the competition's rule, not the team's. So the caller hands the rule in.
+func points(win_value: int, draw_value: int) -> int:
+```
+
+**Earns the tick:** the comment answers *why* — often by naming the alternative you rejected ("if we stored it as well…"). That move is exactly what separates 7–8 from 5–6.
+
+## C752 — Explain everything, clear and concise
+
+Level 9–10: the whole picked feature documented at explain level — **all** data, **all** code structures — with no noise:
+
+```gdscript
+age += 1 # add 1 to age ← noise: repeats the code
+age += 1 # C752 — birthday passed; drives the concession re-check below
+```
+
+**Earns the tick:** a stranger could maintain the feature from the comments alone, and nothing is written twice or said emptily. *Clear and concise* is the descriptor's own wording — cutting waffle is part of the standard.
+
+## Check Your Understanding
+
+1. What does ✍️ mean on a C7-2 code, and what happens if you label but write nothing?
+
+>| ### Answer
+>| Written evidence required — real prose in the comments. A label with no writing earns nothing on all nine C7-2 codes.
+
+2. Describe vs explain — what is the upgrade?
+
+>| ### Answer
+>| Describing says *what* it does or stores; explaining says *why* it works that way — often by naming the rejected alternative.
+
+3. Give one thing that counts as evidence of code maintenance (C734).
+
+>| ### Answer
+>| A comment recording a fix, a guarded edge case, or a lesson learned — e.g. "The board may have been rebuilt while we were waiting", or a dated fixed-bug line.
/dev/null .. sd/C07/Naming Conventions.md
@@ 0,0 1,145 @@
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C07-2026/C07-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
+# Naming Conventions — GDScript
+
+**Skill codes on this page**
+
+| Code | Level | Skill |
+|---|---|---|
+| C711 | 1–2 | identifies naming conventions |
+| C721 | 3–4 | applies naming to variables |
+| C731 | 5–6 | applies naming to interface controls |
+| C741 | 7–8 | applies naming to code structures |
+| C751 | 9–10 | applies naming to ALL solution elements |
+
+**Definition.** A *naming convention* is an agreed set of rules by which to name source code elements such as variables, functions, classes, methods and objects. (*Camel case:* each word after the first starts with a capital. *Snake case:* words joined with underscores. *Hungarian notation:* the name encodes purpose and type.)
+
+C7-1 is one ladder: each level applies the convention to **more kinds of element**. In the validation Part B naming audit you state your convention, then fix non-compliant names live.
+
+## The Godot house convention
+
+| Element | Convention | Example |
+|---|---|---|
+| Variables | `snake_case`, descriptive | `pairs_to_find`, `is_concession` |
+| Constants | `UPPER_SNAKE_CASE` | `DAILY_CAP` |
+| Functions | action-verb `snake_case` | `calculate_fare()` |
+| Classes (`class_name`) | `PascalCase` | `MykiCard` |
+| Nodes / interface controls | `PascalCase`, purpose + control type | `AddButton`, `BalanceLabel` |
+| Signals | `snake_case`, past tense | `fare_calculated` |
+| Files and scenes | `snake_case` | `team_row.gd`, `card.tscn` |
+
+This is the convention every studied project uses — and the one Godot's own style guide recommends.
+
+## C711 — Identify your convention
+
+Level 1–2 is **stating** the rules, in internal documentation, before applying them:
+
+```gdscript
+# C711 — naming conventions in this project:
+# variables and functions snake_case; constants UPPER_SNAKE_CASE;
+# classes and nodes PascalCase; signals snake_case, past tense
+```
+
+**Earns the tick:** the convention written down where the marker can find it. In the naming audit, this is the sentence you open with.
+
+## C721 — Variables
+
+Bad names hide meaning; the fix is descriptive `snake_case`:
+
+```gdscript
+# ✗ before — earns no C721: the names hide the meaning
+var b := 20.00 # what is b?
+var f := 5.30 # what is f?
+```
+
+```gdscript
+var balance: float = 20.00 # C721 — descriptive snake_case
+var fare: float = 5.30 # C721
+var is_concession := false # C721 — booleans read as yes/no questions
+```
+
+**In the studied projects:** `pairs_to_find`, `is_busy`, `flip_back_delay` (tile-matching-game); `points_for_win`, `team_name` (club-ladder). Every boolean starts `is_` — the name reads as the question the code asks.
+
+**Magic numbers are a naming problem too.** A bare `0.5` says nothing; a named constant says everything:
+
+```gdscript
+# ✗ before — magic number, earns no C721
+fare = FARE_TABLE[zone] * 0.5 # what is 0.5?
+```
+
+```gdscript
+const CONCESSION_DISCOUNT := 0.5 # C721 — the rule now has a name
+fare = FARE_TABLE[zone] * CONCESSION_DISCOUNT
+```
+
+**Earns the tick:** no single-letter names (a loop `i` is fine), booleans as `is_`/`has_` questions, magic numbers replaced by named constants.
+
+## C731 — Interface controls
+
+Name every Control node **purpose + control type**, in `PascalCase`:
+
+```text
+NameField (LineEdit) ← what it holds + what it is
+AddButton (Button)
+TitleLabel (Label)
+WarningLabel (Label)
+```
+
+Those four are club-ladder's real scene — the name tells you what the control does before you click it. The anti-pattern is Godot's defaults left in place: `Button1`, `LineEdit`, `Label2`.
+
+```gdscript
+# C731 — controls named purpose + type, so the code reads in English
+%AddButton.pressed.connect(_on_add_pressed)
+name_field.text = ""
+```
+
+**Earns the tick:** every control in the picked feature's scene named this way — the audit will open your scene tree and look.
+
+## C741 — Code structures
+
+Functions get **action verbs**; classes get **PascalCase nouns**:
+
+```gdscript
+# ✗ before — earns no C741: the name says nothing
+func f(x): # what does f do?
+```
+
+```gdscript
+func calculate_fare(zone: int) -> float: # C741 — verb says what it does
+```
+
+```gdscript
+class_name MykiCard # C741 — PascalCase noun, a clear concept
+```
+
+**In the studied projects:** `load_csv()`, `mark_matched()`, `start_new_game()` (tile-matching-game); `class_name Team`, `Season`, `Ladder` (club-ladder) — every function name is a verb phrase, every class a noun.
+
+## C751 — All solution elements
+
+Level 9–10 extends the convention to **everything that has a name**: signals, scenes, files, autoloads — consistently, throughout.
+
+```gdscript
+# club-ladder — the convention on every element kind
+signal result_recorded(team: Team, result: String) # C751 — signal: past tense
+signal remove_requested(team: Team) # C751
+# files: team_row.gd, season.gd — snake_case
+# scenes: main.tscn, team_row.tscn — snake_case
+```
+
+**Earns the tick:** open any file in the project and the convention holds — variables, constants, functions, classes, nodes, signals, files. One inconsistent corner (`studentName` beside `student_id`) drops you back.
+
+## Check Your Understanding
+
+1. What convention does a Godot node (interface control) use, and what two things should its name say?
+
+>| ### Answer
+>| `PascalCase`, saying purpose + control type — `AddButton`, `BalanceLabel`.
+
+2. Why is `fare * 0.5` a naming problem, and what is the fix?
+
+>| ### Answer
+>| `0.5` is a magic number — its meaning is invisible. Replace it with a named constant: `CONCESSION_DISCOUNT := 0.5`.
+
+3. What separates C751 from C741?
+
+>| ### Answer
+>| C741 covers code structures (functions and classes). C751 extends the convention to *every* named element — signals, scenes, files, autoloads — with no inconsistent corners anywhere.
/dev/null .. sd/C07/Validation Techniques.md
@@ 0,0 1,147 @@
+<!-- Generated from applied-computing-au vic/unit3-4/sat/C07-2026/C07-Reference-Godot by port-reference-godot-to-wiki.py — do not hand-edit; re-run the port. -->
+# Validation Techniques — GDScript
+
+**Skill codes on this page**
+
+| Code | Level | Skill |
+|---|---|---|
+| C713 | 1–2 | identifies input data for validation |
+| C723 | 3–4 | existence checking |
+| C724 | 3–4 | type checking |
+| C725 | 3–4 | range checking |
+| C735 | 5–6 | two of the three checks |
+| C745 | 7–8 | all three checks |
+| C753 ✍️ | 9–10 | ALL input data, plus reasonableness and completeness |
+
+**Definition.** *Validation* checks the reasonableness of data inputs, while the program runs. It is not testing (testing happens to the finished program; validation happens to every input, every run). The three named checks: **existence** (was anything entered?), **type** (is it the right kind of value?), **range** (is it within acceptable limits?).
+
+**This ladder is not a checklist.** The individual checks are separate codes only at level 3–4. Above that, single codes stand for the *combination*: C735 = two checks working, C745 = all three, C753 = all inputs plus reasonableness and completeness. Consistency qualifiers decide the band: *some inconsistencies* (5–6) → *minor* (7–8) → *none* (9–10).
+
+**In the validation** Part B you add existence/type/range checks to the picked feature's real inputs, label them as you go, and **run a test to show a check actually fires** — a validation that never catches a bad value is scenery.
+
+## C713 — Identify the inputs
+
+Level 1–2 is a written list of what needs validating:
+
+```gdscript
+# C713 — inputs to validate in this feature:
+# team name — NameField (LineEdit), free text
+# zone — ZoneSpinBox (SpinBox), whole number
+# top-up — TopUpField (LineEdit), dollars and cents
+```
+
+**Earns the tick:** every user-facing input of the picked feature named. (Choosing constrained controls — a SpinBox can't receive letters — is good design, but the codes below want checks *in code*.)
+
+## C723 — Existence check
+
+**Definition.** A test to see if a value has been entered as input or not.
+
+```gdscript
+# club-ladder — app.gd
+func add_team(raw_name: String) -> void:
+ var team_name := raw_name.strip_edges()
+ if team_name == "": # C723 — existence: nothing entered
+ message_label.text = "Type a team name first."
+ return
+```
+
+Note the real-world details worth copying: `strip_edges()` first (spaces are not a name), and an error message that says **what to do**, not just "invalid".
+
+## C724 — Type check
+
+**Definition.** A test to see if a value is of the specified data type or structure.
+
+GDScript's idioms — check *before* converting, or the conversion itself is the crash:
+
+```gdscript
+# C724 — type: is the text actually a number?
+if not $TopUpField.text.is_valid_float():
+ $MessageLabel.text = "Enter an amount in dollars, like 10.50"
+ return
+var amount := float($TopUpField.text)
+```
+
+`String.is_valid_int()` and `is_valid_float()` are the workhorses. The `is` keyword type-checks objects — real use in tile-matching-game: `if child is Card:` (`board.gd`).
+
+## C725 — Range check
+
+**Definition.** Tests to see if a value is within a given range of acceptable values.
+
+```gdscript
+# C725 — range: zones only run 1..3, amounts have a ceiling
+if zone < 1 or zone > MAX_ZONE:
+ $MessageLabel.text = "Zone must be 1 to %d" % MAX_ZONE
+ return
+if amount <= 0.0 or amount > MAX_TOP_UP:
+ $MessageLabel.text = "Top-up must be between $0.01 and $%.2f" % MAX_TOP_UP
+ return
+```
+
+The limits are **named constants** (`MAX_ZONE`, `MAX_TOP_UP`) — that's C7-1 working for C7-3. Clamping (`maxi(1, column_count)` in club-ladder's `board.gd`) is the accept-and-correct cousin of reject-and-message; for user input, prefer the message — silent correction hides the user's mistake from them.
+
+## C735 and C745 — The checks working together
+
+One validated input, all three checks, in the order that cannot crash — existence, then type, then range:
+
+```gdscript
+# C745 — full validation of the top-up amount (existence → type → range)
+func validate_top_up(raw: String) -> String:
+ var text := raw.strip_edges()
+ if text == "": # C723 — existence
+ return "Enter an amount first."
+ if not text.is_valid_float(): # C724 — type
+ return "Enter a number, like 10.50"
+ var amount := float(text)
+ if amount <= 0.0 or amount > MAX_TOP_UP: # C725 — range
+ return "Amount must be between $0.01 and $%.2f" % MAX_TOP_UP
+ return "" # empty string = valid
+```
+
+C735 (5–6) is two of these working on real inputs; C745 (7–8) is all three, with at most *minor* inconsistencies. **Error messages are part of the standard** — "Must be between 8 and 72 in length" beats "Invalid input" because it tells the user how to fix it (that Discord message was the class's best-in-show in the Validation Detective activity).
+
+## C753 — All inputs, plus reasonableness and completeness ✍️
+
+Level 9–10 widens the lens from single fields to the **whole data set**:
+
+- **All relevant inputs** validated — not just the easy one.
+
+- **Completeness** — is anything missing? Real example: `deck.gd` skips half-empty CSV rows with `if row.size() < 2: continue` (tile-matching-game).
+
+- **Reasonableness** — can these values be true *together*? The model is club-ladder's cross-check:
+
+```gdscript
+# club-ladder — app.gd
+## In a competition where teams play each other, one team's win is always # C753 ✍️
+## another's loss — so total wins must equal total losses. Worth saying on
+## screen rather than quietly showing figures that cannot be true.
+func totals_warning() -> String:
+ if total_wins == total_losses:
+ return ""
+ return "Check your data: %d wins recorded, but %d losses." % [total_wins, total_losses]
+```
+
+**Earns the tick:** every input covered, a completeness check on incoming records, at least one reasonableness rule that crosses fields — and (✍️) the rule *written down*: work out what rules **your** data has to obey, and say so in a comment.
+
+**Then prove it fires.** End the validation task by entering a bad value and showing the message appear — the package script asks for exactly this test run.
+
+## Check Your Understanding
+
+1. Name the three validation checks and their level 3–4 codes.
+
+>| ### Answer
+>| Existence C723, type C724, range C725.
+
+2. Why are C735 and C745 single codes rather than lists of checks?
+
+>| ### Answer
+>| Above level 3–4 the descriptor rewards the *combination* — two checks working (C735), then all three (C745) — with consistency qualifiers deciding the band.
+
+3. What makes "Must be between 8 and 72 in length" a better error message than "Invalid input"?
+
+>| ### Answer
+>| It tells the user exactly how to fix the problem — specific beats generic.
+
+4. Give an example of a reasonableness check (C753).
+
+>| ### Answer
+>| A cross-field rule — e.g. club-ladder's "total wins must equal total losses"; values that are individually fine but cannot be true together.
sd/VCE Software Development Hub.md ..
@@ 25,6 25,7 @@
- [C04 — Skills in Generating Design Ideas and Developing Evaluation Criteria](/sd/C04/C04-home)
- [C05 — Skills in Producing Detailed Designs](/sd/C05/C05-home)
- [C06 — Skills in Using the Features of the Programming Language](/sd/C06/C06-home)
+- [C07 — Skills in Developing the Software Solution](/sd/C07/C07-home)
## Tools
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9