diff --git a/joj3_config_generator/convert.py b/joj3_config_generator/convert.py
index 08072a8..c9dd28a 100644
--- a/joj3_config_generator/convert.py
+++ b/joj3_config_generator/convert.py
@@ -1,4 +1,6 @@
 import os
+from datetime import datetime
+from pathlib import Path
 from typing import List
 
 from joj3_config_generator.models import joj1, repo, result, task
@@ -29,6 +31,11 @@ def convert(repo_conf: repo.Config, task_conf: task.Config) -> result.Config:
             if task_conf.release.end_time
             else -1
         ),
+        effective_unix_timestamp=(
+            int(task_conf.release.begin_time.timestamp())
+            if task_conf.release.begin_time
+            else -1
+        ),
         actor_csv_path="/home/tt/.config/joj/students.csv",  # students.csv position
         max_total_score=repo_conf.max_total_score,
         stage=result.Stage(
@@ -62,9 +69,11 @@ def convert(repo_conf: repo.Config, task_conf: task.Config) -> result.Config:
 def convert_joj1(joj1_conf: joj1.Config) -> task.Config:
     stages = [get_joj1_run_stage(joj1_conf)]
     return task.Config(
+        root=Path(""),
+        path=Path(""),
         task=task.Task(
             name=(""),
         ),
-        release=task.Release(end_time=None, begin_time=None),
+        release=task.Release(end_time=datetime.now(), begin_time=datetime.now()),
         stages=stages,
     )
diff --git a/joj3_config_generator/models/task.py b/joj3_config_generator/models/task.py
index b8d9810..c5dd1d9 100644
--- a/joj3_config_generator/models/task.py
+++ b/joj3_config_generator/models/task.py
@@ -1,6 +1,6 @@
 from datetime import datetime
 from pathlib import Path
-from typing import Any, Dict, List, Optional, Type
+from typing import Any, Dict, List, Type
 
 from pydantic import BaseModel, Field, field_validator, model_validator
 
@@ -13,48 +13,48 @@ from joj3_config_generator.models.const import (
 
 
 class ParserResultDetail(BaseModel):
-    time: Optional[bool] = True  # Display run time
-    mem: Optional[bool] = True  # Display memory usage
-    stdout: Optional[bool] = False  # Display stdout messages
-    stderr: Optional[bool] = False  # Display stderr messages
-    exitstatus: Optional[bool] = False
+    time: bool = True  # Display run time
+    mem: bool = True  # Display memory usage
+    stdout: bool = False  # Display stdout messages
+    stderr: bool = False  # Display stderr messages
+    exitstatus: bool = False
 
 
 class ParserFile(BaseModel):
-    name: Optional[str] = None
+    name: str = ""
 
 
 class ParserLog(BaseModel):
-    fileName: Optional[str] = None
-    msg: Optional[str] = None
-    level: Optional[str] = None
+    file_name: str = Field("", alias="fileName")
+    msg: str = ""
+    level: str = ""
 
 
 class ParserDummy(BaseModel):
-    comment: Optional[str] = ""
-    score: Optional[int] = 0
-    forcequit: Optional[bool] = False
+    comment: str = ""
+    score: int = 0
+    forcequit: bool = False
 
 
 class ParserKeyword(BaseModel):
-    keyword: Optional[List[str]] = []
-    weight: Optional[List[int]] = []
+    keyword: List[str] = []
+    weight: List[int] = []
 
 
 class Outputs(BaseModel):
-    score: Optional[int] = 0
-    ignorespaces: Optional[bool] = True
-    hide: Optional[bool] = False
-    forcequit: Optional[bool] = False
+    score: int = 0
+    ignorespaces: bool = True
+    hide: bool = False
+    forcequit: bool = False
 
 
 class ParserDiff(BaseModel):
-    output: Optional[Outputs] = Outputs()
+    output: Outputs = Outputs()
 
 
 class Files(BaseModel):
-    import_: Optional[List[str]] = Field([], alias="import")
-    export: Optional[List[str]] = []
+    import_: List[str] = Field([], alias="import")
+    export: List[str] = []
 
 
 class Limit(BaseModel):
@@ -75,30 +75,30 @@ class Limit(BaseModel):
 
 
 class Stage(BaseModel):
-    name: Optional[str] = None  # Stage name
-    env: Optional[List[str]] = None
-    command: Optional[str] = None  # Command to run
-    files: Optional[Files] = None
-    in_: Optional[str] = Field(None, alias="in")
-    out_: Optional[str] = Field(None, alias="out")
-    score: Optional[int] = 0
-    parsers: Optional[List[str]] = []  # list of parsers
+    name: str = ""  # Stage name
+    env: List[str] = []
+    command: str = ""  # Command to run
+    files: Files = Files()
+    in_: str = Field("", alias="in")
+    out_: str = Field("", alias="out")
+    score: int = 0
+    parsers: List[str] = []  # list of parsers
     limit: Limit = Limit()
-    dummy: Optional[ParserDummy] = ParserDummy()
-    result_status: Optional[ParserDummy] = Field(ParserDummy(), alias="result-status")
-    keyword: Optional[ParserKeyword] = ParserKeyword()
-    clangtidy: Optional[ParserKeyword] = ParserKeyword()
-    cppcheck: Optional[ParserKeyword] = ParserKeyword()
-    cpplint: Optional[ParserKeyword] = ParserKeyword()
-    result_detail: Optional[ParserResultDetail] = Field(
+    dummy: ParserDummy = ParserDummy()
+    result_status: ParserDummy = Field(ParserDummy(), alias="result-status")
+    keyword: ParserKeyword = ParserKeyword()
+    clangtidy: ParserKeyword = ParserKeyword()
+    cppcheck: ParserKeyword = ParserKeyword()
+    cpplint: ParserKeyword = ParserKeyword()
+    result_detail: ParserResultDetail = Field(
         ParserResultDetail(), alias="result-detail"
     )
-    file: Optional[ParserFile] = ParserFile()
-    skip: Optional[List[str]] = []
+    file: ParserFile = ParserFile()
+    skip: List[str] = []
 
     # cases related
-    cases: Optional[Dict[str, "Stage"]] = None
-    diff: Optional[ParserDiff] = ParserDiff()
+    cases: Dict[str, "Stage"] = {}
+    diff: ParserDiff = ParserDiff()
 
     model_config = {"extra": "allow"}
 
@@ -113,20 +113,18 @@ class Stage(BaseModel):
 
 
 class Release(BaseModel):
-    end_time: Optional[datetime] = None  # RFC 3339 formatted date-time with offset
-    begin_time: Optional[datetime] = None
+    end_time: datetime = datetime.now()  # RFC 3339 formatted date-time with offset
+    begin_time: datetime = datetime.now()  # RFC 3339 formatted date-time with offset
 
 
 class Task(BaseModel):
-    type_: Optional[str] = Field(
-        "", serialization_alias="type", validation_alias="type"
-    )
+    type_: str = Field("", serialization_alias="type", validation_alias="type")
     name: str
 
 
 class Config(BaseModel):
-    root: Optional[Path] = None
-    path: Optional[Path] = None
+    root: Path = Path(".")
+    path: Path = Path("task.toml")
     task: Task  # Task name (e.g., hw3 ex5)
     release: Release  # Release configuration
     stages: List[Stage]  # list of stage configurations
diff --git a/joj3_config_generator/processers/joj1.py b/joj3_config_generator/processers/joj1.py
index 5c21549..5eeffc3 100644
--- a/joj3_config_generator/processers/joj1.py
+++ b/joj3_config_generator/processers/joj1.py
@@ -9,7 +9,7 @@ def get_joj1_run_stage(joj1_config: joj1.Config) -> task.Stage:
         cases_conf.append(
             task.Stage(
                 score=case.score,
-                command=case.execute_args if case.execute_args else None,
+                command=case.execute_args if case.execute_args else "",
                 limit=task.Limit(
                     cpu=Time(case.time) if case.time else DEFAULT_CPU_LIMIT,
                     mem=(Memory(case.memory) if case.memory else DEFAULT_MEMORY_LIMIT),
diff --git a/joj3_config_generator/processers/task.py b/joj3_config_generator/processers/task.py
index c02b261..2c8567b 100644
--- a/joj3_config_generator/processers/task.py
+++ b/joj3_config_generator/processers/task.py
@@ -207,8 +207,8 @@ def fix_diff(
             clock_limit = 2 * case_stage.limit.cpu
             memory_limit = case_stage.limit.mem
             command = case_stage.command if case_stage.command is not None else None
-            stdin = case_stage.in_ if case_stage.in_ is not None else f"{case}.in"
-            stdout = case_stage.out_ if case_stage.out_ is not None else f"{case}.out"
+            stdin = case_stage.in_ if case_stage.in_ != "" else f"{case}.in"
+            stdout = case_stage.out_ if case_stage.out_ != "" else f"{case}.out"
 
             stage_cases.append(
                 result.OptionalCmd(
diff --git a/tests/convert/basic/task.json b/tests/convert/basic/task.json
index 8adf8e1..5fdb6e1 100644
--- a/tests/convert/basic/task.json
+++ b/tests/convert/basic/task.json
@@ -1,8 +1,8 @@
 {
     "name": "hw7 ex2",
     "logPath": "/home/tt/.cache/joj3/homework/h7/e2.log",
-    "expireUnixTimestamp": -1,
-    "effectiveUnixTimestamp": -1,
+    "expireUnixTimestamp": 1735574399,
+    "effectiveUnixTimestamp": 1735487999,
     "actorCsvPath": "/home/tt/.config/joj/students.csv",
     "maxTotalScore": 100,
     "stage": {
@@ -660,6 +660,7 @@
                         },
                         "cases": [
                             {
+                                "args": [],
                                 "stdin": {
                                     "src": "/home/tt/.config/joj/homework/h7/e2/case0.in"
                                 },
@@ -669,6 +670,7 @@
                                 "procLimit": 50
                             },
                             {
+                                "args": [],
                                 "stdin": {
                                     "src": "/home/tt/.config/joj/homework/h7/e2/case1.in"
                                 },
diff --git a/tests/convert/basic/task.toml b/tests/convert/basic/task.toml
index 60d0afa..6c6bf48 100644
--- a/tests/convert/basic/task.toml
+++ b/tests/convert/basic/task.toml
@@ -2,7 +2,7 @@
 task.name = "hw7 ex2" # task name
 task.type = "homework/h7/e2" # remove this task type later
 
-release.deadline = 2024-12-30 23:59:59+08:00
+release.end_time = 2024-12-30 23:59:59+08:00
 release.begin_time = 2024-12-29 23:59:59+08:00
 
 [[stages]]
diff --git a/tests/convert/clang-tidy/task.json b/tests/convert/clang-tidy/task.json
index 71b22f4..84d7f72 100644
--- a/tests/convert/clang-tidy/task.json
+++ b/tests/convert/clang-tidy/task.json
@@ -1,8 +1,8 @@
 {
     "name": "hw7 ex2",
     "logPath": "/home/tt/.cache/joj3/homework/h7/e2.log",
-    "expireUnixTimestamp": -1,
-    "effectiveUnixTimestamp": -1,
+    "expireUnixTimestamp": 1735574399,
+    "effectiveUnixTimestamp": 1735487999,
     "actorCsvPath": "/home/tt/.config/joj/students.csv",
     "maxTotalScore": 100,
     "stage": {
diff --git a/tests/convert/clang-tidy/task.toml b/tests/convert/clang-tidy/task.toml
index 9371465..3985ed9 100644
--- a/tests/convert/clang-tidy/task.toml
+++ b/tests/convert/clang-tidy/task.toml
@@ -2,7 +2,7 @@
 task.name = "hw7 ex2" # task name
 task.type = "homework/h7/e2" # remove this task type later
 
-release.deadline = 2024-12-30 23:59:59+08:00
+release.end_time = 2024-12-30 23:59:59+08:00
 release.begin_time = 2024-12-29 23:59:59+08:00
 
 [[stages]]
diff --git a/tests/convert/cppcheck/task.json b/tests/convert/cppcheck/task.json
index 9a08ae9..0171aac 100644
--- a/tests/convert/cppcheck/task.json
+++ b/tests/convert/cppcheck/task.json
@@ -1,8 +1,8 @@
 {
     "name": "hw7 ex2",
     "logPath": "/home/tt/.cache/joj3/homework/h7/e2.log",
-    "expireUnixTimestamp": -1,
-    "effectiveUnixTimestamp": -1,
+    "expireUnixTimestamp": 1735574399,
+    "effectiveUnixTimestamp": 1735487999,
     "actorCsvPath": "/home/tt/.config/joj/students.csv",
     "maxTotalScore": 100,
     "stage": {
diff --git a/tests/convert/cppcheck/task.toml b/tests/convert/cppcheck/task.toml
index 9113d79..5d1f74b 100644
--- a/tests/convert/cppcheck/task.toml
+++ b/tests/convert/cppcheck/task.toml
@@ -2,7 +2,7 @@
 task.name = "hw7 ex2" # task name
 task.type = "homework/h7/e2" # remove this task type later
 
-release.deadline = 2024-12-30 23:59:59+08:00
+release.end_time = 2024-12-30 23:59:59+08:00
 release.begin_time = 2024-12-29 23:59:59+08:00
 
 [[stages]]
diff --git a/tests/convert/cpplint/task.json b/tests/convert/cpplint/task.json
index 51139c0..75c5a92 100644
--- a/tests/convert/cpplint/task.json
+++ b/tests/convert/cpplint/task.json
@@ -1,8 +1,8 @@
 {
     "name": "hw7 ex2",
     "logPath": "/home/tt/.cache/joj3/homework/h7/e2.log",
-    "expireUnixTimestamp": -1,
-    "effectiveUnixTimestamp": -1,
+    "expireUnixTimestamp": 1735574399,
+    "effectiveUnixTimestamp": 1735487999,
     "actorCsvPath": "/home/tt/.config/joj/students.csv",
     "maxTotalScore": 100,
     "stage": {
diff --git a/tests/convert/cpplint/task.toml b/tests/convert/cpplint/task.toml
index 0f0cca5..2e04eb5 100644
--- a/tests/convert/cpplint/task.toml
+++ b/tests/convert/cpplint/task.toml
@@ -2,7 +2,7 @@
 task.name = "hw7 ex2" # task name
 task.type = "homework/h7/e2" # remove this task type later
 
-release.deadline = 2024-12-30 23:59:59+08:00
+release.end_time = 2024-12-30 23:59:59+08:00
 release.begin_time = 2024-12-29 23:59:59+08:00
 
 [[stages]]
diff --git a/tests/convert/diff/task.json b/tests/convert/diff/task.json
index a807cdf..2c8b925 100644
--- a/tests/convert/diff/task.json
+++ b/tests/convert/diff/task.json
@@ -1,8 +1,8 @@
 {
     "name": "hw7 ex2",
     "logPath": "/home/tt/.cache/joj3/homework/h7/e2.log",
-    "expireUnixTimestamp": -1,
-    "effectiveUnixTimestamp": -1,
+    "expireUnixTimestamp": 1735574399,
+    "effectiveUnixTimestamp": 1735487999,
     "actorCsvPath": "/home/tt/.config/joj/students.csv",
     "maxTotalScore": 100,
     "stage": {
@@ -63,6 +63,7 @@
                         },
                         "cases": [
                             {
+                                "args": [],
                                 "stdin": {
                                     "src": "/home/tt/.config/joj/homework/h7/e2/case0.in"
                                 },
@@ -72,6 +73,7 @@
                                 "procLimit": 50
                             },
                             {
+                                "args": [],
                                 "stdin": {
                                     "src": "/home/tt/.config/joj/homework/h7/e2/case1.in"
                                 },
diff --git a/tests/convert/diff/task.toml b/tests/convert/diff/task.toml
index cd22e2e..a81f363 100644
--- a/tests/convert/diff/task.toml
+++ b/tests/convert/diff/task.toml
@@ -2,7 +2,7 @@
 task.name = "hw7 ex2" # task name
 task.type = "homework/h7/e2" # remove this task type later
 
-release.deadline = 2024-12-30 23:59:59+08:00
+release.end_time = 2024-12-30 23:59:59+08:00
 release.begin_time = 2024-12-29 23:59:59+08:00
 
 [[stages]]
diff --git a/tests/convert/keyword/task.json b/tests/convert/keyword/task.json
index 6c5725e..dfbd28e 100644
--- a/tests/convert/keyword/task.json
+++ b/tests/convert/keyword/task.json
@@ -1,8 +1,8 @@
 {
     "name": "hw7 ex2",
     "logPath": "/home/tt/.cache/joj3/homework/h7/e2.log",
-    "expireUnixTimestamp": -1,
-    "effectiveUnixTimestamp": -1,
+    "expireUnixTimestamp": 1735574399,
+    "effectiveUnixTimestamp": 1735487999,
     "actorCsvPath": "/home/tt/.config/joj/students.csv",
     "maxTotalScore": 100,
     "stage": {
diff --git a/tests/convert/keyword/task.toml b/tests/convert/keyword/task.toml
index d0e810a..12302b1 100644
--- a/tests/convert/keyword/task.toml
+++ b/tests/convert/keyword/task.toml
@@ -2,7 +2,7 @@
 task.name = "hw7 ex2" # task name
 task.type = "homework/h7/e2" # remove this task type later
 
-release.deadline = 2024-12-30 23:59:59+08:00
+release.end_time = 2024-12-30 23:59:59+08:00
 release.begin_time = 2024-12-29 23:59:59+08:00
 
 [[stages]]