The result of form input fields of type "file" will be in $_FILES, not in $_POST.
Since validation only works with posted data (or any array you pass to it), it can not validate those input fields.
You have to remove the 'image' field from the Validation definition, and have the Upload class validate the uploaded file.
This is a better flow:
if (Input::method() == 'POST') {
Upload::process($config);
if (Upload::is_valid()) {
Upload::save(0);
if (Upload::is_valid()) {
$val = Model_Category::validate('create');
if ($val->run()) {
$arr = Upload::get_files();
$category = Model_Category::forge(array(
'name' => Input::post('name'),
'description' => Input::post('description'),
'image' => $arr[0]['saved_as'],
'status' => 1,
));
} else {
Session::set_flash('error', $val->error());
}
} else {
// deal with the Upload errors, check Upload::get_errors()!
}
} else {
// deal with the Upload errors, check Upload::get_errors()!
}
}