I tried clearing Lessons 1 through 4 of the Kiro University Challenge

I tried clearing Lessons 1 through 4 of the Kiro University Challenge

This is a record of practicing Kiro's main features — Spec, Steering, Hooks, and Property-based testing (PBT) — through Lessons 1 to 4. It covers creating a task repository using the Kiro CLI and IDE, the files configured in each lesson, and preparations for the final submission.
2026.09.23

This page has been translated by machine translation. View original

Introduction

Kiro University Challenge, an online challenge to learn how to use Kiro in one week, is being held from September 21 to October 5, 2026.

https://kiro.dev/2026/university/terms/

You can earn credits by practicing Kiro's features in lesson format and submitting your work as a GitHub repository. The maximum credits you can earn is 5,250, which exceeds the credits included with Kiro Pro Max ($100/month · 5,000 credits).

This time, I decided to use Kiro to create a tool that sends notifications based on the AWS What's New RSS feed, and worked through Lessons 1–4 of the online challenge. Here I'll introduce the results of completing Lessons 1–4 (Spec, Steering, Hooks, PBT), which were publicly available at the time of writing, primarily using the Kiro CLI.

What is the Kiro University Challenge?

Participation is free, and credits are distributed for each lesson.

Target Credits
Lessons 1-3 250 each (max 750)
Lessons 4-5 500 each (max 1,000)
Lessons 6-7 1,000 each (max 2,000)
Bonus for completing all 7 required lessons 1,000
Bonus Lesson 1 (paid plan only) 250
Bonus Lesson 2 250
Maximum total 5,250

For details, please refer to the official AWS blog.

https://aws.amazon.com/jp/blogs/news/kiro-university-challenge/

Entry Preparation

Participation requirements are listed in the Terms on the official page. Japan is not included in the excluded regions, so you can enter if you meet the following conditions.

  • 18 years of age or older
  • Have a Kiro account
  • Have an X or LinkedIn account
  • The GitHub account used for participation must have been created at least 3 months ago
  • One entry per person, individual participation (team participation is not allowed)
  • Not residing in an excluded region (Japan is not included in the excluded regions)
  • AWS employees and their cohabitants/household members are not eligible

The submission requirements are as follows. Since the first commit must be dated after a specified time, it is safest to create the repository and make the first commit after the challenge begins.

  • Public GitHub repository (first commit dated September 21, 9:00 AM PT or later)
  • Include a .kiro folder
  • A demo video of 30 seconds to 3 minutes
  • A public post on X or LinkedIn with #KiroUniversity #BuildWithKiro
  • Submit via the entry form (opens September 25, deadline October 5 at 23:59 PT)

I created the repository using the gh CLI. Since it must be public, I specify --public.

gh repo create kiro-university-challenge-2026 \
  --public \
  --description "AWS What's New Notifier — built for Kiro University Challenge 2026 (Lessons 1-4)"

Here is the repository I created. The actual Spec, Steering, and Hooks files are stored there.

https://github.com/cm-suzuki-ryo/kiro-university-challenge-2026

Lesson 1: Spec-driven development

A Spec is a specification document that documents requirements before implementation, which Kiro reads and references to proceed with implementation. Requirements are written in EARS notation. This format uses WHEN for trigger conditions and THE SYSTEM SHALL for system behavior, with a one-to-one correspondence between conditions and behavior, making it usable as the basis for both implementation and testing. It can be written in either Japanese or English.

This time, I wrote the Spec using the AWS What's New RSS feed as the source. It summarizes requirements for RSS retrieval, classification, filtering, SNS notification, and dry run. Please refer to the repository for the full text.

https://github.com/cm-suzuki-ryo/kiro-university-challenge-2026/blob/main/.kiro/specs/filter-and-notify.md

This time, requirements written in Japanese were translated into English by Kiro and incorporated. Here is an excerpt from the filtering section.

Requirements written in Japanese:

除外カテゴリのルールに一致するアイテムは、スキップしてその理由をログに記録する

すべてのフィルタールールを通過したアイテムは、要約・通知の対象としてマークする

Result translated by Kiro:

WHEN an item matches an exclude_categories rule
THE SYSTEM SHALL skip the item and record the exclusion reason in the run log

WHEN an item passes all filter rules
THE SYSTEM SHALL mark it as eligible for summarization and notification

Kiro IDE で filter-and-notify.md の Spec を開いた画面

Lesson 2: Steering documents

Steering is a file that lets Kiro continuously read coding conventions you want to apply to the entire project. While Spec handles "what to build," Steering handles "how to write it."

I placed Python conventions in .kiro/steering/python-style.md. It is written in English. Including both good and bad examples makes it easier to keep generated code aligned with the conventions. Please refer to the repository for the full text.

https://github.com/cm-suzuki-ryo/kiro-university-challenge-2026/blob/main/.kiro/steering/python-style.md

Type hint rules written in Japanese:

すべての関数に型ヒントを付ける。戻り値が None の場合も `-> None` を明示する。

# Good
def fetch_rss(url: str, timeout: int = 30) -> str:
    ...

# Bad
def fetch_rss(url, timeout=30):
    ...

Result translated by Kiro:

Add type hints to every function. Always annotate `-> None` explicitly when a function returns nothing.

# Good
def fetch_rss(url: str, timeout: int = 30) -> str:
    ...

# Bad
def fetch_rss(url, timeout=30):
    ...

Lesson 3: Hooks

Hooks is a mechanism that executes commands triggered by events such as file operations. I configured two PostFileSave entries in .kiro/hooks/hooks.json. The matcher uses regular expressions — when a configuration file is saved, schema validation runs; when a Python file under src/ is saved, tests run.

{
  "version": "v1",
  "hooks": [
    {
      "name": "Validate filter config on save",
      "trigger": "PostFileSave",
      "matcher": "config/filter_config\\.yaml$",
      "action": {
        "type": "command",
        "command": "python3 -c \"\nimport yaml, sys\ntry:\n    with open('config/filter_config.yaml') as f:\n        cfg = yaml.safe_load(f)\n    required = ['exclude_categories', 'exclude_keywords', 'region_expansion', 'sns']\n    missing = [k for k in required if k not in cfg]\n    if missing:\n        print(f'ERROR: filter_config.yaml missing keys: {missing}', file=sys.stderr)\n        sys.exit(1)\n    print('OK: filter_config.yaml is valid')\nexcept yaml.YAMLError as e:\n    print(f'ERROR: YAML parse error: {e}', file=sys.stderr)\n    sys.exit(1)\n\""
      }
    },
    {
      "name": "Run tests on src/ save",
      "trigger": "PostFileSave",
      "matcher": "src/.*\\.py$",
      "action": {
        "type": "command",
        "command": "python3 -m pytest tests/ -q --tb=short 2>&1 | tail -20"
      }
    }
  ]
}

Kiro IDE で hooks.json を開いた画面

Lesson 4: Property-based testing

Property-based testing (PBT) differs from example-based testing, which lists individual inputs and expected values — instead, it automatically generates inputs to verify "properties that hold for any input." For processing like filtering where there are many combinations of inputs, it can automatically try combinations of inputs that were not anticipated.

This lesson can only be run in the Kiro IDE. I opened the repository I had been working on in CLI with the IDE, specified the Spec written in Lesson 1, and requested the generation of PBT tests.

Here are the results of running the generated tests.

tests/test_filter_properties.py::test_excluded_category_always_fails PASSED [ 20%]
tests/test_filter_properties.py::test_excluded_keyword_in_title_always_fails PASSED [ 40%]
tests/test_filter_properties.py::test_no_exclusion_always_passes PASSED  [ 60%]
tests/test_filter_properties.py::test_region_expansion_disabled_passes_region_announcements PASSED [ 80%]
tests/test_filter_properties.py::test_region_expansion_enabled_excludes_non_allow_region PASSED [100%]

5 passed in 0.32s

Kiro IDE で Property-based testing を生成・実行した画面

Toward the Final Assignment

The .kiro/ structure at the point of completing Lessons 1–4 is as follows. With this structure, you can prepare the .kiro folder required for submission.

.kiro/
├── hooks/
│   └── hooks.json
├── specs/
│   └── filter-and-notify.md
└── steering/
    └── python-style.md

Once you push including .kiro/ to the repository, the repository side is ready. The remaining submissions are the demo video and social media post. Lessons 5–7 are scheduled to be published on September 23–24, and I plan to address them after they are published.

At the time of writing (September 23), the entry form has not yet started accepting submissions, and it has been announced that submissions will open on September 25.

Summary

This is a hands-on online challenge where you can learn Kiro's Spec, Steering, Hooks, and PBT in practice.

It is said that required Lessons 1–7 can be completed with a free plan. Please use it as an opportunity to try out Kiro.

Even if you already use Kiro in your day-to-day development, participation requires almost no additional environment setup, and it seems like a good opportunity to engage with features you don't normally use much.

The submission deadline is October 6 at 15:59 (Japan Standard Time). If you have a GitHub account and an X account that meet the eligibility requirements, please consider participating.

Share this article

AWSのお困り事はクラスメソッドへ