I wanted to report wrong behavior of controller classes (template,rest and hybrid) not the abstract Controller class.
When you create a controller which is not derived from base controller class and try to reach url like http://localhost/mycontroller/notexistaction than it doesnt respond 404 action just tries render template.php and show content.
Also when you use template controller if you change default template view name, it doesnt work.
A controller always HAS to extend one of the available base controllers. A standard class does not work as a controller.
If your controller correctly extends one of the available base controller, the Request class will ALWAYS trigger an HttpNotFoundException when the requested method could not be found. The only exception is a controller that contains a router() method, if that exists it will always be called. If no method name is passed in the URI, it will default to 'index', but if action_index() does not exist, that too will result in a HttpNotFoundException.
The Controller_Template converts the defined template property (if a string) to a View object in the before() method of the controller. This is required, otherwise you can't assign anything to it. If you want to change it somewhere in the controller (which might be a sign of bad design) you need to manually assign the View, and not the string.
Neither of these are bugs, but by design. If you think otherwise, please provide code samples.
When i have bellow controller and template.php exist, if i try to reach http://localhost/sample/any than it doest give me 404 exception, just render the template.php and send output to browser with status 200. Controller_Template works as expected.